為了提高頁面的載入速度,以及減少流量,要針對網站的圖片進行瘦身,研究了很多的解決方案,最後確定了使用ImageMagick,瞭解了這個軟體之後,真是如獲至寶,簡直太好用,效果太明顯了。
ImageMagick介紹:
ImageMagick是一套功能強大、穩定而且開源的工具集和開發包,可以用來讀、寫和處理超過89種基本格式的圖片檔案,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根據 web應用程式的需要動態產生圖片, 還可以對一個(或一組)圖片進行改變大小、旋轉、銳利化、減色或增加特效等操作,並將操作的結果以相同格式或其它格式儲存,對圖片的操作,即可以通過命令列進行,也可以用C/C++、Perl、Java、PHP、Python或Ruby編程來完成。同時ImageMagick提供了一個高品質的2D工具包,部分支援SVG。ImageMagic的主要精力集中在效能,減少bug以及提供穩定的API和ABI上。 ImageMagick 是一個用來建立、編輯、合成圖片的軟體。它可以讀取、轉換、寫入多種格式的圖片。圖片切割、顏色替換、各種效果的應用,圖片的旋轉、組合,文本,直線, 多邊形,橢圓,曲線,附加到圖片伸展旋轉。ImageMagick是免費軟體:全部源碼開放,可以自由使用,複製,修改,發布。支援大多數的作業系統。
ImageMagick的命令概覽
[ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjure ]
convert:轉換映像格式和大小,模糊,裁剪,驅除汙點,抖動,臨近,圖片上畫圖片,加入新圖片,產生縮圖等。
identify:描述一個或較多影像檔的格式和特性。
mogrify:按規定尺寸***一個映像,模糊,裁剪,抖動等。Mogrify改寫最初的影像檔然後寫到一個不同的影像檔。
composite:根據一個圖片或多個圖片組合產生圖片。
montage:建立一些分開的要素映像。在含有要素映像任意的裝飾圖片,如邊框、結構、圖片名稱等。
compare:在算術上和視覺上評估不同的圖片***其它的改造圖片。
display:如果你擁有一個X server的系統,它可以按次序的顯示圖片
animate:利用X server顯示動畫圖片
import:在X server或任何可見的視窗上輸出圖片檔案。 你可以捕獲單一視窗,整個的熒屏或任何熒屏的矩形部分。
conjure:解釋執行 MSL (Magick Scripting Language) 寫的指令碼。
安裝:
sudo apt-get install imagemagick
常見用例:
影響圖片大小(佔用空間)主要取決於圖片的profile和quality。 quality:圖片的品質,品質越高,佔用的空間越大。適當降低品質能很大程度的減少圖片的尺寸。一般來說,從品質100降到85,基本上肉眼很難區別其差別,但尺寸上減少很大。imagemagick通過通過-quality 來設定。 profile:記錄圖片一些描述資訊。例如相機資訊(光圈,相機型號)、photoshop中繼資料,顏色表等資訊。它佔用的空間可以從幾KB到幾百KB,甚至可能更大。ImageMagicK可以通過兩種方式來去掉這些資訊。+profile “*” 或 -strip
Exif資訊是數位相機在拍攝過程中採集的一系列資訊,這些資訊放置在我們熟知的jpg檔案的頭部,也就是說Exif資訊是鑲嵌在JPEG影像檔格式內的一組拍攝參數,主要包括攝影時的光圈、快門、ISO、日期時間等各種與當時攝影條件相關的訊息,相機品牌型號,色彩編碼,拍攝時錄製的聲音以及全球定位系統(GPS)等資訊。簡單的說,它就好像是傻瓜相機的日期列印功能一樣,只不過Exif資訊所記錄的資訊更為詳盡和完備。不過,具有Exif資訊的JPEG影像檔要比普通的JPEG檔案略大一點。還有就是像PS這種軟體處理過的圖片會有“program comments”。如果不是專業的攝影類網站,這些資訊是沒有用的,可以去掉:
convert +profile “*” -strip src.jpg src-profile.jpg
降低圖片的quality品質來壓縮圖片:
convert -quality 85 src.jpg src-quality85.jpg
上面兩個命令結合到一起使用:
find /tmp/images -iname "*.jpg" -exec convert -strip +profile "*" -quality 80 {} {} \;
經過這兩個命令的處理,你的圖片絕對可以縮小很多。 PS:根據我的經驗,把png圖片轉換為jps圖片會減小很多,然後再用以上兩個命令處理一下,那就完美了。
PNG也可以通過減少PNG圖片color數量的辦法達到壓縮的目的。但是這種辦法壓縮出來的映像可以明顯看出來失真,而且呈鋸齒狀。
對於真實世界的PNG圖片(通常指照片),一般先轉換成JPG,再通過上面的辦法來壓縮。
convert -format jpg input.png input.jpg
對使用者上傳圖片進行縮放 對於使用者自己上傳的圖片不能簡單的 用css限制大小,因為這樣每次載入圖片時候還是會載入整幅大圖。佔用多餘的寬頻,並且影響頁面載入速度。應該根據實際顯示需要進行縮放。比如我想要使用者相簿裡的圖片大小不能超過500x300:
convert -resize "500x300>" input.jpg output.jpg #如果圖片比500x300小就保持原樣,以防小圖片被放大失真。
下面說一下安裝php的imgick擴充,來處理圖片:
安裝:
1.安裝imgick擴充
1) sudo apt-get install libmagick-dev2) sudo apt-get install php-pear php5-dev3) sudo pecl install imagick
2.編輯php.ini檔案,使其載入
開啟php.ini檔案,在其中加入extension=imagick.so
/etc/php5/apache2/php.ini
重啟apache服務使其失效
/etc/init.d/apache2 restart
附上一個簡單的例子,用來轉換圖片格式的:
$thumb = new Imagick();$thumb->readImage('test.gif');$thumb->writeImage('test.jpg');$thumb->clear();$thumb->destroy();
用法太多了,我就不一一列舉了,提供一下資料供大家學習:
Imgick Class API:http://php.net/manual/en/class.imagick.php
圖片壓縮心得:http://blog.lizhigang.net/archives/228
ImageMagick官網:http://www.imagemagick.org/script/index.php
http://elf8848.iteye.com/blog/382528
使用執行個體:http://hi.baidu.com/7soon/item/d394c2b55bd3bb70254b09ed
最後,附上我自己編寫的PHP用Imgick處理圖片的類:
/* * 圖片壓縮類 重新封裝了Imagick * * @version 2014-07-30 * @author andy1219111@163.com */class Imgick_tool{//Imagick對象執行個體public $obj = null;public function __construct(){//判斷是否載入了該擴充if(!extension_loaded('Imagick')){return false;}$this->obj = new Imagick();}/* * png2jpg轉換圖片格式 * * @param string src_img 源圖片路徑 * @param string dest_img 要產生的圖片的路徑 * @return boolean 轉換成共返回true 否則false */public function png2jpg($src_img,$dest_img){if(!is_object($this->obj)){return false;}try{$this->obj->readImage($src_img);if($this->obj->writeImage($dest_img)){$this->destory();return $dest_img;}return false;}catch (ImagickException $e){return false;}}/* * 去掉圖片的profile資訊 * * @param string src_img 源圖片路徑 * @return string src_img 圖片名稱 否則返回false */public function strip_profile($src_img,$dest_img = ''){if(!is_object($this->obj)){return false;}try{$dest_img = empty($dest_img) ? $src_img : $dest_img;$this->obj->readImage($src_img);$this->obj->stripImage ();if($this->obj->writeImage ($dest_img)){$this->destory();return $src_img;}return false;}catch (ImagickException $e){return false;}}/* * 設定jpg圖片品質 * * @param string src_img 源圖片路徑 * @param string dest_img 要產生的圖片的路徑 * @return boolean 轉換成共返回true 否則false */public function set_quality($src_img,$quality = 70,$dest_img = ''){if(!is_object($this->obj)){return false;}try{$dest_img = empty($dest_img) ? $src_img : $dest_img;$this->obj->readImage($src_img);$this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);$this->obj->setImageCompressionQuality($quality);if($this->obj->writeImage($dest_img)){$this->destory();return $dest_img;}return false;}catch (ImagickException $e){return false;}}/* * 圖片瘦身 * * @param string src_img 源圖片路徑 * @param int quality 設定圖片壓縮品質 * @param string dest_img 要產生的圖片的路徑 * @return boolean 轉換成共返回true 否則false */public function slimming($src_img,$quality = 60,$dest_img = '',){if(!is_object($this->obj)){return false;}try{$dest_img = empty($dest_img) ? $src_img : $dest_img;$this->obj->readImage($src_img);$this->obj->setImageFormat('jpeg');$this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);//將圖片的品質降低到原來的60%$quality = $this->obj->getImageCompressionQuality() * $quality / 100;$this->obj->setImageCompressionQuality($quality);$this->obj->stripImage(); if($this->obj->writeImage($dest_img)){$this->destory();return $dest_img;}return false;}catch (ImagickException $e){return false;}}/* * 產生縮圖 * * @param string src_img 源圖片路徑 * @param int quality 設定圖片壓縮品質 * @param string dest_img 要產生的圖片的路徑 * @return boolean 轉換成共返回true 否則false */public function thump($src_img,$width = 250,$height = ''){if(!is_object($this->obj)){return false;}try{$file_info = pathinfo($src_img);//產生縮圖名稱$file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.'));$dest_img = $file_info['dirname'] . '/' . $file_name . '_thump.' . $file_info['extension'];$this->obj->readImage($src_img);//計算要獲得縮圖的高度$img_width = $this->obj->>getImageWidth();$img_height = $this->obj->>getImageHeight();$dest_height = $img_height * ($width / $img_width);$this->obj->resizeImage($width, $dest_height, Imagick::FILTER_CATROM, 1, false);//產生圖片if($this->obj->writeImage($dest_img)){$this->destory();return $dest_img;}return false;}catch (ImagickException $e){return false;}}/* * 釋放資源 * */function destory(){if(is_object($this->obj)){$this->obj->clear();$this->obj->destroy();}}}