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();
}
}
}