一般用PHP處理圖片都是使用GD庫或者GD2的函數庫,一般編譯PHP環境都會搭上GD庫,大多數開源程序也是用GD來處理圖片的,但是它只能現實諸如調整大小、增加水印等基礎功能,要想用GD來做復雜圖形是非常困難的。
還好有個基於命令行的圖像處理軟件ImageMagick,能實現非常豐富的功能。如果服務器上安裝了ImageMagick,php腳本可以使用shell命令來完成,也可以用php的原生函數庫Imagick或者MagickWandForPHP函數來調用ImageMagick軟件來實現。
因為Linux系統下PHP往往沒有執行shell的權限,直接用shell來操作ImageMagick不太可能,綜合考慮,Imagick函數庫連接到ImageMagick軟件比較好,而且是面向對象方式的。
Linux系統下,編譯安裝ImageMagick軟件
wget ftp://FTP.imagemagick.org/pub/ImageMagick/ImageMagick-6.5.2-7.tar.gz tar -zxvf ImageMagick-6.5.2-7.tar.gz cd ImageMagick-6.5.2-7/ ./configure make make install #譯PHP原生庫Imagick wget http://pecl.PHP.Net/get/imagick-2.2.2.tgz tar zxvf imagick-2.2.2.tgz cd imagick-2.2.2/ /usr/local/webserver/php/bin/phpize ./configure --with-php-config=/usr/local/webserver/php/bin/php-config make make install #最後,修改PHP.ini,加上(去除下面#號) #extension = "imagick.so"
查看PHPinfo,如果有Imagick,則說明安裝成功。
詳細安裝可參考 Nginx 0.7.x + PHP 5.2.9(FastCGI)搭建勝過apache十倍的Web服務器(第5版)http://blog.s135.com/nginx_PHP_v5/
Imagick函數庫資料太少,能參考的就是PHP官方手冊http://cn2.PHP.Net/imagick,但是無詳細示例介紹。下面簡單寫了個實例,找了手冊很長時間才做出來的,希望對大家有幫助。
原圖http://test.studenthome.cn/imagick/b.jpg
按要求縮小圖片尺寸、增加半透明邊框,讀入exif信息,按指定要求顯示在圖片上。
php生成的圖片http://test.studenthome.cn/imagick/imagick4.PHP
$towidth = '500'; $toheight = '700'; //設置圖片調整大小時允許的最大寬度和高度 $sourcefile = './b.jpg'; //定義一個圖像文件路徑 //$image->writeImage('./b.jpg.bak'); //可以備份這個圖片 $myimage = new Imagick( $sourcefile ); //讀入該圖像文件 $exifobject = my_exif( $myimage ); //自寫函數,讀取exif信息(拍攝數據),按自己的要求排列exif信息,返回對象 //$myimage->setImageFormat('jpeg'); //把圖片轉為jpg格式 $myimage->setCompressionQuality( 100 ); //設置jpg壓縮質量,1 - 100 $myimage->enhanceImage(); //去噪點 $sourcewidth = $myimage->getImageWidth(); //獲取讀入圖像原始大小 if ( $sourcewidth > $towidth ) { $myimage->scaleImage( $towidth, $toheight, true ); //調整圖片大小 } $myimage->raiseImage( 8, 8, 0, 0, 1 ); //加半透明邊框 $resizewidth = $myimage->getImageWidth(); //讀出調整之後的圖片大小 $resizeheight = $myimage->getImageHeight(); $drawback = new ImagickDraw(); //實例化一個繪畫對象,繪制半透明黑色背景給exif信息用 $drawback->setFillColor( new ImagickPixel('#000000') ); //設置填充顏色為黑色 $drawback->setFillOpacity( 0.6 ); //填充透明度為0.6,參數0.1-1,1為不透明 $drawback->rectangle( $resizewidth / 2 - 190, $resizeheight - 50, $resizewidth / 2 + 190, $resizeheight - 12 ); //繪制矩形參數,分別為左上角x、y,右下角x、y $myimage->drawImage( $drawback ); //確認到image中繪制該矩形框 $draw = new ImagickDraw(); //實例化一個繪畫對象,繪制exif文本信息嵌入圖片中 $draw->setFont( './xianhei.ttf' ); //設置文本字體,要求ttf或者ttc字體,可以絕對或者相對路徑 $draw->setFontSize( 11 ); //設置字號 $draw->setTextAlignment( 2 ); //文字對齊方式,2為居中 $draw->setFillColor( '#FFFFFF' ); //文字填充顏色 $myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 39, 0, $exifobject->row1 ); //繪制第一行文本,居中 $myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 27, 0, $exifobject->row2 ); //繪制第二行文本,居中 $myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 15, 0, $exifobject->row3 ); //繪制第三行文本,居中 /* Output the image with headers */ header( 'Content-type: image/jpeg' ); //php文件輸出mime類型為jpeg圖片 echo $myimage; //在當前php頁面輸出圖片 //$image->writeImage('./b.new.jpg'); //如果圖片不需要在當前PHP程序中輸出,使用寫入圖片到磁盤函數,上面的設置header也可以去除 $myimage->clear(); $myimage->destroy(); //釋放資源 //自寫函數,讀取exif信息,返回對象 function my_exif( $myimage ) { $exifArray = array( 'exif:Model' => '未知', 'exif:DateTimeOriginal' => '未知', 'exif:ExposureProgram' => '未知', 'exif:FNumber' => '0/10', 'exif:ExposureTime' => '0/10', 'exif:ISOSpeedRatings' => '未知', 'exif:MeteringMode' => '未知', 'exif:Flash' => '關閉閃光燈', 'exif:FocalLength' => '未知', 'exif:ExifImageWidth' => '未知', 'exif:ExifImageLength' => '未知' ); //初始化部分信息,防止無法讀取照片exif信息時運算發生錯誤 $exifArray = $myimage->getImagePropertIEs( "exif:*" ); //讀取圖片的exif信息,存入$exifArray數組 //如果需要顯示原數組可以使用print_r($exifArray); $r->row1 = '相機:' . $exifArray['exif:Model']; $r->row1 = $r->row1 . ' 拍攝