關於 ImageMagick 這個東西,我想有在做 Web 的人應該不陌生才對。這裡只是筆記一下,以免以後找不到或是忘記(笑)。
圖片合併的部份,有一個特別的指令,叫做 montage 可用,他可以將圖片合併為 n*m
的陣列模式,可用的參數跟我們常用的 convert 差不多,不過 有些命令 會有相當的差異。如果我們要將圖片做成 3x3,每個圖片是 100x100 px,圖片留白是 6px,那麼命令就是:
/usr/local/bin/montage [a-zA-Z0-9\-]*.jpg \
-geometry 100x100 \
-tile 3x3+6+6 \
output_3x3.jpg
這樣就能把圖片做成 3x3 的樣式,不過請記得,如果你輸入的圖片超過 9 張(3x3),那麼他就會輸出複數的圖片。倘若,你要輸入一個空白的區塊,則可以使用 null:
來輸入。
/usr/local/bin/montage [a-zA-Z0-9\-]*.jpg \
null: null: null: -geometry 100x100 \
-tile 3x4+6+6 \
output_3x4_null.jpg
這樣最後一行就是空白,尺寸是 100x100,留白是 6px。
然後,如果我們要做像是 Flickr 那樣的置中縮圖裁切,那麼也可以用 convert
指令一擊必殺!
/usr/local/bin/convert original_image.jpg \
-thumbnail 200x \
-resize 'x200<' \
-resize 50% \
-crop 100x100+0+0 \
+repage \
output_square.jpg
這一行指令就能將圖片縮小成 100x100,然後置中方形裁切。當然,你要做非正方形也可以。我稍微解釋一下以上的指令是在做什麼。
- -thumbnail 200x
將原圖依找寬度等比縮成 200px 寬,高度依照等比例縮小。 - -resize 'x200<'
上述的縮圖,若是高度小於 200px 的話,就將圖的高度修正為 200px,寬度等比例放大。 - -resize 50%
再次將圖片縮小為 50%,這時圖片就會縮小為 100x 或是 x100,寬或高有一邊會是 100px。 - -crop 100x100+0+0
將圖片裁切為 100x100,且不位移(+0+0),預設的對齊點會是圖形正中央。 - output_square.jpg
最後就是我們要的 100x100 的縮圖。
接著,我來說明一下 -crop
這個參數的用法。這個參數很詭異的地方是,依照對齊點定義的不同,他的位移也會跟著不同。關於這一點其實很讓人困擾,不統一的裁切方向,會造成計算上的困難。不過,基本上還是依照對齊點是圖形正中央來解釋,會比較易懂一點。
/usr/local/convert original_image.jpg \
-crop 1000x500+100+100 \
-crop 900x400-50-50 \
+repage \
output_crop.jpg
為什麼要 -crop
兩次呢?因為 -crop
後面的位移參數,一次只能針對一個方向做裁切,如果你要上下左右都裁切,那麼就必須做兩次。至於 +repage
,他是將圖片重新對齊左上角,請務必使用。
- -crop 1000x500+100+100
原始尺寸是 1000x500,左向右裁切 100px,上往下裁切 100px。 - -crop 900x400-50-50
上次裁切過後尺寸是 900x400,右向左裁切 50px,下往上裁切 50px。
這樣就是,裁切的四個方向依序是左向右(+),上往下(+),右向左(-),下往上(-),倘若你寫成 -crop 1000x500+100-50
,這樣意思就是左向右裁切 100px,下往上裁切 50px。所以上述的例子也可以改寫為:
/usr/local/convert original_image.jpg \
-crop 1000x500+100-50 \
-crop 900x450-50+100 \
output_crop.jpg
沒意外的話,這兩個指令裁切出來的圖片應該是一樣的。
接著,ImageMagick 很貼心的替我們這些 Console 控(編按:誰跟你是 Console 控)想到了可以用 pipe 的方式,就是:
/usr/local/bin/montage [a-zA-Z0-9\-]*.jpg \
-geometry 100x100 \
-tile 3x3+6+6 miff: |\
/usr/local/bin/convert - \
-thumbnail 200x \
-resize 'x200<' \
-resize 50% \
-crop 100x100+0+0 \
+repage \
output_square.jpg
以上,就是將圖片拼成 3x3 之後,然後將他縮成 100x100 的方形縮圖。稍微解釋一下這是怎麼做的。
- 指令後的 miff:
你可以把它當作是 ImageMagick 特殊的 STDOUT,跟前面的null:
一樣(但是null:
在那裡是 STDIN),他還有jpg:
或是png:
等可用。但是個人建議使用miff:
,那是因為miff:
是 ImageMagick 特有格式,用它來輸出會保險一點,而且相對的輸出的檔案也比較小。 - 使用 |(pipe)之後,在
convert
命令後的-
號
這個-
號非常重要,他是用來銜接 pipe 的 STDOUT 在後續的命令中當做 STDIN 使用。
至於我在 我的噗浪 上所貼出的測試,我的指令給大家參考一下囉!
/usr/local/bin/montage null: null: null: null: null: null: null: null: null: \
[a-zA-Z0-9\-]*.jpg \
-thumbnail x436 \
-resize '258x<' \
-resize 50% \
-crop 129x218+0+0 \
+repage \
-gravity center \
-tile 9x5+6+6 miff: | \
/usr/local/convert - \
-crop 1269x1150+6-6 \
-crop 1263x1144-6+44 \
output.jpg
這樣輸出的尺寸會是 1257x1100 的圖片,最上面一行會是空白,底下會有 9x4 的小縮圖。至於加字,我就不贅述了(喂喂喂),在 ImageMagick 的網站上有詳細說明。