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

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

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

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

在 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 项目中实现图片处理功能,如生成缩略图、添加水印等。




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

相关推荐

扫码关注

qrcode

QQ交谈

回顶部