一般用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 . ' 拍攝