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/

相关推荐
BingoGo19 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack19 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1233 天前
matlab画图工具
开发语言·matlab
dustcell.3 天前
haproxy七层代理
java·开发语言·前端
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc