学习PHP中好玩的Gmagick图像操作扩展的使用
在 PHP 的图像处理领域,要说最出名的 GD 库为什么好,那就是因为它不需要额外安装的别的什么图像处理工具,而且是随 PHP 源码一起发布的,只需要在安装 PHP 的时候添加上编译参数就可以了。
GD 库虽然已经可以帮助我们处理很多事情了,比如图片的简单绘制、加水印、缩放等,但业务需求往往更加的多样和丰富,比如我们今天需要像 PS 一样能够让图片翻转、模糊之类的功能,仅靠 GD 库就非常麻烦了。
当然,可能有不少的同学应该用过 ImageMagick ,不过我们今天先来介绍的可不是 ImageMagick ,而是它的一个分支软件 GraphicsMagick 。GraphicsMagick 是从 ImageMagick 5.5.2 中 fork 出来的一个分支。它相对于 ImageMagick 来说并没有什么新的特性,只是更加的专注于稳定性和性能方面。
所以呢,我们学习的重点将放在后面的 ImageMagick 中,对于 GraphicsMagick 就通过这篇文章简单地了解一下吧!
安装
首先,我们需要在系统中安装 GraphicsMagick ,然后再安装 PHP 中的 Gmagick 扩展。具体的安装过程可以参考下面的链接:
https://www.jianshu.com/p/7c4e02a84641
加载图片及查看图片信息
第一步还是来简单地看一下如何加载初始化 Gmagick 对象以及它的一些基本信息。
$image = new Gmagick('./img/2.jpg');
echo 'Copyright:', $image->getcopyright(), PHP_EOL;
// Copyright:Copyright (C) 2002-2020 GraphicsMagick Group.
// Additional copyrights and licenses apply to this software.
// See http://www.GraphicsMagick.org/www/Copyright.html for details.
echo 'Filename:', $image->getimagefilename(), PHP_EOL; // Filename:./img/2.jpg
echo 'Image Format:', $image->getimageformat(), PHP_EOL; // Image Format:JPEG
echo 'Image Width and Height:', $image->getimagewidth(), ' * ', $image->getimageheight(), PHP_EOL; // Image Width and Height:300 * 244
echo 'Image type:', $image->getimagetype(), PHP_EOL; // Image type:6
直接使用 new Gmagick(path) 就可以实例化一个 Gmagick 对象。接着,我们就可以通过一系列的 getxxxx 相关的方法来获得图片的一些信息,比如说当前 GraphicsMagick 的版本信息,图片路径、大小、格式等等。
同样地,要对图片进行其它操作也是直接在这个对象下面使用各种扩展库中提供的方法就可以了。
图片加边框
// 加边框
$image = new Gmagick('./img/2.jpg');
$image->borderimage("green", 2, 2)->oilpaintimage(0.3);
$image->write('./img/2-border.jpg');
通过 borderimage() 方法就可以非常简单地给图片加上一个宽高为 2 像素的绿色边框。oilpaintimage() 是为图片添加一个油画效果,看出来了吗,Gmagick 实例化后的对象中的方法是可以链式调用的。只要当前你使用的方法返回的也是 Gmagick 对象就可以了。
裁剪图片及缩略图
$image = new Gmagick('./img/2.jpg');
$image->resizeimage(150, 150, 10, 1);
$image->write('./img/2-resize.jpg');
$image = new Gmagick('./img/2.jpg');
$image->scaleimage(150, 150);
$image->write('./img/2-scale.jpg');
这两个方法,resizeimage() 和 scaleimage() 都可以用来改变图片的大小,resizeimage() 会以通道的方式进行操作,不过实际的使用情况其实并没有太明显的差别。
// 缩略图
$image = new Gmagick('./img/2.jpg');
$image->thumbnailimage(100, 0);
$image->write('./img/2-thumbnail.jpg');
// 裁剪缩略图
$image = new Gmagick('./img/2.jpg');
$image->cropthumbnailimage(100,90);
$image->write('./img/2-cropthumbnaili.jpg');
// 按比例缩小一半
$image = new Gmagick('./img/2.jpg');
$image->minifyimage();
$image->write('./img/2-minify.jpg');
thumbnailimage() 是直接生成缩略图,它的目标是制作适合在网上显示的小的低成本缩略图图象,我们可以只填一个宽或者只填一个高,图像就会自动等比例地绽放到指定的大小。cropthumbnailimage() 则是先通过缩小图像,然后从中心裁剪指定区域来创建固定大小的缩略图。其实它们从简单的测试表现来看,区别也并不是很大。
minifyimage() 则是直接等比例地将图片缩小一半,所以这个方法不需要任何参数。
图片旋转、偏移
// 垂直翻转
$image = new Gmagick('./img/2.jpg');
$image->flipimage();
$image->write('./img/2-flip.jpg');
// 水平翻转
$image = new Gmagick('./img/2.jpg');
$image->flopimage();
$image->write('./img/2-flop.jpg');
// 旋转图像
$image = new Gmagick('./img/2.jpg');
$image->rotateimage('#ffffff', 60);
$image->write('./img/2-rotate.jpg');
// 偏移图像
$image = new Gmagick('./img/2.jpg');
$image->rollimage(150, 150);
$image->write('./img/2-roll.jpg');
flipimage() 和 flopimage() 是直接将图片进行垂直和水平地翻转,rotateimage() 则是根据指定的角度来旋转图片,第一个参数是旋转之后我们要给旋转经过的地方留下的背景色。rollimage() 的效果是偏移图片,就是将图片的位置在原始尺寸中进行偏移,这个效果说出来可能有点不太好理解,大家可以自己试一下,比较炫酷哦。
图片颜色效果调整
// 调亮度、饱和度、色调
$image = new Gmagick('./img/2.jpg');
$image->modulateimage(80, 80, 80);
$image->write('./img/2-modulate.jpg');
// 颜色对比度
$image = new Gmagick('./img/2.jpg');
$image->normalizeimage(30);
$image->write('./img/2-normalize.jpg');
modulateimage() 直接通过三个参数来对应地调整图片的亮度、饱和度和色调,它们的取值是 -100 到 100 之间的整数。这个其实就和 PS 中相关的图片调整工具类似,在 PS 或者各种修图软件中都会是一个上下拉动的滑杆来进行调整。同理,normalizeimage() 是调整图片的对比度的,也和修图软件的参数值类似。
各类特效
// 模糊效果
$image = new Gmagick('./img/2.jpg');
$image->blurimage(30, 10);
$image->write('./img/2-blur.jpg');
// 运动模糊效果
$image = new Gmagick('./img/2.jpg');
$image->motionblurimage(30, 50, 10);
$image->write('./img/2-motionblur.jpg');
// 径向模糊效果
//$image = new Gmagick('./img/2.jpg');
//$image->radialblurimage(12.5);
//$image->write('./img/2-radialblur.jpg');
模糊效果中包含三种模糊工具,第一个 blurimage() 方法是普通的模糊功能,它的两个参数是模糊半径和标准差,通过调整这两个参数就可以获得不同的模糊程度效果。motionblurimage() 运动模糊其实就是有一点斜度的左右拖拽型感觉的模糊效果。最后的径向模糊效果在测试中一直报错,也没有找到原因,看提示像是本身 GraphicsMagick 中不支持这个功能。有用过的了解情况的同学可以留言说明下哈!
// 模拟油画效果
$image = new Gmagick('./img/2.jpg');
$image->oilpaintimage(5);
$image->write('./img/2-oilpaint.jpg');
// 创建模拟3D按扭
$image = new Gmagick('./img/2.jpg');
$image->raiseimage(50, 50, 150, 150, true);
$image->write('./img/2-raise.jpg');
// 木炭效果
$image = new Gmagick('./img/2.jpg');
$image->charcoalimage(10, 3);
$image->write('./img/2-charcoal.jpg');
// 图像应用日光效果
$image = new Gmagick('./img/2.jpg');
$image->solarizeimage(60);
$image->write('./img/2-solarize.jpg');
// 随机移动图中的像素
$image = new Gmagick('./img/2.jpg');
$image->spreadimage(10);
$image->write('./img/2-spread.jpg');
// 围绕中心旋转像素
$image = new Gmagick('./img/2.jpg');
$image->swirlimage(100);
$image->write('./img/2-swirl.jpg');
这一堆效果就不多说了,大家自己可以试试。
总结
看出来了吧,其实 GraphicsMagick 相对于 GD 来说,实现这些修图方面的效果会非常地简单。而且这些都是常见的修图软件中都会有的功能,也就是说,我们用 PHP 是完全可以做一个类似的在线修图工具的哦!当然,后面我们学习的 ImageMagick 中也是有这些功能,甚至基本上连方法名字都是一样的。因此,在学习 ImageMagick 时我们就不详细地说明每个方法函数的功能了。
另外,GraphicsMagick 还有 GmagickDraw 和 GmagickPixel 两个对象用于绘制图形和定义颜色,这两个对象在 ImageMagick 中也有对应的实现,我们也主要以那边的学习为主。
测试代码:
参考文档:
https://www.php.net/manual/zh/book.gmagick.php
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
学习PHP中好玩的Gmagick图像操作扩展的使用的更多相关文章
- C#中Bitmap类 对图像の操作 可检测图片完整性
try { Bitmap bm = new Bitmap(pics[ip]); BitmapToBytes(bm).Reverse().Take(2); } catch (Exception ex) ...
- 《学习opencv》笔记——矩阵和图像操作——cvSetIdentity,cvSolve,cvSplit,cvSub,cvSubS and cvSubRS
矩阵和图像的操作 (1)cvSetIdentity函数 其结构 void cvSetIdentity(//将矩阵行与列相等的元素置为1.其余元素置为0 CvArr* arr//目标矩阵 ); 实例代码 ...
- 《学习opencv》笔记——矩阵和图像操作——cvAbs,cvAbsDiff and cvAbsDiffS
矩阵和图像的操作 (1)cvAbs,cvAbsdiff,cvAbsDiffS 它们的结构为: void cvAbs( //取src中元素的绝对值,写到dst中 const CvArr* src, co ...
- 《学习opencv》笔记——矩阵和图像操作——cvInRange,cvInRangeS,cvInvert and cvMahalonobis
矩阵和图像的操作 (1)cvInRange函数 其结构 void cvInRange(//提取图像中在阈值中间的部分 const CvArr* src,//目标图像 const CvArr* lowe ...
- 《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor
矩阵和图像的操作 (1)cvCrossProduct函数 其结构 void cvCrossProdust(//计算两个三维向量的叉积 const CvArr* src1, const CvArr* s ...
- AngularJS学习--- AngularJS中模板链接和图像 ng-src step6
接上一篇文章,本文将主要介绍angularjs中的模板链接,和图像显示? 首先,切换分支,启动项目: git checkout step- npm start 1.效果 相较于前一篇文章,明显感觉多了 ...
- 《学习opencv》笔记——矩阵和图像操作——cvCalcCovarMatrix,cvCmp and cvCmpS
矩阵和图像的操作 (1)cvCalcCovarMatrix函数 其结构 void cvCalcCovarMatrix(计算给定点的均值和协方差矩阵 const CvArr** vects,//给定向量 ...
- 《学习opencv》笔记——矩阵和图像操作——cvAnd、cvAndS、cvAvg and cvAvgSdv
矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取"位与运算" const CvArr* src1,//第一个矩阵 cons ...
- 《学习opencv》笔记——矩阵和图像操作——cvConvertScale,cvConvertScaleAbs,cvCopy and cvCountNonZero
矩阵和图像的操作 (1)cvConvertScale函数 其结构: void cvConvertScale( //进行线性变换,将src乘scale加上shift保存到dst const CvArr* ...
随机推荐
- 不懂Ribbon原理的可以进来看看哦,分析RibbonClientConfiguration完成了哪些核心初始操作
本文在前一篇文章的基础上来继续分析Ribbon的核心内容. 不懂Ribbon原理的可以进来看看哦,分析SpringBoot自动装配完成了Ribbon哪些核心操作 RibbonClientConfi ...
- springboot:使用异步注解@Async的那些坑
springboot:使用异步注解@Async的那些坑 一.引言 在java后端开发中经常会碰到处理多个任务的情况,比如一个方法中要调用多个请求,然后把多个请求的结果合并后统一返回,一般情况下调用其他 ...
- Vue CLI安装报错 npm ERR! Exit handler never called!
安装Vue CLI时报错: npm install –g vue-cli 试了四种办法 1.把全局安装-g放到后面 npm install @vue/cli –g 2.命令行输入 npm 缓存清理命令 ...
- MySQL 条件查询
查询条件 having having的功能和where一样,都是用来筛选查询,不同的是,where在分组之前用,having必须在分组之后使用. # 查询每个部门大于30岁的平均工资,并且保留平均工资 ...
- Mysql中的Join详解
一.Simple Nested-Loop Join(简单的嵌套循环连接) 简单来说嵌套循环连接算法就是一个双层for 循环 ,通过循环外层表的行数据,逐个与内层表的所有行数据进行比较来获取结果,当执行 ...
- SQL 练习38
查询选修了全部课程的学生信息 SELECT * from Student WHERE SId IN ( SELECT sid from sc GROUP BY sid HAVING COUNT(cid ...
- noip23
T1 好吧,题目很sb,描述告诉你序列无限长,输入格式里告诉你m为序列长度,我:????,选择了相信后者.然后连暴力都挂分,可恶 这题一看就是个毒瘤数据结构题,思索了一下,发现就是个线段树,但我又想到 ...
- NOIP 模拟 $25\; \rm random$
题解 \(by\;zj\varphi\) 期望好题. 通过推规律可以发现每个逆序对的贡献都是 \(1\),那么在所有排列中有多少逆序对,贡献就是多少. \[\rm num_i=(i-1)!\sum_{ ...
- 高德Web开发入门之一
高德Web开发 一.地图开发阐述 1)不管是高德地图的Web开发使用,亦或是百度地图的应用开发,都可以直接百度"高德地图/百度地图",进入地图首页下边"开放平台" ...
- UWP AppConnection.
https://www.cnblogs.com/manupstairs/p/14582794.html