程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 用Imagick替代php的GD庫

用Imagick替代php的GD庫

編輯:PHP綜合

一般用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,則說明安裝成功。

用Imagick替代php的GD庫

詳細安裝可參考 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 . ' 拍攝
        
        

							
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved