文章標簽 ‘ImageMagicK’

mac os lion php 調用imagemagick命令失敗

2013年7月9日 沒有評論

環境為Mac OS lion,在php中使用exec調用外部imagemagick命令進行圖片處理,圖片沒有被處理,查看命令返回的狀態碼為5,沒有任何提示,相同的命令在命令行中可以正常執行。為了獲取具體的錯誤信息還花費了一番力氣,關于獲取錯誤輸出可以參考:PHP 執行外部命名獲取出錯信息
上述錯誤信息為:

dyld: Library not loaded: /ImageMagick-6.7.5/lib/libMagickCore.5.dylib
  Referenced from: /usr/bin/convert

從錯誤信息可以得知命令沒有加載到Library,從Imagemagick官網看到Mac OS下安裝需要配置DYLD_LIBRARY_PATH,它的路徑就是Imagemagick安裝路徑下的lib目錄。由于在/etc/bashrc中配置了,所以命令行下執行是正常的。通過web方式執行php環境不一樣,沒有加載DYLD_LIBRARY_PATH配置,因此導致執行出錯。有了錯誤信息,也知道錯誤的原因,解決起來就很簡單了,只需要在執行命令的前面添加DYLD_LIBRARY_PATH配置即可。例如:

$cmd = 'export DYLD_LIBRARY_PATH="/{imagemagick install home}/lib/" && ';
$cmd .= 'convert -resize 120x60 src.jpg desc.jpg';
exec($cmd);
分類: ImageMagicK 標簽:

imagemagick圖片反色處理

2011年9月27日 2 條評論

圖片反色處理通過convert的negate參數來實現,同時可以針對制定的區域進行反色。

  • 整個圖片進行反色出來
convert -negate src.jpg negate.jpg

效果圖如下:

原始圖片 反色處理后圖片

  • 部分區域反色
convert -region 100x100+0+0 -negate src.jpg negate-part-1.jpg

convert -gravity center -region 100x100+0+0 -negate src.jpg negate-part-2.jpg

注意:regoin參數需要在negate前,否則無法對指定的區域進行反色處理。另外關于gravity參數詳細信息請參考:ImageMagicK之gravity參數詳解

ImageMagick之圖片裁剪

2011年8月31日 沒有評論

imagemagick的convert命令通過crop參數,可以把一幅大圖片分成若干塊大小一樣的圖片,同時也可以在大圖上截取一塊圖片來。命令格式為

convert 原始圖片 -crop widthxheight+x+y 目標圖片

其中widthxheight是目標圖片的尺寸,+x+y是原始圖片的坐標點,這兩組值至少要出現一組,也可以同時存在。另外該命令也可使用gravity來重新定義坐標系統。關于更多gravity的信息,請參考:ImageMagicK之gravity參數詳解。下面介紹幾種常用的命令。

  • 把原始圖片分割成多張小圖
convert src.jpg -crop 100x100 dest.jpg

假設src.jpg的大小是300x200,執行命令后將得到名為dest-0.jpg、dest-1.jpg...dest-5.jpg
的6張大小為100x100的小圖片。注意如果尺寸不是目標圖片的整數倍,那么右邊緣和下邊緣的一部分圖片就用實際尺寸
  • 在原始圖片上剪裁一張指定尺寸的小圖
convert src.jpg -crop 100x80+50+30 dest.jpg
在原始圖片的上距離上部30像素左部50為起點的位置,分別向左向下截取一塊大小為100x80的圖片。如果x相對于坐標,寬度不夠100,那就取實際值。

convert src.jpg -gravity center -crop 100x80+0+0 dest.jpg
在原始圖上截取中心部分一塊100x80的圖片

convert src.jpg -gravity southeast -crop 100x80+10+5 dest.jpg
在原始圖上截取右下角距離下邊緣10個像素,右邊緣5個像素一塊100x80的圖片

ImageMagick之圖片縮放

2011年8月30日 沒有評論

利用ImageMagicK的convert命令,能很方便的實現圖片的放大縮小,可以進行等比例縮放,也能縮放到指定的固定大小。縮放的參數resize,由它來指定縮放后圖片的寬高,比如“200×100”。

  • 等比縮放 例如把圖片a.jpg縮放到200×100的尺寸,可以用命令:
convert -resize 200×100 src.jpg dest.jpg

注意:雖然明確指定了圖片大小為200×100,但dest.jpg的不一定就是200×100,因為是等比縮放的,dest.jpg大小取決原始圖片比例。假設src.jpg的大小是500×200,那么縮放后dest.jpg的真實大小為200×80,再比如src.jpg的大小是300×200,縮放后的尺寸為150×100。原則是縮放后的尺寸最少有一個是符合寬或高,且另外一個不能大于指定的參數中對應的寬或高。另外可以通過只指定寬或高的方式來進行縮放。例如:

convert -resize 200 src.jpg dest.jpg
得到圖片寬為200,高根據原始圖片比例計算而來

convert -resize x100 src.jpg dest.jpg
得到的圖片高位100,寬根據原始圖片比例計算而來
  • 固定寬高縮放。即不考慮原是圖寬高的比例,把圖片縮放到指定大小。例如命令:
convert -resize 200x100! src.jpg dest.jpg

說明:區別是寬高后面多了一個嘆號,此時不管原圖片比例如何,縮放后的圖片大小都是200×100,這樣就可能導致圖片變形。注意:在linux環境對參數需要用單引號引起來,而windows下又不能使用單引號。

  • 有條件縮放。可以通過>或<符號來控制原始圖片是否進行縮放,例如在處理一批尺寸大小各異的圖片,只想把尺寸大于給定的值圖片才進行縮小,如果沒有指定條件,可能會把那些小的圖片進行了放大處理。
convert -resize "200x100>" src.jpg dest.jpg
注解:只有當src.jpg的寬大于200或高大于100時候,才進行縮小處理,
否則生成的dest.jpg和src.jpg具有一樣的尺寸。
注意在linux下要用單引號替換成雙引號,即'200x100>'。

convert -resize "200x100<"?src.jpg dest.jpg
注解:只有當src.jpg的寬小于200或高小于100時候,才進行放大處理,
否則生成的dest.jpg和src.jpg具有一樣的尺寸。
注意在linux下要用單引號替換成雙引號,即'200x100<'

上述兩種有條件縮放是按原始圖等比例縮放的,也就是對符合條件的圖片進行等比縮放。同時有條件縮放也可以與固定大小縮放聯合起來用。例如如下命令。

convert -resize "800x100>!" src.jpg dest.jpg
注解:假設src.jpg尺寸是300x200。很顯然src.jpg的高(200)是大于指定值高(100),
符合縮小的條件,由于執行的不是等比縮放,
所以dest.jpg的尺寸理論上是800x100,由于執行是縮小操作
顯然800是超過原始圖片寬的,故dest.jpg的寬只能是300

convert -resize "10x1000<!" src.jpg dest.jpg
注解:假設src.jpg尺寸是300x200,src.jpg的高(200)小于指定值高(1000),
因此該命令將執行放大圖片操作,dest.jpg的高將放到到1000,
由于目標圖片寬比原始圖片還小,但是執行的是放大操作,因此只能用原始圖片的寬,
所以得到的dest.jpg的尺寸是300x1000。

利用ImageMagicK給圖片加水印

2011年8月27日 2 條評論

現在很流行給自己網站的圖片加上水印,水印可能是文字,也可能是網站的logo等。圖片水印比較簡單,就是把自己水印圖標合成到原始圖片上;文字水印中如果字符包含中文,處理就稍微麻煩一些。

圖片水印處理

假設把名為logo.gif的水印圖標添加在原始圖片(src.jpg)右下角,且水印的下邊緣距原始圖片10像素、右邊緣距原始圖片5像素。使用如下命令即可:

convert src.jpg logo.gif -gravity southeast -geometry +5+10 -composite dest.jpg

文字水印處理

如果不含中文字符,可以直接通過convert draw text的方式將文字添加到圖片,否則就需要使用其它的辦法。命令行中不能包括中文字符,但是能通過讀取文件的方式來操作,即先把中文信息保存文本文件中。注意:文本文件的編碼最好用UTF-8,同時也需要選取一個支持中文的字體。直接把文本文本中的信息輸出到圖片上使用命令mogrify,不過也可以使用convert命令把文本文件中的信息生成一個圖片,然后再把圖片合成到原始圖片中。下面分別介紹這幾種方法。

  • 不含中文字符:例如把www.twubdg.tw作為水印加上圖片上,命令如下
convert src.jpg -gravity southeast -fill black -pointsize 16 -draw "text 5,5 'http://www.twubdg.tw'" dest-c.jpg

mogrify -pointsize 16 -fill black -weight bolder -gravity southeast -annotate +5+5 "http://www.twubdg.tw" src.jpg

說明:上述兩條命令達到同樣的結果,但是第一次命令可以保留原始圖片,第二條是直接在原始圖片上打上水印。

  • 存在中文的情況:假設存有信息的文件叫t.txt,字體文件是msyh.ttf。
方法1:
//把文件t.txt中的信息生成圖片txt.png, -transparent white讓圖片的背景透明,-size x30設置圖片的高度
convert -transparent white -font msyh.ttf -fill black -pointsize 24 label:@t.txt txt.png
//把txt.png合成到src.jpg上
convert src.jpg txt.png -gravity southeast -geometry +10+5 -composite dest.jpg

方法2:
convert src.jpg -transparent white -font msyh.ttf -fill black -pointsize 24 -size x30 label:@t.txt -gravity southeast -geometry +10+5 -composite dest.jpg

方法3:
mogrify -font msyh.ttf -pointsize 24 -fill black -weight bolder -gravity southeast -annotate +20+20 @"t.txt" src.jpg

說明:上述第一、二種方法都有瑕疵,第二種背景不能變成透明,第一種雖然生成的圖片可以透明,但是合成到原始圖上效果不是很理想,第三種是完全透明的,所以推進用第三種方式來操作。

ImageMagicK之gravity參數詳解

2011年8月27日 沒有評論

使用gravity重新定義坐標后,可以很容易讓子元素與父元素的對齊方式達到想要的效果,讓一切變得非常簡單。比如把一張小圖片疊加到背景圖片的正中位置,按照默認的坐標系統,那必須要先知道背景圖片和小圖片的寬度以及高度,然后才能計算出起始點的坐標,再通過-geometry來設置坐標點。如果使用gravity,把其設置center,即把中心作為坐標的原點,那么根本不需要計算起始坐標點,ImageMagicK會自動把小圖片放置在背景的正中央位置,-geometry默認是+0+0。gravity不僅影響父元素的坐標系統,而且子元素的重心點(或者叫參照點)也隨之改變。舉例來說,當gravity值為southeast,父元素的坐標原點變為右下角了,x軸方向是從右到左,y軸方向從下到上;子元素重心點也是右下角,所以geometry設置的坐標點就是子元素的右下角相對父元素右下角的位置。gravity會影響通過geometry、annotate、region等來定義坐標點。

gravity可用值有九個,分別是:

  • NorthWest:左上角為坐標原點,x軸從左到右,y軸從上到下,也是默認值。
convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity northwest -geometry +10+10 -composite -size 100x50 xc:yellow -gravity northwest -geometry +110+60 -composite -gravity northwest -fill red -pointsize 24 -draw "text 110,60 'hello netingcn.com!'" nw.png

說明:創建一個灰色的400×120的背景,分別把兩個100×50的小圖片放置在背景上的(10,10)和(110,60)的位置,同時通過draw在圖片輸入一段文本,小圖片和文本的參照點是左上角,效果如下圖。

  • North:上部中間位置為坐標原點,x軸從左到右,y軸從上到下。
convert -size 400x120 xc:gray -size 100x50 xc:blue -gravity north -geometry +10+10 -composite -size 100x50 xc:yellow -gravity north -geometry +110+60 -composite -fill red -pointsize 24 -gravity north -draw "text 0,60 'hello netingcn.com!'" n.png

說明:小圖片和文字的參照點是上部中間位置,效果如下圖。

  • NorthEast:右上角位置為坐標原點,x軸從右到左,y軸從上到下。 閱讀全文…
分類: ImageMagicK 標簽: ,

ImageMagicK的convert參數draw筆記

2011年8月26日 沒有評論

convert通過draw可以在已有的圖片上繪制一些文字、線條、形狀等。可能會用text、line、rectangle、roundRectangle、circle、ellipse等,下面逐一來說明。

  • text,把一段文本繪制到已有圖片上。基本命令格式:convert 圖片 -draw “text x坐標,y坐標 ‘文本信息’” ?結果圖片,另外還可有一些參數是可以設置的,比如字體,字體大小,字體顏色已經重新定義坐標原點。
convert -size 512x50 xc:gray -gravity southeast -fill red -pointsize 24  -draw "text 20,5 'hello netingcn.com!'"  txt.png

上述命令中使用gravity來重新定義坐標,關于gravity的更多信息,請參考ImageMagicK之gravity參數詳解,-fill 設置文字的顏色,顏色能夠使用類似#ff00ff的方式,但是需要用雙引號引起來,-pointsize 24設置文字的大小, -draw 后面引號中第一個單詞是text,表明是在圖片上繪制一個設置的文本,20是x坐標,5則是y坐標,hello netingcn.com!是繪制到圖片上的文本信息,如果文本信息中含有空格,需要用單引號引起來,沒有空格也可以用單引號,所以建議總是使用單引號。不過遺憾的是不能把中文通過這種方式繪制到圖片,要把中文加在圖片是,需要另外的方法。結果如下圖:

  • line,在圖片上繪制一條直線,基本命令格式:convert 圖片 -draw “line 起點x坐標,起點y坐標 ?終點x坐標,終點y坐標” ?結果圖片,可以使用的參數有-stroke 來指定線條的顏色,-strokewidth 指定線的寬度。
convert -size 512x50 xc:gray -stroke white -strokewidth 4 -draw "line 10,25 500,25" line.png

  • rectangle、roundRectangle,兩者功能都是在圖片上繪制一個矩形,前者是直角,后者可以繪制圓角。
convert -size 150x150 xc:gray -stroke red -strokewidth 2 -fill white -draw "Rectangle 10,10 140,140" rect-1.png

convert -size 150x150 xc:gray -stroke red -strokewidth 2 -fill white -draw "roundRectangle 10,10 140,140 8,8" rect-2.png

說明:參數-stroke 來指定邊框的顏色,-strokewidth 指邊框的寬度,-fill 矩形的填充顏色,可以用none設置為不填充任何顏色,如果沒有-fill參數,默認填充為黑色,Rectangle 與roundRectangle 后第一組參數是確定矩形左上角的坐標,第二組是確定右下角的坐標,roundRectangle的第三組參數是確定圓角的幅度,如果是0,0話,就是直角,所以可以直接用roundRectangle 來代替Rectangle 。示例圖片如下:

  • circle、ellipse,分別繪制圓和橢圓。其實也可以用橢圓來完成圓的繪制。下面用例子說明:
convert -size 140x140 xc:gray -stroke red -strokewidth 2 -fill white -draw "circle 70,70 5,70" circle.png

convert -size 140x140 xc:gray -stroke red -strokewidth 2 -fill white -draw "ellipse 70,70 65,65 0,360" ellipse-1.png

convert -size 140x140 xc:gray -stroke red -strokewidth 2 -fill white -draw "ellipse 70,70 60,30 0,360" ellipse-2.png

convert -size 140x140 xc:gray -stroke red -strokewidth 2 -fill white -draw "ellipse 70,70 60,30 90,270" ellipse-3.png

說明:同矩形一樣,參數-stroke 來指定邊框的顏色,-strokewidth 指邊框的寬度,-fill 矩形的填充顏色,可以用none設置為不填充任何顏色。circle和ellipse中的第一組參數都是代表圓心的坐標,但是他們第二組參數含義不同,circle的第二組參數是圓的任何一邊緣坐標,所以圓的半徑就是兩組坐標的距離,ellipse的第二組參數中的第一個是橫向的最大長度、第二個是縱向最大高度,第三組參數是繪制的區間,區間是0~360度,0度是原點開始到從左到右,度數是順時針方向。有了這個參數就可以很容易繪制半圓,1/4圓,乃至圓的任何一部分,所以ellipse比circle的功能更加強大。上述的第二條命令完成和第一條命令同樣的事。示例圖片如下:

ImageMagicK制作gif圖片

2011年8月26日 沒有評論

gif動畫由一系列圖片按照一定的時間間隔來播放的,每張單獨的圖片作為gif動畫的一幀。使用ImageMagicK的convert命令很容易獲取gif動畫中的每楨圖片,例如命令?convert exam.gif p.png ,?就會把生產 p-0.png,p-1.png 等一系列圖片。gif動畫的原理就是把一些列動畫合成在一起。所以通過convert很容易做到。例如命令 convert *.jpg ?dest.gif ,?是把當前目錄下的所有 jpg格式的圖片生成一個名為dest.gif的文件,有兩個參數比較重要,分別是-delay和-loop,其中-delay是控制每楨的切換時間,-loop是控制gif動畫的播放次數,默認是0,0表示無盡的循環播放。

如果想控制每楨的間隔時間不一致,可以使用類似?convert -delay 50 0.jpg 1.jpg -delay 100 2.jpg 3.jpg 4.jpg dest.gif 這樣的操作來完成,甚至可以先制作兩個臨時的gif,然后把臨時的gif合成自己想要的,例如

convert -delay 50 0.jpg 1.jpg t1.gif
convert -delay 100 2.jpg 3.jpg 4.jpg t2.gif
convert t1.gif t2.gif dest.gif

通過上述的素材加一個logo圖片制作一個如下的gif動畫

?

convert -size 84x200 xc:"#f396eb" bg.gifconvert bg.gif logo.gif -geometry +2+2 -composite bg.gif

convert bg.gif 0.jpg -geometry +2+55 -composite 0.png
convert bg.gif 1.jpg -geometry +2+55 -composite 1.png
convert bg.gif 2.jpg -geometry +2+55 -composite 2.png
convert bg.gif 3.jpg -geometry +2+55 -composite 3.png
convert bg.gif 4.jpg -geometry +2+55 -composite 4.png

convert -delay 50 *.png dest1.gif

說明:思路是先創建一張空白背景圖片,然后把logo合成在背景上,再依次把素材的每張圖片和背景生成一張新圖片作為gif動畫的一幀,最后使用convert把每楨圖片合成一張gif 。這樣的缺點是生成的gif圖片尺寸會比較大,下面的方法能改進在尺寸上的缺點,但是在gif的循環上又有點不足。

convert -delay 50 *.jpg t.gif
convert -size 84x200 xc:"#f396eb" bg.gif
convert bg.gif logo.gif -geometry +2+2 -composite bg.gif
convert -loop 0 bg.gif -page +2+55 t.gif dest2.gif

 

ImageMagicK之合成圖片

2011年8月26日 沒有評論

ImageMagicK能方便的把多張小圖片合成一張大圖片。合成的方式大致有三種,

  1. 使用convert命令加 +append或-append參數
  2. 使用convert命令加 -composite參數
  3. 直接使用composite命令來完成

其中方式1處理圖片只能左右或上下來拼接圖片,方式2最為靈活,可以一次性把多張圖片合成在一起,方式3處理多張圖片時需要一張一張來處理。下面的例子是把google地圖中的4個256×256塊合成一張512×512的大圖,原始圖片如下:

使用方式1
convert +append u0.png u1.png u.png
convert +append d0.png d1.png d.png
convert -append u.png d.png dest.png

說明:其中 +append 橫向把多張圖片拼接在一起,可以多于2張,圖片按上邊緣對齊,最后一個參數是目標圖片,而-append是縱向拼接圖片,圖片按左邊緣對齊。

使用方式2
convert -size 512x512 -strip -colors 8 -depth 8 xc:none u0.png -geometry +0+0 -composite u1.png -geometry +256+0 -composite d0.png -geometry +0+256 -composite d1.png -geometry +256+256 -composite dest4.png

說明:convert -size 512×512 xc:none 創建一張空白圖片,然后把小圖片合成到其上面。合成的命令大致為:convert 背景圖片 圖片 定義坐標原點 圖片的位置 -composite 目標圖片,其中“圖片 定義坐標原點 圖片的位置 -composite” 可以重復,從而把多張圖片一次性合成到背景圖片上。使用 -gravity 定義坐標原點,默認是左上角,可以用east,north,northwest等來重新定義原點,-geometry相對于原點的位置

使用方式3
convert -size 512x512 -strip -colors 8 -depth 8 xc:none dest1.png
composite -geometry +0+0 u0.png dest1.png dest1.png
composite -geometry +256+0 u1.png dest1.png dest1.png
composite -geometry +0+256 d0.png dest1.png dest1.png
composite -geometry +256+256 d1.png dest1.png dest1.png

說明: composite 定義坐標原點 圖片的位置 圖片 背景圖片 目標圖片

使用ImageMagicK給圖片瘦身

2011年8月26日 沒有評論
影響圖片大小(占用空間)主要取決于圖片的profile和quality。
  • quality:圖片的品質,品質越高,占用的空間越大。適當降低品質能很大程度的減少圖片的尺寸。一般來說,從品質100降到85,基本上肉眼很難區別其差別,但尺寸上減少很大。imagemagick通過通過 -quality 來設置。
  • profile:記錄圖片一些描述信息。例如相機信息(光圈,相機型號)、photoshop元數據,顏色表等信息。它占用的空間可以從幾KB到幾百KB,甚至可能更大。ImageMagicK可以通過兩種方式來去掉這些信息。+profile “*”  或 -strip

下述圖片中第一張原始圖片為56KB,第二張圖片執行了 convert +profile “*” -strip src.jpg src-profile.jpg 后變成了26.3KB, 第三張設置圖片品質為85,convert -quality 85 src.jpg src-quality85.jpg,圖片大小變成了19.5KB,第四張是同時使用去掉profile和設置品質為85, convert -quality 85 -strip src.jpg src-p-q85.jpg,圖片只有18.7KB。經過一個簡單的命令處理,就可以把原始圖片體積減小到原來的的三分之一。一般來說jpg格式的圖片有比較大的操作空間,而png、gif有時候處理了反而變大。所以具體問題需要具體分析。

原始圖片

去掉profile

quality85

最終圖片

在linux下可以很方便把某個目錄下的所有jpg文件來一次瘦身運動,例如命令 find /tmp/images -iname “*.jpg” -exec convert -strip +profile “*” -quality 85 {} {} \; 可以把/tmp/images目錄下所有jpg圖片進行壓縮。

無覓相關文章插件,快速提升流量

30选5怎么中奖