在 PHP 的圖像處理領(lǐng)域,要說(shuō)最出名的 GD 庫(kù)為什么好,那就是因?yàn)樗恍枰~外安裝的別的什么圖像處理工具,而且是隨 PHP 源碼一起發(fā)布的,只需要在安裝 PHP 的時(shí)候添加上編譯參數(shù)就可以了。
GD 庫(kù)雖然已經(jīng)可以幫助我們處理很多事情了,比如圖片的簡(jiǎn)單繪制、加水印、縮放等,但業(yè)務(wù)需求往往更加的多樣和豐富,比如我們今天需要像 PS 一樣能夠讓圖片翻轉(zhuǎn)、模糊之類(lèi)的功能,僅靠 GD 庫(kù)就非常麻煩了。
當(dāng)然,可能有不少的同學(xué)應(yīng)該用過(guò) ImageMagick ,不過(guò)我們今天先來(lái)介紹的可不是 ImageMagick ,而是它的一個(gè)分支軟件 GraphicsMagick 。GraphicsMagick 是從 ImageMagick 5.5.2 中 fork 出來(lái)的一個(gè)分支。它相對(duì)于 ImageMagick 來(lái)說(shuō)并沒(méi)有什么新的特性,只是更加的專(zhuān)注于穩(wěn)定性和性能方面。
所以呢,我們學(xué)習(xí)的重點(diǎn)將放在后面的 ImageMagick 中,對(duì)于 GraphicsMagick 就通過(guò)這篇文章簡(jiǎn)單地了解一下吧!
首先,我們需要在系統(tǒng)中安裝 GraphicsMagick ,然后再安裝 PHP 中的 Gmagick 擴(kuò)展。具體的安裝過(guò)程可以參考下面的鏈接:
https://www.jianshu.com/p/7c4e02a84641
第一步還是來(lái)簡(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ì)象。接著,我們就可以通過(guò)一系列的 getxxxx 相關(guān)的方法來(lái)獲得圖片的一些信息,比如說(shuō)當(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');
通過(guò) borderimage() 方法就可以非常簡(jiǎn)單地給圖片加上一個(gè)寬高為 2 像素的綠色邊框。oilpaintimage() 是為圖片添加一個(gè)油畫(huà)效果,看出來(lái)了嗎,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() 都可以用來(lái)改變圖片的大小,resizeimage() 會(huì)以通道的方式進(jìn)行操作,不過(guò)實(shí)際的使用情況其實(shí)并沒(méi)有太明顯的差別。
// 縮略圖
$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() 則是先通過(guò)縮小圖像,然后從中心裁剪指定區(qū)域來(lái)創(chuàng)建固定大小的縮略圖。其實(shí)它們從簡(jiǎn)單的測(cè)試表現(xiàn)來(lái)看,區(qū)別也并不是很大。
minifyimage() 則是直接等比例地將圖片縮小一半,所以這個(gè)方法不需要任何參數(shù)。
// 垂直翻轉(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ù)指定的角度來(lái)旋轉(zhuǎn)圖片,第一個(gè)參數(shù)是旋轉(zhuǎn)之后我們要給旋轉(zhuǎn)經(jīng)過(guò)的地方留下的背景色。rollimage() 的效果是偏移圖片,就是將圖片的位置在原始尺寸中進(jìn)行偏移,這個(gè)效果說(shuō)出來(lái)可能有點(diǎn)不太好理解,大家可以自己試一下,比較炫酷哦。
// 調(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() 直接通過(guò)三個(gè)參數(shù)來(lái)對(duì)應(yīng)地調(diào)整圖片的亮度、飽和度和色調(diào),它們的取值是 -100 到 100 之間的整數(shù)。這個(gè)其實(shí)就和 PS 中相關(guān)的圖片調(diào)整工具類(lèi)似,在 PS 或者各種修圖軟件中都會(huì)是一個(gè)上下拉動(dòng)的滑桿來(lái)進(jìn)行調(diào)整。同理,normalizeimage() 是調(diào)整圖片的對(duì)比度的,也和修圖軟件的參數(shù)值類(lèi)似。
// 模糊效果
$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)差,通過(guò)調(diào)整這兩個(gè)參數(shù)就可以獲得不同的模糊程度效果。motionblurimage() 運(yùn)動(dòng)模糊其實(shí)就是有一點(diǎn)斜度的左右拖拽型感覺(jué)的模糊效果。最后的徑向模糊效果在測(cè)試中一直報(bào)錯(cuò),也沒(méi)有找到原因,看提示像是本身 GraphicsMagick 中不支持這個(gè)功能。有用過(guò)的了解情況的同學(xué)可以留言說(shuō)明下哈!
// 模擬油畫(huà)效果
$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');
這一堆效果就不多說(shuō)了,大家自己可以試試。
看出來(lái)了吧,其實(shí) GraphicsMagick 相對(duì)于 GD 來(lái)說(shuō),實(shí)現(xiàn)這些修圖方面的效果會(huì)非常地簡(jiǎn)單。而且這些都是常見(jiàn)的修圖軟件中都會(huì)有的功能,也就是說(shuō),我們用 PHP 是完全可以做一個(gè)類(lèi)似的在線(xiàn)修圖工具的哦!當(dāng)然,后面我們學(xué)習(xí)的 ImageMagick 中也是有這些功能,甚至基本上連方法名字都是一樣的。因此,在學(xué)習(xí) ImageMagick 時(shí)我們就不詳細(xì)地說(shuō)明每個(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
聯(lián)系客服