PHP 应用 ImageMagick

ImageMagick是什么?

ImageMagick是一款功能强大、跨平台的图像处理软件。它可以读取、转换和输出大量的图片格式,支持各种各样的图像处理操作,如调整大小、旋转、加水印、格式转换等。在PHP中使用ImageMagick,可以让我们在web应用中轻松实现复杂的图像处理功能。

博主的项目用的ImageMagick 6.9.10-68,最新版本是ImageMagick 7.1.1-41,有需要的可以去官网下载使用。

安装ImageMagick

在Linux系统中安装

bash 复制代码
sudo apt-get install imagemagick  # Ubuntu/Debian
sudo yum install ImageMagick  # CentOS/RHEL

验证安装

bash 复制代码
convert --version

结果如下图:

PHP扩展

Imagick 扩展

**推荐使用 Imagick 扩展,它提供了更高级的接口和性能。**在编译 PHP 时,加入 --with-imagick 选项,然后在 php.ini 中启用。

extension=imagick.so

如果你用宝塔搭建的网站,在软件商店中找到网站对应的PHP版本,点开设置->安装扩展->imagemagick,点击安装。如下图:

exec 函数

如果没有安装 Imagick 扩展,也可以通过 exec 函数直接调用 ImageMagick 的命令行工具。

宝塔用户记得在上图禁用函数列表删除exec函数。

示例

exec 函数示例

在 ThinkPHP6 项目中创建一个类,用于封装 ImageMagick 的操作:

php 复制代码
namespace app\common\library;

class Image
{
    public function thumb($image, $width, $height, $savePath)
    {
        exec('convert ' . $image . ' -resize ' . $width . 'x' . $height . ' ' . $savePath);
    }
}

在控制器中使用

php 复制代码
namespace app\controller;

use think\Controller;
use app\common\library\Image;

class Index extends Controller
{
    public function index()
    {
        $image = 'public/uploads/original.jpg';
        $savePath = 'public/uploads/thumb.jpg';
        $width = 200;
        $height = 200;

        $image = new Image();
        $image->thumb($image, $width, $height, $savePath);

        return '缩略图生成成功!';
    }
}

Imagick 扩展示例

php 复制代码
<?php
use Intervention\Image\ImageManagerStatic as Image;

class Upload
{
    // 上传图片
    public function image()
    {
        $file = request()->file($param["file"]);
        //获取上传缓存文件
        $tmp_name = $file->getPathname();
        //文件原名
        $original_name = $file->getOriginalName();
        $file_path = "/images/".date("Ymd"). '/';
        if (!$this->checkPath($file_path)) {
            return $this->error('', "directory {$path} creation failed");
        }
        $new_name = date('Ymdhis', time()).mt_rand(100000, 999999);
        $file_name = $file_path.$new_name;
        //原图保存
        $new_file = $file_name . "." . $extend_name;
        $image = Image::make($tmp_name);
        $width = $image->width();//图片宽
        $height = $image->height();//图片高
        try {
            $image->save($file);
            $data = [
                "pic_path" => $new_file
                "pic_name" => $original_name,
                "file_ext" => $extend_name,
                "pic_spec" => $width . "*" . $height,
                "update_time" => time(),
            ];
            return $this->success($data);
        } catch (\Exception $e) {
            return $this->error('', $e->getMessage());
        }
    }

    // 验证目录是否可写
    public function checkPath($path)
    {
        if (is_dir($path) || mkdirs($path, 0755)) {
            return true;
        }

        return false;
    }
}

踩坑

使用imagick扩展保存GIF格式的图片时,可能会使图片变为静态图,所以建议tp自带的图片上传。

GIF图片压缩:

php 复制代码
\think\facade\Filesystem::disk('public')->putFileAs('', $file_obj, $file_path);
$command = "convert {$file_path} -coalesce -layers optimize -quality 10 -colors 16 {$file_path}";
exec($command, $output,$returnVar);
  • **-coalesce:**将动画分解为帧,确保动画信息完整。
  • **-layers Optimize:**优化图层,但保留动画信息。
  • **-colors:**减少颜色数,但过少会影响图像质量
  • -quality 80: 设置输出图片的质量,数值越小,压缩率越高

提示

Imagick 扩展是使用 ImageMagick 的首选方式,它提供了更高级的接口和更好的性能。

安全 是第一位的,在使用exec函数时一定要注意参数过滤。

性能优化对于大批量图片处理非常重要,可以考虑使用异步任务或分布式处理。

总结

通过将 ImageMagick 集成到 ThinkPHP6 项目中,可以轻松实现各种图像处理功能,为你的应用增添更多的可能性。无论是生成缩略图、添加水印,还是进行复杂的图像处理,ImageMagick 都能提供强大的支持。

ImageMagick 官方文档:https://imagemagick.org/

Imagick 扩展文档:https://www.php.net/manual/en/book.imagick.php

ThinkPHP6 官方文档:https://www.thinkphp.cn/

相关推荐
沐知全栈开发16 分钟前
MongoDB 创建数据库
开发语言
ErizJ35 分钟前
Golang | 迭代器模式
开发语言·golang·迭代器模式
牙痛不能吃糖,哭38 分钟前
C++面试复习日记(8)2025.4.25,malloc,free和new,delete的区别
开发语言·c++
健康的猪42 分钟前
golang的cgo的一点小心得
开发语言·后端·golang
夜夜敲码1 小时前
C语言教程(十六): C 语言字符串详解
c语言·开发语言
豆豆1 小时前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
宋康1 小时前
C语言结构体和union内存对齐
c语言·开发语言
居然是阿宋1 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
Cao1234567893212 小时前
简易学生成绩管理系统(C语言)
c语言·开发语言
The Future is mine2 小时前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#