對這文章發表回應
發表限制: 非會員 可以發表
強大的圖片處理工具ImageMagick
一直聽說 ImageMagick,但今天因為需要做一個縮略圖,所以特意瞭解一下ImageMagick。
以前的站點有使用ImageMagick,可以作為PHP的dll使用,也可以用命令行的方式調用。有windows和linux等各個平台的版本,所以要用起來真的是非常方便!不作為PHP的dll,也可以通過exec調用,那更加的不錯,對於喜歡命令行做處理的人,那是相當的方便。
剛開始就想著投入到各個參數的瞭解當中,一片的英文,搞的我頭暈,看來強硬的英文水平是做技術的一個前提了,呵呵。
我想做的就是一個事情,把圖片做縮略圖,關鍵是等比縮小,取中間的部分作為圖片文件。於是剛剛開始就想著看看有哪些參數是幹嘛的,ImageMagick提供太多的功能了,以至於我這類人要瞭解完還真難,瞭解了幾個關鍵參數 -resize -crop,但用這個一步做不出圖片來,而且在windows下面還有部分命令有點問題,比如輸入:
convert aslibra.com.jpg -resize 100x100^ www.aslibra.com.jpg
沒有得到如期的效果,應該是每個邊都大於100,後來知道是需要用引號括起來,windows下還必須是雙引號,但是第一階段做了個讀取圖片寬高,實現該功能的函數:
//by hqlulu @ www.aslibra.com
function img_resize($file,$output,$w=0,$h=0,$method="resize",$center=true){
if(!$w && !$h)return false;
$tmp_file = "tmp_resize.jpg";
if($method == "crop"){
if($center){
//先調整大小
$wh = getimagesize($file);
if(!$wh[0] || !$wh[1])return false;
if(!$w || !$h)return false;
if($wh[0]/$wh[1] >= $w/$h){
img_resize($file,$tmp_file,0,$h);
}else{
img_resize($file,$tmp_file,$w,0);
}
$file = $tmp_file;
}
$c = " -gravity Center ";
$m = " $c -$method {$w}x{$h}+0+0 ";
}else{
if($w && $h){
$m = " -$method {$w}x{$h} ";
}else if($w && !$h){
$m = " -$method {$w} ";
}else if(!$w && $h){
$m = " -$method x{$h} ";
}
}
$cmd = "convert $file $m $output";
exec($cmd,$out);
}
後來看了一下usage,裡面有很多很多的示例,太棒了,簡直一個photoshop的教程:
http://www.imagemagick.org/Usage/
也發現了前面不能實現的功能的原因,同時發現了一句話完成我的需求的方法:
convert www.aslibra.com.jpg -thumbnail "100x100^" -gravity center -extent 100x100 center.gif
函數可以精簡一下了,並且可以加上一個縮略圖的截取部分的比例:
function img_resize($file,$output,$w=0,$h=0,$method="resize",$percent=0){
// == usage ==
//resize by w : img_resize($file,$output,100)
//resize by h : img_resize($file,$output,0,100)
//resize by w&h : img_resize($file,$output,100,100)
//crop by w&h : img_resize($file,$output,100,100,'crop')
//crop by w&h&percent : img_resize($file,$output,100,100,'crop',0.8)
//
//2008-8-14
//by hqlulu
//www.aslibra.com
//
if(!$w && !$h)return false;
if($method == "crop"){
if($percent){
$w1=intval($w/$percent);
$h1=intval($h/$percent);
$m = " -thumbnail \"{$w1}x{$h1}^\" -gravity center -extent {$w}x{$h} ";
}else{
$m = " -thumbnail \"{$w}x{$h}^\" -gravity center -extent {$w}x{$h} ";
}
}else{
if($w && $h){
$m = " -$method {$w}x{$h} ";
}else if($w && !$h){
$m = " -$method {$w} ";
}else if(!$w && $h){
$m = " -$method x{$h} ";
}
}
$cmd = "convert $file $m $output";
exec($cmd,$out);
}
另外,如果有CMYK的圖片,那可以做個強制顏色空間
-colorspace RGB
這個功能就完成了!
以下是原圖和每個命令方式對應的結果:
convert 0.jpg -resize 100 1.jpg
convert 0.jpg -resize x100 2.jpg
convert 0.jpg -resize 100x100 3.jpg
convert 0.jpg -thumbnail "100x100^" -gravity center -extent 100x100 4.jpg
convert 0.jpg -thumbnail "150x150^" -gravity center -extent 100x100 5.jpg
原文出處:強大的圖片處理工具ImageMagick - 阿權的書房 - 技術經驗分享,資料收集,偶爾晾幾張相片,感言生活
本篇最重要得關鍵在:
如果有CMYK的圖片,那可以做個強制顏色空間
-colorspace RGB