在使用php開發之中大家都習慣使用gb類庫來處理映像資訊,但是函數很多的gb類庫也是很頭疼,使用起來要一個個的查詢函數和看官方手冊,下面將介紹一個很強大的影像處理工具----ImageMagick,這個在liunx下面處理映像資訊將會更簡潔。
先看一下百度百科的介紹:
ImageMagick是一套功能強大、穩定而且免費的工具集和開發包,可以用來讀、寫和處理超過89種基本格式的圖片檔案,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根據web應用程式的需要動態產生圖片, 還可以對一個(或一組)圖片進行改變大小、旋轉、銳利化、減色或增加特效等操作,並將操作的結果以相同格式或其它格式儲存。對圖片的操作,即可以通過命令列進行,也可以用C/C++、Perl、Java、PHP、Python或Ruby編程來完成。同時ImageMagick提供了一個高品質的2D工具包,部分支援SVG。現在,ImageMagic的主要精力集中在效能、減少bug以及提供穩定的API和ABI上。
功能
1. 將圖片從一個格式轉換到另一個格式,包括直接轉換成表徵圖。
2. 改變尺寸、旋轉、銳利化(sharpen)、減色、圖片特效
3. 縮圖片的合成圖( a montage of image thumbnails)
4. 適於web的背景透明的圖片
5. 將一組圖片作成gif動畫,直接convert
將幾張圖片作成一張組合圖片,montage
在一個圖片上寫字或畫圖形,帶文字陰影和邊框渲染。
8. 給圖片加邊框或架構
9. 取得一些圖片的特性資訊
10,幾乎包括了gimp可以作到的常規外掛程式功能。甚至包括各種曲線參數的渲染功能。只是那命令的寫法,夠複雜。 ImageMagick幾乎可以在任何非專有的作業系統上編譯,無論是32位還是64位的CPU,包括LINUX,Windows '95/'98/ME/NT 4.0/2000/XP, Macintosh (MacOS 9 /10), VMS 和 OS/2.
安裝:
ImageMagick提供多個版本 liunx, mac, win 都可以使用
具體的安裝和下載可以查考官網:http://www.imagemagick.org/script/index.php
下面是對其比較常用的功能介紹:
1.對使用者上傳圖片進行縮放 對於使用者自己上傳的圖片不能簡單的 用css限制大小,因為這樣每次載入圖片時候還是會載入整幅大圖。佔用多餘的寬頻,並且影響頁面載入速度。應該根據實際顯示需要進行縮放。比如我想要使用者相簿裡的圖片大小不能超過500x300: 用ImageMagick處理起來很簡單 Im代碼
convert -resize "500x300>" input.jpg output.jpg #如果圖片比500x300小就保持原樣,以防小圖片被放大失真。
2.產生不同比例縮圖 一般相簿等應用,都會提供縮圖和預覽圖,這些縮圖同樣不能簡單的用css來限制大小,要為每個圖片產生不同比例的預覽圖。
3.去除多餘資訊 Exif資訊是數位相機在拍攝過程中採集的一系列資訊,這些資訊放置在我們熟知的jpg檔案的頭部,也就是說Exif資訊是鑲嵌在JPEG影像檔格式內的一組拍攝參數,主要包括攝影時的光圈、快門、ISO、日期時間等各種與當時攝影條件相關的訊息,相機品牌型號,色彩編碼,拍攝時錄製的聲音以及全球定位系統(GPS)等資訊。簡單的說,它就好像是傻瓜相機的日期列印功能一樣,只不過Exif資訊所記錄的資訊更為詳盡和完備。不過,具有Exif資訊的JPEG影像檔要比普通的JPEG檔案略大一點。還有就是像PS這種軟體處理過的圖片會有“program
comments”。如果不是專業的攝影類網站,這些資訊是沒有用的,可以去掉:
Im代碼
convert -strip input.jpg output.jpg
4.調節壓縮比 大多時候,我們的網站並不需要那麼清晰的圖片,適量調節JPG圖片的壓縮比會減少圖片大小,肉眼並不會分辨出品質被壓縮後的圖片。通常75%是最佳比例。
Im代碼
convert -quality 75% input.jpg output.jpg
上面幾個步驟可以一次搞定:
Im代碼
convert -resize "500x300" -strip -quality 75% input.jpg output.jpg
上面說的都是針對JPG格式的處理方式,下面說一下BMP,GIF,PNG等格式的處理。 對於BMP直接轉成JPG就可以了。再按照上面的方式處理。 而GIF和PNG貌似有些特殊。GIF的一些特性(動畫效果,透明等)是JPG沒有的,可以根據實際情況選擇轉或不轉,如果轉換成jpg,取第一幀只需要這樣:
Im代碼
convert -format jpg input.gif input.jpg
PNG也可以通過減少PNG圖片color數量的辦法達到壓縮的目的。但是這種辦法壓縮出來的映像可以明顯看出來失真,而且呈鋸齒狀。 對於真實世界的PNG圖片(通常指照片),一般先轉換成JPG,再通過上面的辦法來壓縮。 但是要注意一點,透明或半透明的PNG圖片在轉換成JPG時透明部分會變成黑色。。。建議做帳戶圖片時候不要轉成JPG。。很難看~~~ 本人頭像就是深受毒害。。 關於圖片副檔名 發現大部分網站喜歡把使用者上傳的圖片(頭像,相簿等)都統一轉成特定格式(一般都是jpg)。這樣做的潛在弊端就是在用像ImageMagick這樣的軟體處理的時候會根據副檔名做隱式格式轉換。
個人覺得在儲存圖片的時候不加副檔名處理起來更靈活一些。
注:把上面的命令列用mini_magick改寫用到rails裡很容易的。mini_magick本質就調用系統命令列嘛~~
具體執行個體:下面是一個圖片上傳類:
實現對圖片大小的統一縮放
/*** @filesource upload.func.php* 上傳圖片, 需要 ImageMagick*//*** 上傳檔案*$size:大小(格式100x100,中間是小寫x)* 傳回值:* 0 檔案類型錯誤*/function upFile($size, $subdir){set_time_limit(0);$fileType = array("jpg","gif","bmp","jpeg","png");$upPath = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'rooms'.DIRECTORY_SEPARATOR.'Img'.DIRECTORY_SEPARATOR.$subdir.DIRECTORY_SEPARATOR;// if(file_exists($upPath)) unlink($upPath);mkdir($upPath);if( !is_dir($upPath))mkdir($upPath);$a = strtolower( pathinfo($_FILES['uploadfile']['name'], PATHINFO_EXTENSION) );//判斷檔案類型if(!in_array( $a, $fileType )) {//$text=implode(",",$fileType);return 2; //echo "您只能上傳以下類型檔案: ",$text,"<br>";} else{ //產生目標檔案的檔案名稱 $filename=explode(".", $_FILES['uploadfile']['name']);do{ $filename[0]=$size; //圖片名稱按尺寸命名$name=implode(".", $filename);$uploadfile= $upPath.$name;}while( file_exists($uploadfile) );try {if ( copy($_FILES['uploadfile']['tmp_name'], $uploadfile) ){///usr/bin/convertexec("/usr/local/imagemagick/bin/convert -resize '{$size}>!' {$uploadfile} {$uploadfile}");return "/kkyoo/rooms/icoImg/{$subdir}/".$name;}}catch (Exception $e){echo $e->getMessage();}}return 0;}//END func upFile