1. 命令的結(jié)構(gòu)
ImageMagick 的命令行由下面這些元素構(gòu)成:
一個, 或多個文件名.
零個, 一個, 或多個圖像設(shè)置項.
零個, 一個, 或多個圖像操作項.
零個, 一個, 或多個圖像序列操作項.
零個, 一個, 或多個圖像組.
零個, 或一個圖像輸出名(convert, composite, montage, compare, import, conjure).
2. 輸入文件名
ImageMagick 擴(kuò)展了“輸入文件名”它原本的含義, 現(xiàn)在它包括了:
文件名通配符.
明確的圖片格式.
內(nèi)置圖像或圖案.
標(biāo)準(zhǔn)的輸入輸出, 文件描述符.
選取圖片的某些幀.
選擇圖片部分區(qū)域.
縮放了的內(nèi)嵌圖像.
裁切了的內(nèi)嵌圖像.
文件名引用.
2.1. 文件名通配符
在 Unix shell 環(huán)境下, 有一些特殊的字符是作為通配符使用的, 如 * 和 ? . ImageMagick 在各個平臺上都支持文件名通配符. 假如你想把某目錄下的 1.jpg, 2.jpg, 3,jpg, 4.jpg 和 5.jpg 這些文件轉(zhuǎn)成一個 GIF 動畫, 那么你可以使用這條命令方便地引用所有的 JPEG 文件:
$ convert *.jpg images.gif
2.2. 明確的圖片格式
圖像的數(shù)據(jù), 都是以一種確定的格式存儲的, 比如常見的 JPEG, PNG, TIFF 等. ImageMagick 在讀取, 解析圖片之前, 必須要知道圖片的格式.
多數(shù)圖像格式, 在文件中都設(shè)有一些標(biāo)識來表明它屬于哪種格式. 如果沒有, ImageMagick 會根據(jù)文件的擴(kuò)展名來判斷. 如 image.jpg 會告訴 ImageMagick 這是一張 JPEG 格式的圖片. 某些情況下, ImageMagick 不知道圖片的格式, 那么這時就需要手動指定了. 如, 我們有一張名為 image , 存儲了 RGB 三原色位深原始信息的圖片(未經(jīng)過任何壓縮的位圖), ImageMagick 當(dāng)然無法自己得知它是什么格式的圖片, 所以, 這時就需要我們明確指定圖片格式.
$ convert -size 640x480 -depth 8 rgb:image image.png
2.3. 內(nèi)置圖像或圖案
ImageMagick 有許多內(nèi)置的圖像和圖案, 要使用 checkerboard 中的圖案:
$ convert -size 640x480 pattern:checkerboard checkerboard.png
2.4. 標(biāo)準(zhǔn)的輸入輸出, 文件描述符
Unix 和 Windows 都支持通過管道來重定向輸入輸出. ImageMagick 支持從標(biāo)準(zhǔn)的輸入輸出流中讀寫圖像數(shù)據(jù), 由依次使用一個虛文件名 ? 來實現(xiàn). 下面的例子把 convert 的輸出通過管道重定向到了 display .
$ convert logo: gif:- | display gif:-
(logo: 理解成是一個內(nèi)置的圖像, logo 這種特殊類型.)
第二個用于確定圖像格式的 gif: 是可選的, 因為 GIF 這種格式有自己的標(biāo)識, ImageMagick 認(rèn)識它. convert 同樣能以這種方式接受標(biāo)準(zhǔn)輸入:
$ convert rose: gif:- | convert - -resize "200%" bigrose.jpg
其它的一些管道, 你可以通過它們的文件描述符來訪問. 文件描述符0, 1, 2已經(jīng)被預(yù)定義為標(biāo)準(zhǔn)輸入, 標(biāo)準(zhǔn)輸出, 錯誤輸出. 如果一個管道被指定為文件描述符 N, 那么你可以通過 fd:N 來使用它. 下一個例子展示了如何通過管道重定向, 把文件描述符3, 4的數(shù)據(jù)添加到文件描述符5中.
$ convert fd:3 fd:4 -append fd:5
ImageMagick 6.4.9-3 中才添加了對文件描述符的支持.
對于 Python, 你可以通過調(diào)用 File 對象的 fileno() 方法來獲取文件描述符.
在需要的時候, 你也可以為文件描述符指定具體的圖像格式:
$ convert gif:fd:3 jpg:fd:4 -append tif:fd:5
2.5. 選取圖片的某些幀
某些圖片格式可以包括有多個圖像幀. 你可以只獲取第一幀, 最后一幀, 或中間的某些幀. 為此, 你可以在文件名之后, 以方括號括起來的形式指定幀. 下面的例子中, 對于一個有多幀的 GIF 圖片, 我們只取其第一幀.
$ convert 'images.gif[0]' image.png
在 Unix shell 的環(huán)境下, 一般中括號是會被轉(zhuǎn)義的, 所以, 我們需要使用單引號把文件名引起來. Windows 的命令行環(huán)境下不用單引號也可以, 但多寫一對單引號并不會有什么問題. 另外, 對于單引號和雙引號的作用, 在 Unix 和 Windows 這兩個平臺上, 常常是相反的, 所以, 如果你使用 Windows ,那么請注意將我們例子中的單引號改為雙引號.
你也可以一次獲取多幀, 在方括號中標(biāo)出一個范圍即可, 如下面的例子, 我們獲取了前四幀的圖像:
$ convert 'images.gif[0-3]' images.mng
最后, 你可以一次獲取非連接的多幀. 下面的命令以3,2,4的順序獲取圖像:
$ convert 'images.gif[3,2,4]' images.mng
注意上面的最后兩個命令, 輸出被寫入了一個類型為 MNG 的文件當(dāng)中. 因為 MNG 支持保存多幀圖像, 而如 JPG 之類的格式只是保存單幀的圖像. 在下面“圖像輸出名”一節(jié)我們還會介紹這方面的內(nèi)容.
2.6. 選取圖片的部分區(qū)域
最原始的位圖圖像, 就是一個表示出各像素點顏色的序列, 它的文件中沒有任何的其它像寬, 高, 格式標(biāo)識等附加信息. 對于這類原始的圖像數(shù)據(jù), 在處理時我們必須明確指定圖像的寬和高, 或者給出一個范圍. 在下面的例子中, 我們要處理的圖片是一個8位的 RGB 位圖, 寬是 6000, 高為 4000, 而我們只需要獲取一塊中心附近 600×400 的圖像信息.
$ convert -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg
使用 ?extract 選項也可以實現(xiàn)相同的功能:
$ convert -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg
2.7. 縮放內(nèi)嵌圖像
讀入一些圖片的同時, 重新定義它們的尺寸是很方便的. 假設(shè)你有很多的大的 JPEG 圖片需要轉(zhuǎn)換成一組 PNG 格式的縮略圖:
$ convert '*.jpg' -resize 120x120 test.png
這里, 所以的圖片都會被讀入并且分別被重定義大小. 在讀入的同時定義尺寸在效率上更好, 同時資源占用也更少:
$ convert '*.jpg[120x120]' test.png
2.8. 裁切內(nèi)嵌圖像
同上.
$ convert '*.jpg' -crop 120x120+10+5 test.png
$ convert '*.jpg[120x120+10+5]' test.png
2.9. 文件名引用
靠一個另外的文件名, 來表示實際要讀取的圖像文件名, 實現(xiàn)這個功能有兩種方法, 第一種方法是使用 @ 這個符號, 來指定一個文件, 這個文件中包含有實際需要讀取的圖像文件名, 如一個名為 myimages.txt 的文本文件中有如下內(nèi)容:
frame001.jpg
frame002.jpg
frame003.jpg
下面的命令, ImageMagick 就會讀入 frame001.jpg, frame002.jpg, frame003.jpg .
$ convert @myimages.txt mymovie.gif
另一種方法, 是在文件名中使用格式化字符串, 然后在后面的方括號中指定一個范圍. 看下面的例子:
$ convert image-%d.jpg[1-5]
ImageMagick 實際上會去讀取如下的圖像:
image-1.jpg
image-2.jpg
image-3.jpg
image-4.jpg
image-5.jpg
3. 圖像設(shè)置
命令行中的一個設(shè)置項, 可以作用于讀入的圖像, 圖像操作, 或者將會被輸出的圖像. 一個設(shè)置項被設(shè)置后會一直發(fā)揮作用除非它被重置或命令執(zhí)行完畢. 圖像設(shè)置命令包括有:
-adjoin -affine -alpha -antialias -authenticate
-background -bias -black -point -compensation
-blue -primary -bordercolor -caption -channel
-comment -compress -debug -define -delay -density
-depth -display -dispose -dither -encoding -endian
-extract -family -fill -filter -font -format
-fuzz -geometry -gravity -green -primary -interlace
-intent -interpolate -label -limit -linewidth -log
-loop -mask -mattecolor -monitor -orient -page
-pointsize -preview -quality -quiet -red -primary
-region -render -repage -sampling -factor -scene
-seed -size -stretch -stroke -strokewidth -style
-texture -tile -transparent-color -treedepth -type
-undercolor -units -verbose -virtual-pixel -weight
每條命令的具體使用扫责,請移步官網(wǎng)
下面例子中的 ?channel 會被作用于每一個圖像, 就像我們說的那樣, 設(shè)置項會持續(xù)起作用.
$ convert -channel RGB wand.png wizard.png
images.png
4. 圖像操作
圖像操作項與圖像設(shè)置項不同, 它只作用于緊接著存在的一個圖像, 僅僅是這一個圖像, 之后, 圖像操作項就會失效. 在這里, 我們說明一下. 命令行參數(shù)有三種, 前面講過的圖像設(shè)置項, 這里的圖像操作項, 以及后面會講到的序列操作項. 圖像操作項包括下面這些.
-annotate -black -threshold -blur -border -charcoal
-chop -clip -clip-path -clip -mask -colors -colorize
-colorspace -compose -contrast -convolve -crop -cycle
-despeckle -draw -edge -emboss -enhance -equalize
-evaluate -extent -flip -flop -floodfill -frame
-gamma -gaussian -blur -implode -lat -level -map -mask
-median -modulate -monochrome -negate -noise -normalize
-opaque -ordered-dither -paint -posterize -raise
-profile -radial -blur -raise -random-threshold
-resample -resize -roll -rotate -sample -scale
-sepia -tone -segment -shade -shadow -sharpen -shave
-shear -sigmoidal -contrast -solarize -splice -spread
-strip -swirl -threshold -transparent -thumbnail -tint
-transform -trim -unsharp -version -wave -white-point
-white -threshold
每條命令的具體使用蹂析,請移步官網(wǎng)
下面例子, ?negate 這項只對 wand 有效, 對 wizard 是無效的(但是, 如果把它放在 wizard 后的話, 則會作用于這兩張圖).
$ convert wand.png -negate wizard.png images.png
5. 圖像序列操作項
一個圖像序列操作項, 只作用于緊接著存在的一個圖像序列, 它們是.
-append -average -clut -coalesce -combine -composite
-crop -deconstruct -delete -flatten -fx -identify
-insert -map -morph -mosaic -process -reverse
-separate -swap -write
每條命令的具體使用,請移步官網(wǎng)
6. 圖像定位
許多命令行選項都有一個 geometry 參數(shù), 用于指定圖像的寬, 高等信息. 因為圖像的坐標(biāo)系, 尺寸, 位置等信息是我們經(jīng)常會用到的, 所以為了方便, geometry 這個參數(shù)可以用不同的格式給出. 關(guān)于這點, 接下來我們會詳細(xì)地介紹.
一些命令行選項可接受如下多種格式的 geometry 參數(shù). 請記住, 它們處理具體參數(shù)時的效果是不同的, 詳細(xì)的內(nèi)容可查閱它們各個的說明文檔.
-adaptive-resize -border -borderwidth -chop -crop
-density -extent -extract -frame -geometry
-iconGeometry -liquid-rescale -page -region -repage
-resize -sample -scale -shave -splice -thumbnail -window
每條命令的具體使用,請移步官網(wǎng)
geometry 參數(shù)可以使用下表列出的多種格式指定. 最常用的一種格式是 size[offset] , 意為 size 是必須給出的, 而 offset 則是可選的. 不過, 有時 [size]offset 也行. 同時要注意, geometry 這個參數(shù)中, 絕不允許出現(xiàn)空格符.
size的形式 | 說明 |
---|---|
scale% | 寬和高同時根據(jù)指定的百分比縮放 |
scale?x%scale?y% | 寬和高根據(jù)指定的百分比分別縮放 |
width | 指定寬度, 高度根據(jù)原尺寸比例自動確定 |
width x height | 指定最大的寬度和高度, 圖像寬高原比例保存不變(注意沒空格, 下同) |
width x height^ | 指定最小的寬度和高度, 寬高原比例不變 |
width x height! | 指定寬度和高度, 忽略原始比例 |
width x height> | 和 width x height 一樣, 但只對比這個尺寸大的圖像有作用 |
width x height< | 和 width x height 一樣, 但只對比這個尺寸小的圖像有作用 |
area@ | 等比例縮放圖像, 使其總像素值不大于 area.(對于一張 1:1 的圖, 若設(shè)置為121@, 則結(jié)果正好是 11x11.)注意, 上面結(jié)尾的修辭字符是可以組合使用的 |
{size}{offset} | 指定 offset 偏移(默認(rèn)是 +0+0). |
{size}{+?}x{+?}y | 指定水平和垂直的偏移, 以像素為單位, 兩者必須同時指定偏移量對 ?gravity 設(shè)置項有效, 對其它的帶 % 或另外的 size 操作無效. |
7. 對寬和高的基本設(shè)置及操作符( % ^ ! )
下面展示了一些簡單的例子, 用以說明如何給出 ?resize 的 geometry 參數(shù). 我們將使用內(nèi)置的 logo: 這張圖作為我們的“輸入圖像”. logo: 這張原始圖片寬為640像素, 高480像素, 記為 640×480. 就像你看到的, 寬總在高的前面. 這條規(guī)則同樣適用于我們可能會講到的“坐標(biāo)”或“偏移”.
$ convert logo: -resize '200%' bigWiz.png
$ convert logo: -resize '200x50%' longShortWiz.png
$ convert logo: -resize '100x200' notThinWiz.png
$ convert logo: -resize '100x200^' biggerNotThinWiz.png
$ convert logo: -resize '100x200!' dochThinWiz.png
8. 忽略寬或高的表示方法( < > @ )
看一些例子:
$ convert logo: -resize '100' wiz1.png
$ convert logo: -resize 'x200' wiz2.png
$ convert logo: -resize '100x200>' wiz3.png
$ convert logo: -resize '100x200<' wiz4.png
(@的作用前面已經(jīng)提到過了)
請注意引號的使用. 上面的例子, 包括后面的例子中, 我們都使用引號把 geometry 引起來了的. 很多時候, 這樣做不是必須的, 但當(dāng)你使用了 < 和 > 的時候, 就一定要使用引號, 否則這兩個符號會被當(dāng)成命令行的重定向操作處理. 另外, 在 Windows 平臺上, ^ 也必須使用引號. 所以, 為了安全起見, 我們最好養(yǎng)成對于 geometry 總是使用引號的習(xí)慣.
9. 圖像定位中的偏移
我們通過一些例子來說明 geometry 參數(shù)中的 offsets. 使用它的一個典型情形是在 ?region 這個選項中. ?region 跟在一些其它的命令后, 用于指定一塊矩形區(qū)域. 所以, 你除了需要指定這個矩形區(qū)域的寬和高, 還需要指定它的一個起始點(左上角的點). 下面的第一個例子中, 我們指定了一個 100×200 的區(qū)域, 位置在 x=10, y=20, 或者我們應(yīng)該寫成 (x,y) = (10,20).
$ convert logo: -region '100x200+10+20' -negate wizNeg1.png
$ convert logo: -region '100x200-10+20' -negate wizNeg2.png
$ convert logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png
注意, offsets 必須帶上 +/?. 它表示的是一個相對偏移, 而不是一個絕對坐標(biāo). offsets 的參照點不是固定的, 但默認(rèn)情況下, 它是 (0,0), 即左上角, 上面的第一個例子就是這種情況.
offsets 有可能“出界”, 就像第二個例子中的那樣, -10+20, 對于這個有一部分出界的矩形執(zhí)行 ?negate, 實際的效果也就相當(dāng)于 90×200+0+20.
第三個例子中, 一來就使用了 ?gravity 選項, 它把當(dāng)前坐標(biāo)原點(或叫參照原點)設(shè)置為圖像的正中, 即 (320,240) 的位置, 因為這張圖的尺寸是 640×480. 這意味著后面的 offsets 的實際效果與前面兩例就有所不同, 變成了 (320-10, 240+20) = (310,260). 同時 100×200 也不再是根據(jù)左上角來計算, 而是根據(jù)中心點計算. 即以 (310,260) 為中心的一個 100×200 的矩形. 顯然, 它的左上角在 (310-50,260-100) = (260,160).
10. 圖像組(Image Stack)
它讓你在一個隔離的組中處理一張圖像或一個圖像序列, 處理完后, 把結(jié)果返回到正常流程中. 圖像組用一對括號標(biāo)示, 里面的所有操作只對當(dāng)前組有效. 如下例, 我們限制 ?rotate 操作只對 wizard.gif 有效:
$ convert wand.gif \( wizard.gif -rotate 30 \) +append images.gif
特別注意, 在 Unix 平臺下, 用于圖像組的括號是需要使用 \ 轉(zhuǎn)義的, 因為小括號在 shell 中有其它的特殊作用. 但是, Windows 平臺下的小括號不需要轉(zhuǎn)義. 另外, 在小括號內(nèi)的兩側(cè), 都有一個空格, 請留意.
前面我們已經(jīng)談到了一些命令行中的操作項, 不過, 下面這幾個操作項對于處理一個圖像組是比較常用的:
-clone -delete -insert -swap
上面幾個操作項的參數(shù), 都是一個索引值, 用以表示在圖像組中的某個圖像. 圖像組中的第一個圖像的索引值是 0. 同時, 這個索引值你也可以使用負(fù)數(shù), -1 就是圖像組中的最后一個圖像.
11. 圖像輸出名
ImageMagick 擴(kuò)展了原來的“輸出文件名”的概念, 在 ImageMagick 中, 一個圖像輸出可以是:
一種明確的圖像格式.
輸出到系統(tǒng)的標(biāo)準(zhǔn)輸出.
文件名引用.
11.1. 明確的圖像格式
圖像信息都是以某種即定的格式存儲起來的, 這些格式包括我們熟悉的 JPEG, PNG, TIFF 等. ImageMagick 在寫出某個圖像時, 必須知道應(yīng)該使用哪一種格式寫出. 通常情況下, ImageMagick 可以根據(jù)擴(kuò)展名來判斷格式, 如, 對于 image.jpg ImageMagick 會以 JPEG 格式來寫出. 某些情況下沒有給出圖像的格式信息, 而你又沒有明確指定, 這時, ImageMagick 會以圖像原來的格式寫出. 比如, 我們希望把圖像存為名為 image 的原始 RGB 位圖:
$ convert image.jpg rgb:image
11.2. 標(biāo)準(zhǔn)輸出
Unix 支持通過管道在各個程序間重定向輸入輸出. ImageMagick 可以使用一個特殊的文件名 ? 來實現(xiàn)管道間的重定向操作. 下面的例子中, 我們把 convert 的輸出重定向到 display 中:
$ convert logo: gif:- | display gif:-
這里, 你不一定要明確指定圖像格式, GIF 這種格式有它自己的標(biāo)示, ImageMagick 可以自動正確地識別出.
11.3. 文件名引用
另外還有一種輸出方式, 是使用格式化字符串來輸出多個圖像. 假如我們把輸出圖像名寫成 image?%d.jpg , 同時我們的圖像序列中有 3 個圖像, 那么會得到如下的多個輸出結(jié)果:
image-0.jpg
image-1.jpg
image-2.jpg
還有一種情況, 假如你希望用圖像的某些屬性來作為其文件名的一部分, 那么可以這樣:
$ convert rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'
其結(jié)果是:
rose-70x46.png