/ imagemagick

[ImageMagick note.] 關於 ImageMagick 的工作筆記

關於 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 的網站上有詳細說明。

請看此:http://www.imagemagick.org/Usage/