GD 库虽然已经可以帮助我们处理很多事情了,比如图片的大略绘制、加水印、缩放等,但业务需求每每更加的多样和丰富,比如我们本日须要像 PS 一样能够让图片翻转、模糊之类的功能,仅靠 GD 库就非常麻烦了。

当然,可能有不少的同学该当用过 imageMagick ,不过我们本日先来先容的可不是 ImageMagick ,而是它的一个分支软件 GraphicsMagick 。
GraphicsMagick 是从 ImageMagick 5.5.2 中 fork 出来的一个分支。
它相对付 ImageMagick 来说并没有什么新的特性,只是更加的专注于稳定性和性能方面。

以是呢,我们学习的重点将放在后面的 ImageMagick 中,对付 GraphicsMagick 就通过这篇文章大略地理解一下吧!

php使图片旋转进修PHP中好玩的Gmagick图像操作扩大的应用 PHP

安装

首先,我们须要在系统中安装 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.jpgecho 'Image Format:', $image->getimageformat(), PHP_EOL; // Image Format:JPEGecho 'Image Width and Height:', $image->getimagewidth(), ' ', $image->getimageheight(), PHP_EOL; // Image Width and Height:300 244echo '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://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/4.学习PHP中好玩的Gmagick图像操作扩展的利用(一).php

参考文档:

https://www.php.net/manual/zh/book.gmagick.php