学习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://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/4.学习PHP中好玩的Gmagick图像操作扩展的使用(一).php

参考文档:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容