php imagemagick 處理 圖片剪切、壓縮、合併、插入文本、背景色透明

php有一款插件叫作imagemagick,功能很強大,提供了圖片的不少操做,圖片剪切、壓縮、合併、插入文本、背景色透明等。而且有api方法調用和命令行操做兩種方式,若是隻是簡單處理的話建議api方法調用,若是是很複雜的操做建議服務器端搭shell命令行操做,由於api方法調用同操做對比命令行他更吃內存,而且效率沒有命令行那麼高。php

本文章就對於這些常見操做進行介紹說明web

首先要提一聲的時候每次經過imageMagic處理圖片都會new一個對象出來,當圖片處理好以後最好是把這個對象給銷燬,它會佔用cpu和內存,若是你不在意這些小細節的話就當作我沒有說,接下來進入正題。shell

圖片寬高壓縮:經過調用api中的 thumbnailImage 方法,能夠實現圖片寬高設置,這個操做不會影響圖片的質量,是同大小壓縮。api

代碼以下服務器

1 $codeLogo = new \Imagick( '圖片路徑' );
2 $codeLogo->thumbnailImage( '圖片高','圖片寬');
3 header("Content-Type: image/{$image->getImageFormat()}");
4 echo codeLogo;
5 exit;

 

圖片存儲大小壓縮:經過調用api中的 setImageCompressionQuality 方法,能夠實現圖片存儲大小設置,可是後帶參數越小那麼圖片清晰度越差,可是圖片存儲大小會越小那麼web加載的時候就越快,壓縮率請根據實際狀況進行調整。測試

代碼以下字體

1 code = new \Imagick( '圖片路徑' );
2 $code->setImageCompressionQuality('縮放比例');
3 header("Content-Type: image/{$image->getImageFormat()}");
4 echo $image->getImageBlob( );

圖片合併: 經過imageMagick能夠實現多個圖片合併到一張圖片中,可是在合併的時候須要根據被覆蓋圖片的高和寬來肯定覆蓋圖片的xy座標,獲取被覆蓋圖片的高和寬能夠經過方法getImageGeometry來獲取圖片屬性,而後獲得高和寬,而後進行定位計算,下邊的代碼是將覆蓋圖片水平、垂直居中。spa

代碼以下插件

 1  $code = new \Imagick( '被覆蓋圖片路徑');
 2 $codePro = $code->getImageGeometry();
 3 $codeWidth = $codePro['width'];
 4 $codeHeight = $codePro['height'];
 5 
 6 $codeLogo = new \Imagick( '覆蓋圖片路徑' );
 7 $codeLogo->thumbnailImage(300,300);
 8 $codeLogo->roundCorners( 300, 300 ); // radio 圓角處理
 9 $code->compositeImage( $codeLogo, \imagick::COMPOSITE_DEFAULT , ( $codeWidth - 300)/2, ( $codeHeight - 300 )/2 );
10 header("Content-Type: image/{$image->getImageFormat()}");
11 echo $image->getImageBlob( );

插入文本:插入文本你須要指定字體文件和字體位置,以後將你的文字塞到圖片上去,你能夠經過imageMagick對你的文字進行大小、字體、顏色進行調整,而且當你塞到圖片的時候能夠經過Imagick::GRAVITY_NORTH直接將文字定位爲水平居中。命令行

代碼以下

 1 $image = new \Imagick( '圖片路徑' );
 2 $draw = new \ImagickDraw();
 3 $draw->setFontSize( '字體大小' );
 4 $draw->setTextKerning( 1 ); // 設置文件間距
 5 $draw->setFont( '字體庫路徑' );
 6 $draw->setFontWeight( 100 ); // 字體粗體
 7 $draw->setFillColor( '#434343' ); // 字體顏色
 8 $draw->setFontFamily( "Palatino" );
 9 $draw->setGravity( \Imagick::GRAVITY_NORTH );
10 $image->annotateImage( $draw, 0, 840, 0, '文本' ) ;
11 header("Content-Type: image/{$image->getImageFormat()}");
12 echo $image->getImageBlob( );

背景色透明:這個網上查了不少資料,在這裏不得不吐槽一下,php的imageMagickapi文檔真難看,看來看去也看不出因此然,功夫不負有心人,最終作出來了,原理就是把圖片背景顏色設置爲透明色,api方法是 transparentPaintImage 後帶四個參數,按照順序分別是 目標顏色,透明度,擦邊值,是否所有渲染,主要說明一下目標顏色,這個參數須要是色調值 rgba(238, 238, 238),而不是 white、black 這樣的字符串。

代碼以下

1 $code = new \Imagick( '圖片路徑' );
2 $code->setimageformat('png');
3 $code->transparentPaintImage(new \ImagickPixel( '目標顏色' ), 0, '10', 0);
4 header("Content-Type: image/{$image->getImageFormat()}");
5 echo $image->getImageBlob( );

 

本文章爲原創,上邊提供的全部方法都是本人測試通的,創做不易,若是轉載請註明文章出處。

相關文章
相關標籤/搜索