ImageMagick是一個免費的建立、編輯、合成圖片的軟體。它可以讀取、轉換、寫入多種格式的圖片。圖片切割、顏色替換、各種效果的應用,圖片的旋轉、組合,文字,直線,多邊形,橢圓,曲線,附加到圖片伸展旋轉。ImageMagick是免費軟體:全部原始碼開放,可以自由使用,複製,修改,釋出,它遵守GPL許可協議,可以執行於大多數的作業系統,ImageMagick的大多數功能的使用都來源於命令列工具。
PHP中要使用ImageMagick,需要安裝imagick
擴充套件,imagick
與gd
擴充套件類似,主要用於影像處理,但是imagick
的功能更強大。下面簡單介紹imagick
在兩種常用環境中的安裝方法。
CentOS 7中安裝
在CentOS中可以直接使用Yum
進行安裝,除了安裝ImageMagick
,還要安裝它的兩個依賴ImageMagick-devel
和ImageMagick-perl
。
yum install -y ImageMagick ImageMagick-devel ImageMagick-perl
接著使用pecl
安裝擴充套件。找到PHP安裝目錄下的pecl
,例如PHP安裝在/usr/local/php74
目錄中,則pecl
一般在/usr/local/php74/bin
目標中,執行命令:
/usr/local/php74/bin/pecl install imagick
即可使用pecl
自動下載並安裝ImageMagick
,最後在php.ini
中新增
extension=imagick.so
即可啟用擴充套件。
如果你需要檢查一下擴充套件有沒有安裝成功,可以執行一下命令
php -m|grep imagick
如果輸出imagick
,說明擴充套件安裝成功。
題外話 :如果你不知道PHP使用的是哪個php.ini
配置檔案,可以執行一下以下命令
php74 -i|grep ini
找到”Loaded Configuration File”那行,就知道PHP使用的是哪個配置檔案了。php -i
命令
作用類似於我們使用phpinfo()
函式檢視PHP的相關資訊。
Docker安裝
容器中的PHP安裝擴充套件,推薦使用Github上的docker-php-extension-installer,這是一個Shell指令碼,可以幫我們解決擴充套件的依賴問題,安裝擴充套件後還會自動清除沒用的檔案。我們只需要在Dockerfile中加入這個指令碼即可,下面是官方的示例:
FROM php:7.2-cli
# 從Github上下載docker-php-extension-installer指令碼
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# 新增可執行許可權並安裝擴充套件
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions gd xdebug imagick
這樣構建出來的映象就安裝好所需要的擴充套件了。
題外話:在國內網路環境下,使用docker-php-extension-installer
安裝擴充套件經常會出現超時問題,建議使用外網的VPS構建映象,上傳到DockerHub或者其它私有倉庫後,再拉到本地網路使用。可使用便宜的良心雲,或者Vultr這種支援按時計費的VPS。
程式碼示例:
// 例項化imagick物件
$im = new imagick();
$im->setResolution(150, 150);
$im->setCompressionQuality(100);
$im->readImageBlob($fileContent);
$im->setImageFormat('jpg');
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
header("Content-type: image/jpeg");
echo $im->getImageBlob();
程式碼解讀:
$im->setResolution(150, 150);
用於設定影像的解析度。這個函式並不改變影像的實際解析度,只是在讀取或建立影像之前將其設定在Imagick物件中,這個函式需要在讀取影像或建立影像之前呼叫。
這個函式接收兩個引數,分別是橫向解析度和縱向解析度,預設值是72*72。為了保持影像的寬高比,這兩個引數值應該一樣,預設值轉換出來的影像不夠清晰,建議使用兩倍或三倍值,但同時圖片的大小也會變大。
$im->setCompressionQuality(100);
設定影像的壓縮質量,預設值為0;傳入的引數值應為1-100,對於JPG格式圖片,值越小,影像體積越小,同時清晰度也較低;但是對於PNG圖片,這個結論貌似不成立,當值小於90時,圖片體積反而越大,所以在轉換為PNG圖片格式時,保持預設值即可。
$im->readImageBlob($fileContent);
直接載入PDF檔案的二進位制內容,也可以使用readImage($filename)
函式讀取儲存好的PDF檔案。
$im->setImageFormat('jpg');
設定要生成的影像的格式,如jpg
,png
等,
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
設定影像背景色為白色,去掉影像的alpha通道,將所有影像合併為一層,如果不執行這些操作,轉換出來的影像背景會是黑色的,如下圖:
header("Content-type: image/png");
echo $im->getImageBlob();
獲取轉換生成影像的二進位制資料,輸出到客戶端供下載;如果需要儲存到檔案,可以使用writeImage($filename)
函式。
本作品採用《CC 協議》,轉載必須註明作者和本文連結