PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > 工作总结

php封装的图片(缩略图)处理类完整实例

管理员 2025-03-18
工作总结
63

在 PHP 中,处理图片(如生成缩略图)是常见的需求。以下是一个完整的图片处理类封装实例,支持生成缩略图、调整图片大小、添加水印等功能。


1. 图片处理类

示例代码

php
复制
<?phpclass ImageProcessor {
    private $image;      // 图片资源
    private $imageType;  // 图片类型

    /**
     * 加载图片
     *
     * @param string $file 图片文件路径
     */
    public function load($file) {
        if (!file_exists($file)) {
            throw new Exception("图片文件不存在: $file");
        }

        $info = getimagesize($file);
        $this->imageType = $info[2];

        switch ($this->imageType) {
            case IMAGETYPE_JPEG:
                $this->image = imagecreatefromjpeg($file);
                break;
            case IMAGETYPE_PNG:
                $this->image = imagecreatefrompng($file);
                break;
            case IMAGETYPE_GIF:
                $this->image = imagecreatefromgif($file);
                break;
            default:
                throw new Exception("不支持的图片类型: $file");
        }
    }

    /**
     * 保存图片
     *
     * @param string $file 保存路径
     * @param int $quality 图片质量(仅适用于 JPEG)
     */
    public function save($file, $quality = 90) {
        switch ($this->imageType) {
            case IMAGETYPE_JPEG:
                imagejpeg($this->image, $file, $quality);
                break;
            case IMAGETYPE_PNG:
                imagepng($this->image, $file);
                break;
            case IMAGETYPE_GIF:
                imagegif($this->image, $file);
                break;
            default:
                throw new Exception("不支持的图片类型");
        }
    }

    /**
     * 调整图片大小
     *
     * @param int $width 目标宽度
     * @param int $height 目标高度
     * @param bool $crop 是否裁剪图片
     */
    public function resize($width, $height, $crop = false) {
        $srcWidth = imagesx($this->image);
        $srcHeight = imagesy($this->image);

        if ($crop) {
            // 裁剪模式
            $ratio = max($width / $srcWidth, $height / $srcHeight);
            $newWidth = $srcWidth * $ratio;
            $newHeight = $srcHeight * $ratio;

            $tmpImage = imagecreatetruecolor($width, $height);
            imagecopyresampled($tmpImage, $this->image, 0, 0, ($newWidth - $width) / 2, ($newHeight - $height) / 2, $width, $height, $width, $height);
        } else {
            // 非裁剪模式
            $ratio = min($width / $srcWidth, $height / $srcHeight);
            $newWidth = $srcWidth * $ratio;
            $newHeight = $srcHeight * $ratio;

            $tmpImage = imagecreatetruecolor($newWidth, $newHeight);
            imagecopyresampled($tmpImage, $this->image, 0, 0, 0, 0, $newWidth, $newHeight, $srcWidth, $srcHeight);
        }

        $this->image = $tmpImage;
    }

    /**
     * 添加水印
     *
     * @param string $watermarkFile 水印图片路径
     * @param string $position 水印位置(top-left, top-right, bottom-left, bottom-right, center)
     * @param int $margin 水印边距
     */
    public function addWatermark($watermarkFile, $position = 'bottom-right', $margin = 10) {
        if (!file_exists($watermarkFile)) {
            throw new Exception("水印图片不存在: $watermarkFile");
        }

        $watermark = imagecreatefrompng($watermarkFile);
        $watermarkWidth = imagesx($watermark);
        $watermarkHeight = imagesy($watermark);

        $imageWidth = imagesx($this->image);
        $imageHeight = imagesy($this->image);

        switch ($position) {
            case 'top-left':
                $x = $margin;
                $y = $margin;
                break;
            case 'top-right':
                $x = $imageWidth - $watermarkWidth - $margin;
                $y = $margin;
                break;
            case 'bottom-left':
                $x = $margin;
                $y = $imageHeight - $watermarkHeight - $margin;
                break;
            case 'bottom-right':
                $x = $imageWidth - $watermarkWidth - $margin;
                $y = $imageHeight - $watermarkHeight - $margin;
                break;
            case 'center':
                $x = ($imageWidth - $watermarkWidth) / 2;
                $y = ($imageHeight - $watermarkHeight) / 2;
                break;
            default:
                throw new Exception("无效的水印位置: $position");
        }

        imagecopy($this->image, $watermark, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight);
        imagedestroy($watermark);
    }

    /**
     * 释放图片资源
     */
    public function __destruct() {
        if ($this->image) {
            imagedestroy($this->image);
        }
    }}// 示例用法try {
    // 创建图片处理对象
    $processor = new ImageProcessor();

    // 加载图片
    $processor->load('input.jpg');

    // 生成缩略图
    $processor->resize(200, 200, true);

    // 添加水印
    $processor->addWatermark('watermark.png', 'bottom-right');

    // 保存图片
    $processor->save('output.jpg');} catch (Exception $e) {
    echo "错误: " . $e->getMessage();}?>

2. 代码说明

  1. ImageProcessor 类

    • load():加载图片文件。

    • save():保存图片文件。

    • resize():调整图片大小,支持裁剪模式。

    • addWatermark():添加水印,支持多种位置。

    • __destruct():释放图片资源。

  2. 图片处理功能

    • 支持 JPEG、PNG、GIF 格式的图片。

    • 支持生成缩略图,并可选是否裁剪。

    • 支持添加水印,水印位置可自定义。

  3. 异常处理

    • 使用 try-catch 捕获异常,确保代码健壮性。


3. 使用步骤

  1. 加载图片

    • 调用 $processor->load('input.jpg') 加载图片文件。

  2. 调整图片大小

    • 调用 $processor->resize(200, 200, true) 生成缩略图。

  3. 添加水印

    • 调用 $processor->addWatermark('watermark.png', 'bottom-right') 添加水印。

  4. 保存图片

    • 调用 $processor->save('output.jpg') 保存处理后的图片。


4. 注意事项

  1. 图片格式

    • 支持 JPEG、PNG、GIF 格式的图片。

    • 水印图片必须是 PNG 格式,支持透明背景。

  2. 性能优化

    • 对于大图片,调整大小和添加水印可能会消耗较多内存,建议对图片进行压缩或分块处理。

  3. 水印位置

    • 水印位置支持 top-lefttop-rightbottom-leftbottom-right 和 center

  4. 异常处理

    • 确保捕获并处理异常,避免程序崩溃。


5. 总结

功能说明
加载图片支持 JPEG、PNG、GIF 格式
调整图片大小支持裁剪模式
添加水印支持多种位置
保存图片支持 JPEG、PNG、GIF 格式

通过封装图片处理类,可以方便地在 PHP 项目中实现图片处理功能,如生成缩略图、添加水印等。



本文关键词: php 装的 图片 略图 处理 完整

希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部