學(xué)習(xí)PHP中好玩的Gmagick圖像操作擴(kuò)展的使用

在 PHP 的圖像處理領(lǐng)域旁趟,要說最出名的 GD 庫(kù)為什么好,那就是因?yàn)樗恍枰~外安裝的別的什么圖像處理工具庇绽,而且是隨 PHP 源碼一起發(fā)布的锡搜,只需要在安裝 PHP 的時(shí)候添加上編譯參數(shù)就可以了。

GD 庫(kù)雖然已經(jīng)可以幫助我們處理很多事情了瞧掺,比如圖片的簡(jiǎn)單繪制耕餐、加水印、縮放等辟狈,但業(yè)務(wù)需求往往更加的多樣和豐富肠缔,比如我們今天需要像 PS 一樣能夠讓圖片翻轉(zhuǎn)、模糊之類的功能哼转,僅靠 GD 庫(kù)就非常麻煩了明未。

當(dāng)然,可能有不少的同學(xué)應(yīng)該用過 ImageMagick 壹蔓,不過我們今天先來介紹的可不是 ImageMagick 趟妥,而是它的一個(gè)分支軟件 GraphicsMagick 。GraphicsMagick 是從 ImageMagick 5.5.2 中 fork 出來的一個(gè)分支庶溶。它相對(duì)于 ImageMagick 來說并沒有什么新的特性煮纵,只是更加的專注于穩(wěn)定性和性能方面懂鸵。

所以呢,我們學(xué)習(xí)的重點(diǎn)將放在后面的 ImageMagick 中行疏,對(duì)于 GraphicsMagick 就通過這篇文章簡(jiǎn)單地了解一下吧匆光!

安裝

首先,我們需要在系統(tǒng)中安裝 GraphicsMagick 酿联,然后再安裝 PHP 中的 Gmagick 擴(kuò)展终息。具體的安裝過程可以參考下面的鏈接:

http://www.reibang.com/p/7c4e02a84641

加載圖片及查看圖片信息

第一步還是來簡(jiǎn)單地看一下如何加載初始化 Gmagick 對(duì)象以及它的一些基本信息。

$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) 就可以實(shí)例化一個(gè) Gmagick 對(duì)象贞让。接著周崭,我們就可以通過一系列的 getxxxx 相關(guān)的方法來獲得圖片的一些信息,比如說當(dāng)前 GraphicsMagick 的版本信息喳张,圖片路徑续镇、大小、格式等等销部。

同樣地摸航,要對(duì)圖片進(jìn)行其它操作也是直接在這個(gè)對(duì)象下面使用各種擴(kuò)展庫(kù)中提供的方法就可以了。

圖片加邊框

// 加邊框
$image = new Gmagick('./img/2.jpg');
$image->borderimage("green", 2, 2)->oilpaintimage(0.3);
$image->write('./img/2-border.jpg');

通過 borderimage() 方法就可以非常簡(jiǎn)單地給圖片加上一個(gè)寬高為 2 像素的綠色邊框舅桩。oilpaintimage() 是為圖片添加一個(gè)油畫效果酱虎,看出來了嗎,Gmagick 實(shí)例化后的對(duì)象中的方法是可以鏈?zhǔn)秸{(diào)用的擂涛。只要當(dāng)前你使用的方法返回的也是 Gmagick 對(duì)象就可以了读串。

裁剪圖片及縮略圖

$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');

這兩個(gè)方法,resizeimage() 和 scaleimage() 都可以用來改變圖片的大小撒妈,resizeimage() 會(huì)以通道的方式進(jìn)行操作恢暖,不過實(shí)際的使用情況其實(shí)并沒有太明顯的差別。

// 縮略圖
$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() 是直接生成縮略圖踩身,它的目標(biāo)是制作適合在網(wǎng)上顯示的小的低成本縮略圖圖象胀茵,我們可以只填一個(gè)寬或者只填一個(gè)高,圖像就會(huì)自動(dòng)等比例地綻放到指定的大小挟阻。cropthumbnailimage() 則是先通過縮小圖像琼娘,然后從中心裁剪指定區(qū)域來創(chuàng)建固定大小的縮略圖。其實(shí)它們從簡(jiǎn)單的測(cè)試表現(xiàn)來看附鸽,區(qū)別也并不是很大脱拼。

minifyimage() 則是直接等比例地將圖片縮小一半,所以這個(gè)方法不需要任何參數(shù)坷备。

圖片旋轉(zhuǎn)熄浓、偏移

// 垂直翻轉(zhuǎn)
$image = new Gmagick('./img/2.jpg');
$image->flipimage();
$image->write('./img/2-flip.jpg');

// 水平翻轉(zhuǎn)
$image = new Gmagick('./img/2.jpg');
$image->flopimage();
$image->write('./img/2-flop.jpg');

// 旋轉(zhuǎn)圖像
$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() 是直接將圖片進(jìn)行垂直和水平地翻轉(zhuǎn),rotateimage() 則是根據(jù)指定的角度來旋轉(zhuǎn)圖片,第一個(gè)參數(shù)是旋轉(zhuǎn)之后我們要給旋轉(zhuǎn)經(jīng)過的地方留下的背景色赌蔑。rollimage() 的效果是偏移圖片俯在,就是將圖片的位置在原始尺寸中進(jìn)行偏移,這個(gè)效果說出來可能有點(diǎn)不太好理解娃惯,大家可以自己試一下跷乐,比較炫酷哦。

圖片顏色效果調(diào)整

// 調(diào)亮度趾浅、飽和度愕提、色調(diào)
$image = new Gmagick('./img/2.jpg');
$image->modulateimage(80, 80, 80);
$image->write('./img/2-modulate.jpg');

// 顏色對(duì)比度
$image = new Gmagick('./img/2.jpg');
$image->normalizeimage(30);
$image->write('./img/2-normalize.jpg');

modulateimage() 直接通過三個(gè)參數(shù)來對(duì)應(yīng)地調(diào)整圖片的亮度、飽和度和色調(diào)皿哨,它們的取值是 -100 到 100 之間的整數(shù)浅侨。這個(gè)其實(shí)就和 PS 中相關(guān)的圖片調(diào)整工具類似,在 PS 或者各種修圖軟件中都會(huì)是一個(gè)上下拉動(dòng)的滑桿來進(jìn)行調(diào)整证膨。同理如输,normalizeimage() 是調(diào)整圖片的對(duì)比度的,也和修圖軟件的參數(shù)值類似椎例。

各類特效

// 模糊效果
$image = new Gmagick('./img/2.jpg');
$image->blurimage(30, 10);
$image->write('./img/2-blur.jpg');

// 運(yùn)動(dòng)模糊效果
$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');

模糊效果中包含三種模糊工具挨决,第一個(gè) blurimage() 方法是普通的模糊功能,它的兩個(gè)參數(shù)是模糊半徑和標(biāo)準(zhǔn)差订歪,通過調(diào)整這兩個(gè)參數(shù)就可以獲得不同的模糊程度效果。motionblurimage() 運(yùn)動(dòng)模糊其實(shí)就是有一點(diǎn)斜度的左右拖拽型感覺的模糊效果肆捕。最后的徑向模糊效果在測(cè)試中一直報(bào)錯(cuò)刷晋,也沒有找到原因,看提示像是本身 GraphicsMagick 中不支持這個(gè)功能慎陵。有用過的了解情況的同學(xué)可以留言說明下哈眼虱!

// 模擬油畫效果
$image = new Gmagick('./img/2.jpg');
$image->oilpaintimage(5);
$image->write('./img/2-oilpaint.jpg');

// 創(chuàng)建模擬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');

// 圖像應(yīng)用日光效果
$image = new Gmagick('./img/2.jpg');
$image->solarizeimage(60);
$image->write('./img/2-solarize.jpg');

// 隨機(jī)移動(dòng)圖中的像素
$image = new Gmagick('./img/2.jpg');
$image->spreadimage(10);
$image->write('./img/2-spread.jpg');

// 圍繞中心旋轉(zhuǎn)像素
$image = new Gmagick('./img/2.jpg');
$image->swirlimage(100);
$image->write('./img/2-swirl.jpg');

這一堆效果就不多說了,大家自己可以試試席纽。

總結(jié)

看出來了吧捏悬,其實(shí) GraphicsMagick 相對(duì)于 GD 來說,實(shí)現(xiàn)這些修圖方面的效果會(huì)非常地簡(jiǎn)單润梯。而且這些都是常見的修圖軟件中都會(huì)有的功能过牙,也就是說,我們用 PHP 是完全可以做一個(gè)類似的在線修圖工具的哦纺铭!當(dāng)然寇钉,后面我們學(xué)習(xí)的 ImageMagick 中也是有這些功能,甚至基本上連方法名字都是一樣的舶赔。因此扫倡,在學(xué)習(xí) ImageMagick 時(shí)我們就不詳細(xì)地說明每個(gè)方法函數(shù)的功能了。

另外竟纳,GraphicsMagick 還有 GmagickDraw 和 GmagickPixel 兩個(gè)對(duì)象用于繪制圖形和定義顏色撵溃,這兩個(gè)對(duì)象在 ImageMagick 中也有對(duì)應(yīng)的實(shí)現(xiàn)疚鲤,我們也主要以那邊的學(xué)習(xí)為主。

測(cè)試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/4.學(xué)習(xí)PHP中好玩的Gmagick圖像操作擴(kuò)展的使用(一).php

參考文檔:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缘挑,一起剝皮案震驚了整個(gè)濱河市石咬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卖哎,老刑警劉巖鬼悠,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亏娜,居然都是意外死亡焕窝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門维贺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來它掂,“玉大人,你說我怎么就攤上這事溯泣∨扒铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵垃沦,是天一觀的道長(zhǎng)客给。 經(jīng)常有香客問我,道長(zhǎng)肢簿,這世上最難降的妖魔是什么靶剑? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮池充,結(jié)果婚禮上桩引,老公的妹妹穿的比我還像新娘。我一直安慰自己收夸,他們只是感情好坑匠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卧惜,像睡著了一般厘灼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上序苏,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天手幢,我揣著相機(jī)與錄音,去河邊找鬼忱详。 笑死围来,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播监透,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桶错,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了胀蛮?” 一聲冷哼從身側(cè)響起院刁,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粪狼,沒想到半個(gè)月后退腥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡再榄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年狡刘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片困鸥。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗅蔬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疾就,到底是詐尸還是另有隱情澜术,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布猬腰,位于F島的核電站鸟废,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漆诽。R本人自食惡果不足惜侮攀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厢拭。 院中可真熱鬧,春花似錦撇叁、人聲如沸供鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楞捂。三九已至,卻和暖如春趋厉,著一層夾襖步出監(jiān)牢的瞬間寨闹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工君账, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留繁堡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椭蹄,于是被迫代替她去往敵國(guó)和親闻牡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容