圖片處理神器ImageMagick以及PHP的imagick擴充____PHP

來源:互聯網
上載者:User

為了提高頁面的載入速度,以及減少流量,要針對網站的圖片進行瘦身,研究了很多的解決方案,最後確定了使用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();}}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.