ImageMagick 命令列 工具 可以很簡單,就像這樣
magick image.jpg image.png
或者它可以很複雜,帶有大量的 選項,如下所示
magick label.gif -alpha Set \ \( +clone -shade 110x90 -normalize -negate +clone -compose Plus -composite \) \ \( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -alpha Off \) \ -delete 0 +swap -compose Multiply -composite button.gif
這個範例命令很長,必須寫成多行,因此我們透過插入反斜線 (\) 來格式化它以提高清晰度。反斜線是 Linux 的 行續行 字元。在 Windows shell 中,使用插入符號 (^) 進行行續行。我們在這些網頁上使用 Linux 樣式,如上所示。但是,如果瀏覽器視窗足夠小,有時瀏覽器會自動換行,但以白色顯示的命令列仍然應該作為一行輸入。不需要輸入行續行字元。在 Windows 中,上面使用反斜線 跳脫 的 括號 不會被跳脫。Windows 和 Linux 之間還有一些其他差異(例如涉及引號),但我們將在稍後出現這些問題時再討論。
對於本網站上的大多數命令列範例,如果在 Windows 上有等效的轉換,則右下角會有一個下拉式選單,讓您切換預覽命令的作業系統。
即使不太了解 ImageMagick 命令列,您也可以推測上面的第一個命令是將 JPEG 格式的影像轉換為 PNG 格式的影像。但是,很少有人會意識到第二個更複雜的命令,它賦予了平面二維標籤具有豐富紋理和模擬深度的三維外觀
在這裡,我們將任務的完成百分比顯示為陰影圓柱體

考慮到渲染的複雜性,您可能會驚訝於它是由單個命令列完成的
magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \ -draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \ -draw 'roundrectangle 264, 5, 304, 85 20,40' -tile gradient:chartreuse-green \ -draw 'roundrectangle 16, 5, 180, 85 20,40' -tile gradient:chartreuse1-chartreuse3 \ -draw 'roundrectangle 140, 5, 180, 85 20,40' +tile -fill none \ -draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \ -draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \ -shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \ -strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \ -shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \ -append -background white -gravity center -extent 320x200 cylinder_shaded.png
執行此由 Geemack 提供的腳本。您將一窺 ImageMagick 命令列的強大和多功能性
magick -background none -size 960x960 xc:black \( xc:darkred -duplicate 1 +append \) \ xc:gold \( xc:teal -duplicate 2 +append \) -modulate 100,100,"%[fx:rand()*200]" \ xc:white -scale x1 +append -write mpr:clut +delete radial-gradient: mpr:clut \ -clut -scale 100x4% -wave "%[fx:rand()*24+24]"x"%[fx:w/ceil(rand()*4+1)]" -extent "%[w]x%[w]" \ -roll +0+"%[fx:(rand()*w*0.05)+(w*0.51)]" \( +clone -blur 0x4 \) -insert 0 -composite \ -duplicate "%[fx:floor(rand()*3+3)*2-1]" -set option:rot "%[fx:180/n]" -virtual-pixel tile \ -virtual-pixel none -distort SRT "%[fx:t*360/n]" +repage -flatten -extent 100x50% \ \( +clone -rotate 180 \) -append +channel -virtual-pixel none -distort SRT "0.96 %[fx:rand()*360]" \ \( +clone -flop \) +repage -insert "%[fx:round(rand())]" -background black \ -flatten -brightness-contrast 20,20 -normalize dragonFire.png
為確保腳本可以在 Windows 下執行,請將任何反斜線括號 (\() 更改為括號,將反斜線 (\) 更改為 ^,並將百分比 (%) 符號加倍。
在接下來的部分中,我們將剖析 ImageMagick 命令列的結構。希望在仔細閱讀並更好地理解命令列的工作原理之後,您應該能夠完成複雜的影像處理任務,而無需借助有時令人生畏的 程式介面。
如需有關從命令列使用 ImageMagick 的其他幫助,請參閱 ImageMagick 使用範例。
命令列的結構
ImageMagick 命令列包含
- 一個或多個必要的輸入檔名。
- 零個、一個或多個影像設定。
- 零個、一個或多個影像運算子。
- 零個、一個或多個影像序列運算子。
- 零個、一個或多個影像堆疊。
- 零個或一個輸出影像檔名(magick、convert、composite、montage、compare、import、conjure 需要)。
您可以在後面的章節中找到對命令列各個組成部分的詳細說明。
輸入檔名
ImageMagick 將輸入檔名的概念擴展為包含
- 檔名萬用字元
- 明確的影像格式
- 使用內建影像和圖案
- 標準輸入、標準輸出和檔案描述符
- 從影像中選擇特定影格
- 選擇影像的區域
- 強制進行內嵌影像調整大小
- 強制進行內嵌影像裁剪
- 使用檔名參考
這些擴充功能將在接下來的幾段中說明。
請注意,預設情況下,如果命令列選項也是檔名(例如,-quality),則會將其解釋為檔名。請使用 -define registry:option:pedantic=true 來將其解釋為選項。
檔名萬用字元
在 Linux shell 中,某些字元(例如星號 (*) 和問號 (?))會根據模式比對自動產生檔名清單。此功能稱為萬用字元。ImageMagick 支援在 Windows 等本身不支援萬用字元的系統上使用檔名萬用字元。例如,假設您要將目前目錄中的 1.jpg、2.jpg、3.jpg、4.jpg 和 5.jpg 轉換為 GIF 動畫。您可以使用以下命令方便地參考所有 JPEG 檔案
magick *.jpg images.gif
明確的影像格式
影像是以多種影像格式儲存的,包括較為人知的 JPEG、PNG、TIFF 等。ImageMagick 必須先知道影像的格式,才能讀取和處理影像。大多數格式在影像中都有簽章,可以唯一識別格式。如果沒有簽章,ImageMagick 會利用檔名副檔名來判斷格式。例如,image.jpg 或 image.JPG 會告知 ImageMagick 它正在讀取 JPEG 格式的影像。
在某些情況下,影像可能不包含簽章,以及/或者檔名未識別影像格式。在這些情況下,必須指定明確的影像格式。例如,假設我們的影像名為 image,並且包含原始紅色、綠色和藍色強度值。ImageMagick 無法自動判斷影像格式,因此我們明確設定一種格式
magick -size 640x480 -depth 8 rgb:image image.png
內建影像和圖案
ImageMagick 有一些內建的影像和圖案。例如,若要使用棋盤格圖案,請使用
magick -size 640x480 pattern:checkerboard checkerboard.png
標準輸入、標準輸出和檔案描述符
Linux 和 Windows 允許將一個命令的輸出通過管道傳輸到另一個命令的輸入。ImageMagick 允許使用偽檔名 - 分別從標準串流 STDIN(標準輸入)和 STDOUT(標準輸出)讀取和寫入影像資料。在此範例中,我們將 magick 的輸出通過管道傳輸到 display 程式
magick logo: gif:- | magick display gif:-
在前面的範例中,第二個明確的格式 "gif:" 是可選的。GIF 影像格式在影像中具有唯一的簽章,因此 ImageMagick 的 display 命令可以輕鬆地將格式識別為 GIF。magick 程式也接受以這種方式輸入的 STDIN
magick rose: gif:- | magick - -resize "200%" bigrose.jpg'
其他管道可以透過其檔案描述符 進行存取(從 6.4.9-3 版開始)。檔案描述符 0、1 和 2 分別保留給標準串流 STDIN、STDOUT 和 STDERR,但可以使用別名 fd:N 存取與檔案描述符編號 N>2 相關聯的管道。(別名 fd:0 和 fd:1 可用於 STDIN 和 STDOUT。)下一個範例顯示如何附加從描述符 3 和 4 的檔案通過管道傳輸的影像資料,並將結果導向到描述符編號為 5 的檔案。
magick fd:3 fd:4 -append fd:5
如有需要,可以像前面提到的那樣給出明確的影像格式,如下所示。
magick gif:fd:3 jpg:fd:4 -append tif:fd:5
選擇影格
某些影像格式包含多個影像影格。您可能只需要第一個影像,或者最後一個影像,或者介於兩者之間的某些影像。您可以透過在影像檔名後附加括號括起來的影格範圍來指定要讀取的影像影格。這裡我們的影像(一個動畫 GIF)包含多個影格,但我們只需要第一個影格
magick 'images.gif[0]' image.png
Linux shell 通常會解釋括號,所以我們在上面的檔名兩側加上引號。在 Windows 命令 shell 中,括號不會被解釋,但使用引號並不會造成問題。 然而,在大多數情況下,單引號和雙引號的角色在 Linux 和 Windows 中是相反的,因此 Windows 使用者通常應該在我們顯示單引號的地方嘗試使用雙引號,反之亦然。
您可以使用幀範圍從序列中讀取多個影像。 例如,您可以提取影像序列的前四個影格
magick 'images.gif[0-3]' images.mng
預設值是一次跳過一個影格,因此會返回影格 0、1、2 和 3。 使用 -define frames:step=2 將步驟設定為 2,我們將獲得影格 0 和 2。
最後,您可以從序列中以非順序方式讀取多個影像。 下一個命令會取得序列中的第四個影像,然後是第三個,然後是第五個
magick 'images.gif[3,2,4]' images.mng
請注意,在最後兩個命令中,只寫入了一個影像。 在這種情況下,影像類型為 MNG,輸出是一個多影格檔案,因為 MNG 格式支援多個影格。 如果輸出格式為 JPG(僅支援單個影格),則輸出將包含單獨的影格。 更多相關資訊請參閱下方關於 輸出檔名 的章節。
選擇影像區域
原始影像是一系列色彩強度,沒有額外的元資訊,例如寬度、高度或影像簽章。 使用原始影像格式時,您必須指定影像的寬度和高度,但您也可以指定要讀取的影像區域。 在我們的範例中,影像採用原始 8 位元 RGB 格式,寬度為 6000 像素,高度為 4000 像素。 但是,我們只需要影像中心附近 600 x 400 的區域
magick -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg
您可以使用 -extract 選項獲得相同的結果
magick -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg
內嵌影像調整大小
在讀取影像時調整影像大小有時很方便。 假設您有數百個要轉換為 PNG 縮圖序列的大 JPEG 影像
magick '*.jpg' -resize 120x120 thumbnail%03d.png
這裡會讀取 所有 影像,然後調整其大小。 在讀取每個影像時調整其大小速度更快,且佔用的資源更少
magick '*.jpg[120x120]' thumbnail%03d.png
內嵌影像裁剪
在讀取影像時裁剪影像有時很方便。 假設您有數百個要轉換為 PNG 縮圖序列的大 JPEG 影像
magick '*.jpg' -crop 120x120+10+5 thumbnail%03d.png
這裡會讀取 所有 影像,然後裁剪它們。 在讀取每個影像時裁剪它速度更快,且佔用的資源更少
magick '*.jpg[120x120+10+5]' thumbnail%03d.png
檔名參考
有兩種方法可以使用檔名來參考其他影像檔名。 第一種是使用「@」,它從指定的檔案中讀取以空格分隔的影像檔名。 假設檔案 myimages.txt 由檔名清單組成,如下所示
frame001.jpg frame002.jpg frame003.jpg
然後我們希望這個命令
magick @myimages.txt mymovie.gif
讀取影像 frame001.jpg、frame002.jpg 和 frame003.jpg 並將其轉換為 GIF 影像序列。
如果影像路徑包含一個或多個空格,請將路徑用引號括起來
'my title.jpg'
某些 ImageMagick 命令列 選項 可能超出您的命令列處理器的能力。 例如,Windows 將命令列限制為 8192 個字元。 例如,如果您有一個繪製選項,其中包含超過命令列長度限制的多邊形點,請將繪製選項放在檔案中,並使用 @ 參考該檔案(例如 @mypoly.txt)。
另一種參考其他影像檔案的方法是在檔名中嵌入格式化字元和場景範圍。 考慮檔名 image-%d.jpg[1-5]。 該命令
magick image-%d.jpg[1-5]
會導致 ImageMagick 嘗試使用以下檔名讀取影像
image-1.jpg image-2.jpg image-3.jpg image-4.jpg image-5.jpg
串流緩衝
預設情況下,輸入串流會被緩衝。 若要確保在來源檔案或終端機上的資訊一經提供就立即被讀取,請將緩衝區大小設定為 0
magick logo: gif:- | magick display -define stream:buffer-size=0 gif:-
命令列選項
您可以使用這些命令列 選項 來控制 ImageMagick 工具的行為。選項的行為分為以下幾類
影像設定
影像設定會在命令列中出現時持續存在,並可能會影響後續的處理,例如讀取影像、影像運算子或寫入影像(視情況而定)。影像設定會一直有效,直到被重置或命令列終止。影像設定包括
-
-adjoin •-affine •-alpha •-antialias •-authenticate •-background •-bias •-black-point-compensation •-blue-primary •-bordercolor •-caption •-channel •-comment •-compress •-debug •-define •-delay •-density •-depth •-direction •-display •-dispose •-dither •-encoding •-endian •-extract •-family •-fill •-filter •-font •-format •-fuzz •-geometry •-gravity •-green-primary •-interlace •-intent •-interpolate •-label •-limit •-linewidth •-log •-loop •-mattecolor •-monitor •-orient •-page •-pointsize •-preview •-quality •-quiet •-read-mask •-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 •-write-mask
在此範例中,-channel 適用於每個影像,因為如前所述,設定會持續存在
magick -channel RGB wand.png wizard.png images.png
影像運算子
影像運算子與設定的不同之處在於,它會在命令列中出現時立即影響影像。運算子是任何未列為 影像設定 或 影像序列運算子 的命令列 選項。與持續有效直到命令列終止的影像設定不同,運算子會套用至目前的影像集,然後就會被遺忘。影像運算子包括
-
-annotate •-black-threshold •-blur •-border •-charcoal •-chop •-clip •-clip-path •-clip-mask •-colors •-colorize •-colorspace •-color-threshold •-compose •-contrast •-convolve •-crop •-cycle •-despeckle •-draw •-edge •-emboss •-enhance •-equalize •-evaluate •-extent •-flip •-flop •-floodfill •-frame •-fx •-gamma •-gaussian-blur •-grayscale •-implode •-integral •-kmeans •-lat •-level •-map •-median •-modulate •-monochrome •-negate •-noise •-normalize •-opaque •-ordered-dither •-paint •-posterize •-raise •-profile •-raise •-random-threshold •-resample •-resize •-roll •-rotate •-rotational-blur •-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-balance •-white-point •-white-threshold
在此範例中,-negate 會將 wand 影像反轉,但不會反轉 wizard
magick wand.png -negate wizard.png images.png
請注意,影像運算子將套用至影像序列中的每個影像。例如,如果您使用 -resize 選項來調整 GIF 影像的大小,則每個影格都會調整為指定的大小。但是,某些影格可能小於整個影像,將所有影格都調整為相同大小可能會導致意外的輸出。在這種情況下,應使用 -coalesce 來準備這些影格。
影像通道運算子
直接對影像通道進行操作
影像序列運算子
影像序列運算子與設定的不同之處在於,它會在命令列中出現時立即影響影像序列。從這些影像序列運算子中選擇
-
-append •-affinity •-average •-clut •-coalesce •-combine •-compare •-complex •-composite •-copy •-crop •-debug •-deconstruct •-delete •-evaluate-sequence •-fft •-flatten •-fx •-hald-clut •-ift •-identify •-insert •-layers •-limit •-map •-maximum •-minimum •-morph •-mosaic •-optimize •-print •-process •-quiet •-read •-swap •-write
在此範例中,-append 將三張影像附加為一張
magick mikayla.png picnic.png beach.png -append vacation.png
影像幾何
許多命令列 選項 採用 geometry 參數來指定影像的所需寬度和高度以及其他尺寸數量。由於使用者希望對影像的結果尺寸、大小和位置進行多種變化(並且因為 ImageMagick 希望提供這些變化),因此 geometry 參數可以採用多種形式。我們將在本節中描述其中許多形式。
採用某種形式的 geometry 參數的影像選項和設定包括以下內容。請記住,其中一些選項和設定在解析其參數的方式上略有不同。有關更多細節,請參閱個別選項或設定的說明文件。
-
-adaptive-resize •-border •-borderwidth •-chop •-crop •-density •-extent •-extract •-frame •-geometry •-iconGeometry •-liquid-rescale •-page •-region •-repage •-resize •-sample •-scale •-shave •-splice •-thumbnail •-window
「geometry」參數可以採用下表列出的任何形式。這些將在表格後面的子章節中更詳細地描述。常用的形式是 size[offset],表示 size 是必需的,而 offset 是可選的。偶爾,[size]offset 也是可行的。在任何情況下,geometry 參數中都不允許有空格。
大小 | 一般描述(實際行為可能會因不同的選項和設定而異) |
---|---|
縮放比例% | 高度和寬度都按指定的百分比縮放。 |
scale-x%xscale-y% | 高度和寬度分別按指定的百分比縮放。(只需要一個 % 符號。) |
寬度 | 給定寬度,自動選擇高度以保持長寬比。 |
x高度 | 給定高度,自動選擇寬度以保持長寬比。 |
寬度x高度 | 給定高度和寬度的最大值,保持長寬比。 |
寬度x高度^ | 給定寬度和高度的最小值,保持長寬比。 |
寬度x高度! | 強制給定寬度和高度,忽略原始長寬比。 |
寬度x高度> | 縮小尺寸大於相應 寬度 和/或 高度 參數的圖像。 |
寬度x高度< | 放大尺寸小於相應 寬度 和/或 高度 參數的圖像。 |
區域@ | 調整圖像大小以使其具有指定的像素面積。長寬比將被保留。 |
x:y | 這裡的 x 和 y 表示長寬比(例如 3:2 = 1.5)。 |
x:y^ | 刪除行或列以達到給定的長寬比。 |
x:y# | 添加行或列以達到給定的長寬比。 |
{size}{offset} | 指定 offset(默認為 +0+0)。下面,{size} 指的是上述任何一種形式。 |
{size}{+-}x{+-}y | 水平和垂直偏移量 x 和 y,以像素為單位。兩者都需要符號。偏移量受 -gravity 設定的影響。偏移量不受 % 或其他 size 運算符的影響。請注意,對於所有 -gravity 選項(除了「center」),正 X 和 Y 偏移量都是朝向圖像中心的內部方向。對於「East」,+X 是左側。對於「South」,+Y 是上方。對於「SouthEast」,+X 是左側,+Y 是上方。對於「center」,則使用正常的 X 和 Y 方向慣例(+X 是右側,+Y 是下方)。 |
對寬度和高度的基本調整;運算符 %、^ 和 !
下面是一些簡單的 geometry 範例,展示了如何將其用作 -resize 選項的參數。我們將使用內部圖像 logo: 作為輸入圖像。 這張精美的圖像 寬 640 像素,高 480 像素。我們說它的 尺寸 是 640x480。當我們給出圖像的尺寸時,寬度(水平尺寸)始終在高度(垂直尺寸)之前。當我們談到圖像中的坐標或 偏移量 時也是如此,它始終是 x 值後跟 y 值。想想你的高中代數課和 xy 平面。(好吧,幾乎是:我們的 y 軸始終向下!)
magick logo: -resize '200%' bigWiz.png magick logo: -resize '200x50%' longShortWiz.png magick logo: -resize '100x200' notThinWiz.png magick logo: -resize '100x200^' biggerNotThinWiz.png magick logo: -resize '100x200!' dochThinWiz.png
四個指令中的第一個指令很簡單——它將輸入圖像的寬度和高度各拉伸 200%;它將整個圖像放大了兩倍。第二個指令為每個方向指定不同的百分比,將寬度拉伸到 200% 並將高度壓縮到 50%。生成的圖像(在本例中)尺寸為 1280x240。請注意,不必重複百分比符號;以下寫法是等效的:200x50%、200%x50、200%x50%。
默認情況下,geometry 參數中給定的寬度和高度是 最大 值,除非指定了百分比。也就是說,圖像會被放大或縮小以適應指定的寬度和高度值,同時保持圖像的 縱橫比(高度與寬度的比率)。例如,上面的第三個指令「嘗試」將尺寸設置為 100x200。想像一下逐漸縮小原始圖像(尺寸為 640x480),保持其縱橫比不變,直到它恰好適合 100x200 的矩形。由於圖像的長度大於高度,因此當其寬度縮小到 100 像素時,它將適合該矩形。為了保持縱橫比,高度必須為 (480/640)×100 像素=75 像素,因此最終尺寸將為 100x75。
請注意,在上一個示例中,至少會達到指定的一個維度(在本例中為寬度 100 像素)。生成的圖像會緊密地 fitting 在原始圖像內。可以通過調用 ^ 運算符來實現相反的效果,如上面的第四個示例所示。在這種情況下,當 100x200^ 作為參數給出時,同樣至少會達到一個維度,但在這種情況下,生成的圖像可以緊密地包含原始圖像。geometry 參數在此給出的是 最小 值。在我們的示例中,高度將變為 200,並且寬度將按比例縮放以保持縱橫比,變為 (640/480)×200 像素=267 像素。使用 ^ 運算符時,其中一個維度將與請求的大小匹配,但圖像可能會為了保持其縱橫比而超出請求的維度。(^ 功能是從 IM 6.3.8-2 開始新增的。)
我們可以看到 ImageMagick 非常擅長保持圖像的縱橫比,以防止您喜愛的照片和圖像失真。但是您可能真的希望尺寸為 100x200,從而拉伸圖像。在這種情況下,只需在幾何形狀後面附加一個驚嘆號運算符,告訴 ImageMagick 您是認真的 (!) 。這將強制圖像大小與您指定的完全一致。因此,例如,如果您指定 100x200!,則尺寸將變為 100x200(得到一個小的、垂直拉長的巫師)。
限制寬度、高度和面積;運算符 >、< 和 @
以下是一些其他示例
magick logo: -resize '100' wiz1.png magick logo: -resize 'x200' wiz2.png magick logo: -resize '100x200>' wiz3.png magick logo: -resize '100x200<' wiz4.png
如果只給出一個維度,則將其視為寬度。當僅指定寬度時(如上面的第一個示例所示),將按給定值接受寬度,並選擇高度以保持輸入圖像的縱橫比。類似地,如果僅指定高度(如上面的第二個示例所示),則將接受高度,並選擇寬度以保持縱橫比。
僅當圖像的尺寸大於對應的 width 和/或 height 參數時,使用 > 來縮小圖像。僅當圖像的尺寸小於對應的 width 和/或 height 參數時,使用 < 來放大圖像。在任何一種情況下,如果進行了更改,結果就如同 > 或 < 運算符不存在一樣。因此,在上面的第三個範例中,我們指定了 100x200>,而原始圖像大小為 640x480,因此圖像大小會縮小,就如同我們指定了 100x200 一樣。但是,在上面的第四個範例中,其大小將不會有任何變化。
最後,使用 @ 來指定圖像的最大像素面積,同時嘗試保持縱橫比。(像素僅採用整數值,因此始終會進行一些近似處理。)在以下範例中,請求面積為 10000 像素。結果檔案的尺寸為 115x86,具有 9890 個像素。
magick logo: -resize '10000@' wiz10000.png
在上述和以下的所有範例中,我們都將 geometry 參數括在引號中。在許多情況下,這樣做是可選的,但並非總是如此。當使用 < 或 > 時,我們必須將幾何規範括在引號中,以防止這些字元被 shell 解釋為 檔案重新導向。在 Windows 系統上,插入符號 ^ 需要在引號內,否則將被忽略。為安全起見,應該養成將所有 geometry 參數括在引號中的習慣,就像我們這裡所做的那樣。
幾何中的偏移
以下是一些範例,說明如何在 geometry 參數中使用 偏移。偏移的一種典型用途是與 -region 選項結合使用。此選項允許許多其他選項修改圖像指定矩形子區域內的像素。因此,需要給定該區域的寬度和高度,以及圖像中的 偏移,它是一對坐標,指示該區域在較大圖像中的位置。下面,在第一個範例中,我們指定一個大小為 100x200 的區域,位於 xy 坐標 x=10,y=20 處。為了方便起見,讓我們使用通常的代數符號 (x,y)=(10,20)。
magick logo: -region '100x200+10+20' -negate wizNeg1.png magick logo: -region '100x200-10+20' -negate wizNeg2.png magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png
請注意,偏移始終需要 +/− 符號。偏移實際上不是圖像內的真實位置;其坐標必須添加到其他位置。讓我們將其稱為 目前位置。但是,在上面的前兩個範例中,該位置是圖像的左上角,其坐標為 (0,0)。(當沒有其他指令更改它時,這是預設情況。)上面的第一個範例將 100x200 矩形自身的左上角放置在 (10,20) 處。
在許多情況下,負偏移是有意義的。在上面的第二個範例中,偏移為 (-10,20),由 -10+20 指定。在這種情況下,只能否定獲得的(虛擬)矩形中位於圖像內的部分;在這裡,它等效於將幾何指定為 90x200+0+20。
在上面的第三個範例中,-gravity 設定位於其他設定之前,並將圖像內的目前位置設定在圖像的正中心。在這種情況下,它位於像素 (320,240) 處,因為圖像的大小為 640x480。這意味著偏移適用於該位置,從而在這種情況下將其移動到 (320-10,240+20)=(310,260)。但是 100x200 區域本身會受到 -gravity 設定的影響,因此不會影響其左上角,而是確定該區域自身的中心(在其內部為 (+50,+100))。因此,100x200 矩形的中心被移動到 (310,260)。現在,否定矩形的左上角位於 (310-50,260-100)=(260,160)。
影像堆疊
在學校裡,老師可能會允許你在草稿紙上解題,然後再把結果抄寫到試卷上。影像堆疊的概念也類似。它允許你單獨處理一張或一系列影像,然後再將結果導入命令列。影像堆疊使用括號來界定。影像運算子只會影響目前堆疊中的影像。例如,我們可以像這樣將影像旋轉操作限制在 wizard 影像上
magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif
再次注意,括號前面加上了反斜線來進行「跳脫」。這在 Linux 底下是必須的,因為括號是特殊的「殼層」字元。反斜線會告訴殼層不要解釋這些字元,而是直接將它們傳遞給正在執行的命令。在 Windows 底下則不需要跳脫括號。每個括號(或跳脫後的括號)的兩側都必須有空格,如上例所示。
除了已經討論過的影像運算子之外,以下這些影像運算子在處理影像堆疊中的影像時最為有用
這些運算子的參數是指向影像序列的索引,從 0 開始,表示第一張影像,以此類推。但是,如果給的是負索引,則會從最後一張影像(最後加入的影像)開始索引。也就是說,索引 -1 是目前影像序列中的最後一張影像,-2 是倒數第二張影像,以此類推。
輸出檔名
ImageMagick 將輸出檔名的概念擴展為包含以下內容
- 明確的影像格式
- 寫入「標準輸出」
- 檔名參照
接下來的幾段將會解釋這些擴展功能。
你可以使用 -exit 來完全阻止任何影像寫入,而不是指定輸出檔名。
明確的影像格式
影像可以儲存成各式各樣的影像格式,包括比較常見的 JPEG、PNG、TIFF 等等。ImageMagick 在寫入影像之前必須先知道所需的影像格式。ImageMagick 會利用檔名副檔名來判斷格式。例如,image.jpg 會告訴 ImageMagick 以 JPEG 格式寫入影像。在某些情況下,檔名無法識別影像格式。在這些情況下,除非明確指定影像格式,否則影像會以讀取時的格式寫入。例如,假設我們想將影像以原始的紅色、綠色和藍色強度格式寫入檔名為 image 的檔案
magick image.jpg rgb:image
標準輸出
Linux 允許將一個命令的輸出透過管道傳送到另一個命令。ImageMagick 允許使用檔名 - 將一個命令透過管道傳送到另一個命令。在此範例中,我們將 magick 的輸出透過管道傳送到 display 程式
magick logo: gif:- | magick display gif:-
在此,明確指定格式是可選的。GIF 影像格式具有可唯一識別其自身的簽章,因此 ImageMagick 可以輕鬆地將格式辨識為 GIF。
檔名參考
或者,使用內嵌的格式化字元來寫入連續的影像清單。假設我們的輸出檔名是 image-%d.jpg,而且我們的影像清單包含 3 張影像。你可以預期這些影像檔案會寫入為
image-0.jpg image-1.jpg image-2.jpg
或者擷取影像屬性來修改影像檔名。例如,以下命令
magick rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'
會寫入具有以下檔名的影像
rose-70x46.png
最後,若要將多個 JPEG 影像轉換為個別的 PDF 頁面,請使用
magick *.jpg +adjoin page-%d.pdf
使用 -define filename:literal=true 可以略過內嵌格式化字元的解釋,而直接使用字面上的檔名。
串流緩衝
根據預設,輸出資料流會被緩衝。若要確保資訊在寫入後立即顯示在目標檔案或終端機上,請將緩衝區大小設定為 0
magick -define stream:buffer-size=0 logo: gif:- | magick display gif:-