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


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

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

首先要提一聲的時候每次通過imageMagic處理圖片都會new一個對象出來,當圖片處理好之后最好是把這個對象給銷毀,它會占用cpu和內存,如果你不在乎這些小細節的話就當做我沒有說,接下來進入正題。

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

代碼如下

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來獲取圖片屬性,然后得到高和寬,然后進行定位計算,下邊的代碼是將覆蓋圖片水平、垂直居中。

代碼如下

 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( );

 

本文章為原創,上邊提供的所有方法都是本人測試通的,創作不易,如果轉載請注明文章出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM