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/

相关推荐
豆沙沙包?18 分钟前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头38 分钟前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu1 小时前
java内存模型JMM
java·开发语言
我很好我还能学2 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
蓝婷儿3 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
渣渣盟3 小时前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
糯米导航3 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计
糯米导航3 小时前
Java毕业设计:WML信息查询与后端信息发布系统开发
java·开发语言·课程设计
MessiGo4 小时前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式
大霞上仙4 小时前
nonlocal 与global关键字
开发语言·python