关于php:学习PHP中好玩的Gmagick图像操作扩展的使用

5次阅读

共计 5006 个字符,预计需要花费 13 分钟才能阅读完成。

在 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

各自媒体平台均可搜寻【硬核项目经理】

正文完
 0