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( );
本文章為原創,上邊提供的所有方法都是本人測試通的,創作不易,如果轉載請注明文章出處。
