PHP 应用 ImageMagick

ImageMagick是什么?

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

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

安装ImageMagick

在Linux系统中安装

sudo apt-get install imagemagick  # Ubuntu/Debian
sudo yum install ImageMagick  # CentOS/RHEL

验证安装

convert --version

结果如下图:

PHP扩展

Imagick 扩展

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

extension=imagick.so

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

exec 函数

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

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

示例

exec 函数示例

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

namespace app\common\library;

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

在控制器中使用

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
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图片压缩:

\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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV圆形标定板检测算法findGrid原理详解

OpenCV的findGrid函数检测圆形标定板的流程如下: class CirclesGridClusterFinder {CirclesGridClusterFinder(const CirclesGridClusterFinder&); public:CirclesGridClusterFinder

阿里云服务器手动搭建WordPress【官方文档注意事项】

这是官方文档 注意事项 先配LNMP&#xff0c;我的上一篇文章到这里发现&#xff0c;没有基于ubuntu的教程&#xff0c;所以创建服务器时选择centos在官方文档第四步“下载WordPress&#xff0c;并移动至网站根目录”中&#xff0c;首先它让cd /usr/share/nginx/html&#xff…

vue运行项目时local有显示 但是network却显示unavailable

问题描述 日常开发中 和后端本地调试时 后端需要使用你的本地去访问页面 可运行项目时会出现network显示unavailable的情况 解决方式 1.其实这只是vue脚手架对于ip地址获取的方式兼容上有一些问题 但其实是不影响ip访问本地的 你可以直接cmd内ipconfig去查看自己的ip然后…

Go项目-----Kubernetes使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言基本概念kubectl工具部署web服务生成镜像编写deployment 编写service启动服务 k8s部署mysql编写pvc编写pv编写service 部署redis集成部署mysql和redis 前言 这…

SpringCloud无介绍快使用,sentinel注解@SentinelResource的基本使用(二十三)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao默认安装ngi…

紫光展锐5G融云方案,开启云终端新时代

近年来&#xff0c;云终端凭借便捷、高效、高性价比的优势正逐步在各行各业渗透。研究机构IDC的数据显示&#xff0c;2024上半年&#xff0c;中国云终端市场总体出货量达到166.3万台&#xff0c;同比增长22.4%&#xff0c;销售额29亿元人民币&#xff0c;同比增长24.9%&#xf…

基于卷积神经网络的垃圾分类系统实现(GUI应用)

1.摘要 本文主要实现了一个卷积神经网络模型进行垃圾图像分类&#xff0c;为了提高垃圾分类模型的准确率&#xff0c;使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型&#xff0c;实验结果显示最终优化后的模型准确率较高90%左右。最终&#xf…

【51单片机】蜂鸣器快速上手

‌51单片机蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;在51单片机开发板中常用于产生按键音、报警音等提示信号‌。 ‌蜂鸣器类型‌&#xff1a;蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器内部自带振荡源&#xff0c;只需接上直流电压即可持续发声&…

数据库入门

基本概念 数据库&#xff1a;DataBase简称DB&#xff0c;是一个用于存储和管理数据的仓库。 就像我们每天访问的网站Bilibili&#xff0c;OA、ERP和CRM等内部管理系统&#xff0c;以及我们每天使用的腾讯新闻和Tiktok应用程序一样&#xff0c;我们看到的数据实际上存储在数据库…

vscode插件开发 在activity Bar 开发一个自定义bar(左侧侧边栏自定义一个功能选项)

了解vscode编辑器结构 点击了解编辑器结构视图 在编辑器的左侧创建一个新的item 如下图位置 1&#xff0c;vscode开发基础点击这里 2&#xff0c;了解到基础的vscode插件开发的步骤之后 在package.json文件的contrites下配置下图参数 实现效果如下图

Airborne使用教程

1.安装环境 前提条件&#xff1a;系统已安装Ruby 打开终端输入如下命令 gem install airborne 或者在Gemfile添加 gem airborne 然后运行bundle install 2.编写脚本 在项目中新建api_tests_spec.rb文件 以GET接口"https://www.thunderclient.com/welcome"为…

session 共享服务器

1.安装 kryo-3.0.3.jar asm-5.2.jar objenesis-2.6.jar reflectasm-1.11.9.jar minlog-1.3.1.jar kryo-serializers-0.45.jar msm-kryo-serializer-2.3.2.jar memcached-session-manager-tc9-2.3.2.jar spymemcached-2.12.3.jar memcached-session-manager-2.3.2.jar …

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:药品进销存信息管理系统(前后端源码 + 数据库 sql 脚本)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 供应商管理功能 5.0 药品管理功能 6.0 采购记录管理功能 7.0 销售记录管理功能 8.0 退货记录管理功能…

PCIE概述

PCIE概述 文章目录 PCIE概述前言一、应用场景二、PCIE理论2.1 硬件2.2 拓扑结构&#xff1a;处理器和设备之间的关系2.3 速率2.4 层次接口2.5 四种请求类型2.5.1 bar空间2.5.2 memory2.5.3 IO2.5.4 configuration2.5.5 message 前言 参考链接&#xff1a; pcie总线知识点解析 …

基于C#开发web网页管理系统模板流程-登录界面和主界面

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言&#xff0c;首先介绍一下本项目将要实现的功能 &#xff08;一&#xff09;登录界面 实现一个不算特别美观的登录窗口&#xff0c;当然这一步跟开发者本身的设计美学相关&#xff0c;像蒟蒻博主就没…

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书&#xff0c;把两本书对照来读&#xff0c;发现很多有意思的地方&#xff1a; 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…

数据可视化大屏UI组件库:B端科技感素材PSD

在数据可视化领域&#xff0c;一个出色的大屏UI设计不仅能够准确传达数据背后的信息&#xff0c;更能提升用户的视觉体验。然而&#xff0c;对于UI设计师而言&#xff0c;设计这样一款界面往往面临着寻找合适设计素材的挑战。为了应对这一难题&#xff0c;我们推出了这款数据可…

爬虫逆向学习(十四):分享一下某数通用破解服务开发经验

阅前须知 这篇博客不是教大家怎么实现的&#xff0c;而且告知大家有这个东西&#xff0c;或者说一种趋势&#xff0c;借此分享自己大致的实现经验。具体的实现我也不好整理&#xff0c;毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道&#xff0…

结合Gitee、PicGo和Typora构建一个免费的个人笔记工具

文章目录 &#x1f4dd;小引言&#x1f4dd;步骤与内容&#x1f4dd;简单使用Typora&#x1f4dd;Gitee和GitHub&#x1f4dd;使用GiteePicGo打造自己的图床Gitee建仓库Node环境配置PicGo软件安装及配置Typora测试 &#x1f4dd;美化Typora &#x1f4dd;小引言 不知道大家在写…