linux中ImageMagick與PHP的imagick擴充安裝使用

來源:互聯網
上載者:User


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) 寫的指令碼。

常見用例:

影響圖片大小(佔用空間)主要取決於圖片的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. 下載安裝ImageMagick

    wget http://www.imagemagick.org/download/legacy/ImageMagick-6.6.8-10.tar.gz
    tar -xzvf ImageMagick-6.6.8-10.tar.gz 
    ./configure –prefix=/usr/local/imagemagick 
    make 
    make install
2. 下載安裝Imagick

註:安裝該擴充不要求安裝ImageMagick

從http://pecl.php.net/package/imagick找到imagick的最新的版本

    wget http://pecl.php.net/get/imagick-3.1.0RC1.tgz    
    tar -xzvf imagick-3.1.0RC1 
    phpize 
    ./configure –with-php-config=/usr/local/php/bin/php-config –with-imagick=/usr/local/imagemagick 
    make 
    make install
make install執行結果顯示:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files:          /usr/local/php/include/php/
產生imagick.so到/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/,然後手動設定php.ini使其生效


/*
 * 圖片壓縮類  重新封裝了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.