ImageMagick 範例 --
蒙太奇,圖像陣列

索引
ImageMagick 範例 前言與索引
蒙太奇,介紹與概述
蒙太奇設定
圖像目錄索引
使用蒙太奇的特殊技巧
magick montage」的最初用途是生成圖像縮略圖表,即參考大型圖像集(尤其是照片)的縮略圖。 雖然它仍然可以用於該目的,但它也可以做更多的事情。 本頁將探討您可以使用蒙太奇做些什麼,以及如何將其用於您自己的圖像。

蒙太奇,介紹

magick montage」命令旨在生成縮略圖陣列。 類似於大型圖像集的樣片。 沒有選項的默認「magick montage」非常簡單,包含相當大的方形,沒有邊框、標籤或陰影。

  magick montage balloon.gif medical.gif present.gif shading.gif  montage.jpg
[IM Output]

幾何 - 圖塊大小和圖像調整大小

-geometry」設定是「magick montage」最重要的控制項。它定義了個別縮圖的大小,以及它們之間的間距。「geometry」的大小部分被用作調整大小運算子的參數,包括其所有特殊用途標誌。選項的位置部分被解釋為要在圖像周圍留下的邊框空間量,因此將其設為較小,將使圖像之間的間隙變小。預設的「-geometry」設定為「120x120>+4+3」,這表示將任何給定的圖像放入大小為 120x120 像素的方框中。如果圖像較大,則縮小它,但不要調整較小圖像的大小(根據僅縮小較大圖像(「>」)標誌)。然後,將「tile」大小設定為所有調整大小後的圖像和實際指定大小的最大尺寸。這意味著您永遠不會獲得小於指定「-geometry」大小的「tile」大小。您可以透過修改「-geometry」預設值來移除先前範例空間中巨大的「tile」大小。例如,透過移除「大小」組件,將不會調整任何圖像的大小,並且「tile」大小將設定為所有給定圖像的最大尺寸。例如,在這裡,我要求 montage 使用給定的最大圖像進行拼接,並且「tile」之間的間隙很小。當所有輸入圖像都很小且大小大致相同時,這是非常典型的設定。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -geometry +2+2   montage_geom.jpg
[IM Output]
例如,在這裡,我將一張圖像替換為更大的「logo」圖像,但將調整大小設定設定為「48x48」以調整較小和較大圖像的大小。

  magick montage balloon.gif medical.gif present.gif logo: \
          -geometry 48x48+2+2   montage_geom_size.jpg
[IM Output]
在這裡,我再次將調整大小限制為僅限於大於指定「tile」大小的圖像。

  magick montage balloon.gif medical.gif present.gif logo: \
          -geometry 48x48\>+2+2   montage_geom_larger.jpg
[IM Output]
如您所見,圖像之間的間距似乎大於請求的 2 個像素間距。但事實並非如此。「tile」之間仍然相隔 2 個像素,但圖像本身並未填滿請求的 48x48「tile」大小。「logo」圖像仍然被調整大小以適應 48x48 像素的「tile」。如果您不希望進行任何調整大小,則只需定義「tile」之間的間距。或者,使用特殊大小,例如「1x1<」,它告訴 IM 僅將較小的圖像調整為給定大小。由於沒有圖像可以小於 1 個像素,因此不會調整任何圖像的大小。因此,「tile」大小將再次是頁面上所有圖像的最大尺寸。請參閱零幾何,需要注意,以瞭解您可能想要這樣做的原因。

幾何 - 圖塊間距

-geometry」設定的位置部分將透過在附加它們在一起之前在「tile」周圍添加這些尺寸的邊框來增加個別「tile」之間的空間。這意味著對於「-geometry」的預設設定「+4+3」,「tile」將與最終圖像的左右邊緣相距 4 個像素,並且在「tile」之間將具有 8 個像素(給定大小的兩倍)的水平間距。垂直間距也是如此。請注意,當所有圖像都調整大小時(倒數第二個範例),「tile」之間的空間是如何是邊緣周圍空間的兩倍。

圖塊佈局控制

magick montage」中的下一個最重要的選項是「-tile」設定。這告訴 montage 您希望如何將拼接圖像佈置在最終結果上的限制。在 ImageMagick 版本 6 中,當您沒有提供「-tile」提示時,「magick montage」將對如何最佳地拼接給定數量的圖像做出有根據的猜測。但是,它確實假設正在拼接的圖像是大致方形的,因為它在決定要使用的拼接時不會考慮圖像的縱橫比。

  magick montage font_1.gif      -geometry 16x16+1+1  tile_1.gif
  magick montage font_[12].gif   -geometry 16x16+1+1  tile_2.gif
  magick montage font_[123].gif  -geometry 16x16+1+1  tile_3.gif
  magick montage font_[1-4].gif  -geometry 16x16+1+1  tile_4.gif
  magick montage font_[1-5].gif  -geometry 16x16+1+1  tile_5.gif
  magick montage font_[1-6].gif  -geometry 16x16+1+1  tile_6.gif
  magick montage font_[1-7].gif  -geometry 16x16+1+1  tile_7.gif
  magick montage font_[1-8].gif  -geometry 16x16+1+1  tile_8.gif
  magick montage font_[1-9].gif  -geometry 16x16+1+1  tile_9.gif
  magick montage font_[0-9].gif  -geometry 16x16+1+1  tile_0.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
奇怪的 "[1-5]" 語法是 UNIX shell 的簡寫,它會被展開成一個檔案名稱列表。"magick montage" 命令本身不會看到這些字元,只會看到產生的檔案列表。
ImageMagick 非常擅長根據特定數量的輸入影像找出正確的 "-tile" 設定。以下是一個表格,顯示輸入影像的數量和 IM 將用於排列這些影像的 tile 設定。
影像數量 Tile 設定
1 1x1
2 2x1
3 3x1
4 2x2
5 - 6 3x2
7 - 8 4x2
   
影像數量 Tile 設定
9 3x3
10 - 12 4x3
13 - 15 5x3
16 - 20 5x4
21 - 24 6x4
25 5x5
   
影像數量 Tile 設定
26 - 30 6x5
31 - 36 7x5
31 - 35 7x5
36 6x6
37 - 42 7x6
43 - 48 8x6
但是請注意,IM 不會自動為 18 個影像選擇「完美契合」的 6x3 tile 設定,也不會為 28 個影像選擇 7x4 設定。但是,如果您指定了特定的 "-tile" 設定,montage 將始終建立一個足夠大的影像來容納那麼多「tile」。

  magick montage font_[1-7].gif  -tile 9x1  -geometry 16x16+1+1  tile_9x1.gif
  magick montage font_[1-7].gif  -tile 4x3  -geometry 16x16+1+1  tile_4x3.gif
  magick montage font_[1-7].gif  -tile 3x3  -geometry 16x16+1+1  tile_3x3.gif
  magick montage font_1.gif      -tile 2x3  -geometry 16x16+1+1  tile_2x3.gif
[IM Output] [IM Output] [IM Output] [IM Output]
如您所見,montage 建立了一個足夠大的影像來容納指定的 tile 數量,無論有多少影像可用於填滿請求的 tile 空間,無論是 7 個影像還是只有 1 個影像。它只會逐行填滿空間,目前沒有提供逐列填滿 tile 空間的選項。
在 IM v6.1 之前,如果影像數量沒有使用該空間,montage 會自動截斷額外的空間。因此,像第一個 "9x1" 影像這樣的設定會被截斷以產生一個 "7x1" tile 影像。

因此,過去的 montage 使用者經常使用 "999x1" 之類的大數字來產生單行影像。現在,這樣的參數會產生一個非常長的影像,而且 IM 可能需要很長時間才能完成。因此...

避免在 IM montage 中使用非常大的 tile 數量!
您可以透過從 "-tile" 設定中刪除一行或一列來避免額外空間和多個影像的問題,尤其是在輸入影像數量未知的情況下。缺少的數字將被 montage 視為變數,montage 只會建立足夠的 tile 空間來容納所有輸入影像,只產生一個影像,絕不會產生多個影像。

  magick montage font_[1-7].gif  -tile x1  -geometry 16x16+1+1  tile_x1.gif
  magick montage font_[1-7].gif  -tile x2  -geometry 16x16+1+1  tile_x2.gif
  magick montage font_[1-7].gif  -tile x4  -geometry 16x16+1+1  tile_x4.gif
  magick montage font_[1-7].gif  -tile 4x  -geometry 16x16+1+1  tile_4x.gif
  magick montage font_[1-7].gif  -tile 5x  -geometry 16x16+1+1  tile_5x.gif
  magick montage font_[1-7].gif  -tile 9x  -geometry 16x16+1+1  tile_9x.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
這是 "-tile" 設定的更典型用法,因為它可以確保 montage 的大小正確,同時仍然允許它在確定最終陣列大小方面有一些控制權。請注意上面的最後一個影像,我們在其中請求了 9 列影像。即使提供的影像少於 9 個,IM 仍然生成了請求的 9 列。另一方面,第一個影像(請求了一行)的長度正好可以容納所有影像。如果您擁有的輸入影像比 montage 可以使用 "-tile" 設定提供的空間排列的影像多,則 montage 可以產生多個影像,方法是在檔名中新增影像序列號,或建立某種 GIF 動畫。如需詳細資訊,請參閱寫入多個影像。例如,在這裡,我要求 montage 透過為每個影像檔名提供一個「%d」來表示每個框架/場景/頁面的編號,以便為每個產生的頁面儲存單獨的影像。

  magick montage  font_*.gif  -tile 4x1  -geometry +2+2  multi_%d.gif
[IM Output] [IM Output] [IM Output]

邊框裝飾

使用 montage 來排列影像的最大優點是,它提供了許多額外的控制項,可以在每個影像周圍新增額外的「裝飾」。例如,您可以透過在每個影像周圍新增一個 "-frame" 來更好地定義正在顯示的影像。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -frame 5  -geometry +5+5   frame.jpg
[IM Output]
這與「magick」中的相同選項不同(請參閱添加 3D 框線範例)。蒙太奇框線選項會自動找出框線內部和外部斜角的預設值。因此,只需要一個參數數字。

邊緣裝飾

大約在 IM v6.1.0 版本,「-border」成為蒙太奇的新裝飾選項。現在,它會在根據「-geometry」設定調整大小後,在每個圖像周圍添加額外的「填充」。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -border 5 -geometry +5+5   border.jpg
[IM Output]
當同時應用框線裝飾時,「-border」裝飾目前不起作用。
在 IM v6.1.0 之前(大約)-border 會在「magick montage」命令列中出現的位置應用於圖像,就像在「magick」中一樣。

也就是說,在圖像根據「-geometry」調整大小之前,就會將框線添加到圖像中,這會導致每個圖像周圍的框線寬度不同,具體取決於當時圖像的大小。為了消除這種不一致性,-border
成為特殊的蒙太奇設定。

陰影裝飾

在框線中添加陰影也非常不錯。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -frame 5  -shadow  -geometry +5+5   frame_shadow.jpg
[IM Output]
當然,您實際上並不需要框線來產生圖像陰影

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -shadow  -geometry +5+5  -background lightblue \
          shadow_noframe.jpg
[IM Output]
從 IM v6.3.1 版開始,當實作「軟陰影」時,陰影現在將根據顯示的圖像的透明度進行形狀調整!

  magick montage font_1.gif  font_7.gif  font_2.gif  font_0.gif \
          -tile x1  -shadow  -geometry +3+5 -background none \
          shadow_shaped.png
[IM Output]
如您所見,蒙太奇使用的陰影實際上是一種半透明的顏色,允許背景影響其最終顏色。這表示,如果您建立具有紋理背景的蒙太奇,或使用透明背景並將其覆蓋,則陰影將會正確顯示。當然,您需要使用可以處理半透明顏色的圖像格式,例如 PNG。請記住,由於GIF 布林透明度,您不能將 GIF 圖像檔案格式用於此目的。請注意,陰影不在乎圖像之間的「-geometry」間距。因此,如果圖像靠得太近,則先前圖像的陰影可能會被後面的圖像遮擋。例如...

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -tile x1  -shadow  -geometry +1+1  -background none \
          shadow_spacing.png
[IM Output]
因此,建議在使用陰影時提供合理的「-geometry」間距。為了避免過度「邊緣裁剪」陰影,「-shadow」選項將在最終圖像的右邊緣和底邊緣添加 4 個額外的邊緣間距像素。這是在提供的正常「-geometry」間距之上的。但是,如您在上面看到的,這個空間並不總是足夠的。蒙太奇目前也不提供對產生的陰影的偏移、顏色或「柔和度」的控制(至少目前還沒有),但是,您無法使用舊版蒙太奇提供的硬矩形陰影來進行此類控制。

標記蒙太奇圖像

您也可以指示蒙太奇使用其來源檔案名稱來標記圖像,儘管您可能需要調整圖像框的大小,否則標籤可能不適合,從而截斷文字標籤。在這種情況下,我們在幾何字串中添加了「60x60>」,這會指示 IM 縮小較大的圖像以適應此空間,但如果圖像較小,則放大圖像。這可能是蒙太奇最典型的用途。

  magick montage -label '%f'  balloon.gif medical.gif rose: present.gif shading.gif \
          -tile x1  -frame 5  -geometry '60x60+4+4>'  label_fname.jpg
[IM Output]
%f」是一種特殊的格式字元,可以提取有關記憶體中圖像的各種細節。有關可以從圖像中提取的其他資訊的詳細資訊,請參閱圖像屬性轉義。您不必在標記縮略圖時使用「-frame」。標籤沒有陰影,因此它們仍然清晰可讀。

  montage -label '%f'  balloon.gif medical.gif logo: present.gif shading.gif \
          -tile x1 -shadow -geometry '60x60+2+2>'  label_shadow.jpg
[IM Output]
從 IM v 6.2.1 版開始,您現在可以使用「-set」影像屬性運算子在讀取影像後重新標記它們。讓我們使用「-set」運算子來新增更多關於影像的資訊。以及一些其他的蒙太奇設定...

  magick montage balloon.gif medical.gif logo: present.gif shading.gif \
          -tile x1  -geometry '90x32+2+2>'  -pointsize 10 \
          -set label '%f\n%wx%h'   -background SkyBlue   label_fname3.jpg
[IM Output]
如上例所示,您可以使用「-label」設定來定義影像在讀取時的預設標籤,或者您可以在之後使用「-set」運算子重新標記影像。
請注意,'%wx%h' 會提供影像在記憶體中的當前像素寬度和高度。如果影像大小經過修改,例如在輸入過程中,這可能與磁碟上(或建立時)的影像大小不同。如果您想要使用記憶體中的像素大小,請改用 '%[width]x%[height]'。
您也可以透過設定個別影像的標籤來區分影像標籤。兩種選項都可以使用,但您需要使用括號來限制「-set」運算子將套用到哪些影像。例如,在這裡我們同時使用了兩種形式的標籤。但也讓我們為蒙太奇新增一個標題,因為我們可以這樣做...

  magick montage -label Balloon   balloon.gif  \
          -label Medical   medical.gif  \
          \( present.gif  -set label Present  \) \
          \( shading.gif  -set label Shading  \) \
          -tile x1  -frame 5  -geometry '60x60+2+2>' \
          -title 'My Images'     titled.jpg
[IM Output]
您可以使用「-label ''」或「+label」來關閉下一個(些)影像的影像標籤。但是,您稍後會看到這兩種設定並不完全相同。這同樣適用於讀取後標籤「-set」操作。

  magick montage             balloon.gif \
          -label 'My Image'  medical.gif \
          +label             present.gif \
          -label ' '         shading.gif \
          -tile x1  -frame 5  -geometry '60x60+2+2>'   labeling.jpg
[IM Output]
最後一張影像顯示如何使用空格作為影像標籤,您可以建立影像標籤空間,但將其保留空白。這在使用蒙太奇時提供了一個很好的經驗法則...
要嘛為所有影像加上標籤,要嘛就不要加!
您不必在蒙太奇操作期間為影像加上標籤。MIFF 和 PNG 格式都可以將標籤儲存為其影像格式的一部分。蒙太奇會自動標記任何讀取時已包含標籤的影像。這是自動執行的,不需要特別指定,我已經使用這種技術產生了一些非常複雜的影像蒙太奇。例如,標註角度範例 中的蒙太奇陣列就是使用這種技術建立的。如果您不想要這種自動標籤,則必須在讀取影像之前使用「-label ''」明確告知蒙太奇將所有正在讀取或建立的標籤重設為空字串。或者,您也可以在讀取影像後使用「+set label」刪除標籤中繼資料。這就是「+label」與使用空標籤(「-label ''」)的不同之處。前者會將預設行為重設回自動使用正在讀取的影像可能擁有的任何標籤中繼資料,而後者則會將標籤替換為空字串,有效地移除標籤。您也可以使用「-label '%l'」保留影像的原始標籤,這在影像處理腳本中作為無操作標籤選項非常有用。請注意,「-set」無法還原影像的原始標籤,一旦它被修改或移除,無論是使用「-label」還是「-set

  magick -label 'medical'  medical.gif  label_medical.png
  magick -label 'logo'     logo:        label_logo.png
  magick -label 'rose'     rose:       label_rose.png

  magick montage    label_medical.png \
          -label '' label_logo.png    \
          +label    label_rose.png    \
          -tile x1  -frame 5  -geometry '60x60+2+2>' label_control.jpg
[IM Output]
在上面您可以看到,第一個影像是使用影像本身提供的標籤進行標記的。第二個影像的傳入標籤已透過「-label ''」設定移除,而第三個影像也使用了影像標籤,因為我們使用「+label」關閉了標籤設定。

使用儲存的圖像元數據

當產生之後要讓 montage 使用的圖片時,重要的是要知道某個圖片檔案格式可以儲存何種圖片中繼資料。例如,只有 PNG 和 MIFF 圖片檔案格式可以在其儲存的圖片檔案格式中實際儲存「label」中繼資料…

  magick -label 'GIF'  balloon.gif  label.gif
  magick -label 'JPG'  medical.gif  label.jpg
  magick -label 'PNG'  present.gif  label.png
  magick -label 'MIFF' shading.gif  label.miff

  montage label.gif label.jpg label.png label.miff \
          -tile x1  -frame 5  -geometry '60x60+2+2>' label_files.jpg
  rm label.*
[IM Output]
但是,所有常見的檔案格式都允許您使用「comment」中繼資料,您可以透過在「-label」中指定「%c」參數來使用它。

  magick -comment 'GIF'  balloon.gif  comment.gif
  magick -comment 'JPG'  medical.gif  comment.jpg
  magick -comment 'PNG'  present.gif  comment.png
  magick -comment 'MIFF' shading.gif  comment.miff

  magick montage -label '%c' comment.gif comment.jpg comment.png comment.miff \
          -tile x1  -frame 5  -geometry '60x60+2+2>' comment_files.jpg
  rm comment.*
[IM Output]
這對於以 JPEG 檔案格式儲存的圖片通常更有用,儘管 JPEG 圖片註解通常太大(通常是描述圖片的整段文字),無法用作 montage 標籤,因為它們不會自動換行(請參閱拍立得照片的蒙太奇,了解使用圖片「註解」中繼資料進行標記的替代方法)。許多其他程式也會自動將「製作者」標籤和註解添加到其儲存的圖片中(不好!),因此建議謹慎使用。 GIMP 程式特別喜歡添加此類註解和標籤,除非您告訴它不要這樣做,否則每次儲存圖片時都會添加。請注意,IM 通常不用於將註解添加到儲存的 JPEG 檔案中(由於JPEG 失真壓縮),除非出於其他原因處理它們。相反,它們通常透過其他方法添加,以避免讀取和重新寫入圖片資料,從而降低您添加註解的 JPEG 圖片檔案的品質。有關一些此類方法,請參閱無失真 JPEG 處理選項。同樣重要的是要注意,標記(和圖片「註解」)並非 montage 特有的。如果存在圖片標籤,Montage 只會自動使用它們。標籤和註解會附加到圖片及其特定檔案格式,而不是 montage 或 IM 特有的。PNG 和 MIFF 檔案格式也允許您使用不太常用的「caption」中繼資料。

  magick balloon.gif -set caption 'GIF'  caption.gif
  magick medical.gif -set caption 'JPG'  caption.jpg
  magick present.gif -set caption 'PNG'  caption.png
  magick shading.gif -set caption 'MIFF' caption.miff

  magick montage -label '%[caption]' caption.gif caption.jpg caption.png caption.miff \
          -tile x1  -frame 5  -geometry '60x60+2+2>' caption_files.jpg
  rm caption.*
[IM Output]
實際上,這兩種檔案格式都允許您儲存儲存圖片時圖片中可能存在的任何圖片屬性中繼資料

  magick balloon.gif -set my_data 'GIF'  my_data.gif
  magick medical.gif -set my_data 'JPG'  my_data.jpg
  magick present.gif -set my_data 'PNG'  my_data.png
  magick shading.gif -set my_data 'MIFF' my_data.miff

  magick montage -label '%[my_data]' my_data.gif my_data.jpg my_data.png my_data.miff \
          -tile x1  -frame 5  -geometry '60x60+2+2>' my_data_files.jpg
  rm my_data.*
[IM Output]

在蒙太奇中保留間隙

雖然您可以透過明智地使用「-tile」設定並控制給定的圖片數量在 montage 的底部留出額外空間,但在 montage 的中間留出空白區塊空間需要使用特殊的圖片。「null:」生成的圖片專門為此目的而定義。它出現的位置不會收到任何標籤(即使已定義),也不會添加任何框架或陰影「絨毛」。除了 montage 繪圖畫布本身的背景顏色(或紋理)外,該區塊完全是空的。

  magick montage -label 'Image' medical.gif null: present.gif \
          -tile x1  -frame 5  -geometry +2+2   montage_null.jpg
[IM Output]
請注意,對於其他 IM 命令,「null:」圖片表示單個像素的透明圖片。它也用作「錯誤圖片」,用於「-crop」或「-trim」等選項,這些選項可能會由於操作而產生「零」或空圖片。這個特殊的圖片不能儲存起來供以後使用以留下空白,目前它只在「magick montage」的命令列中是「特殊的」。
目前,沒有一種方法允許蒙太奇圖片跨越多行或多列,就像在 HTML 表格中那樣。您也不能生成大小可變的行和列來最佳地適應正在生成的圖片陣列。

如果您真的需要這種功能,則需要開發自己的 montage 類型應用程式。如果您確實開發了某些東西,請貢獻出來,我們會考慮將其合併到現有的 montage 應用程式中。

一些解決方案包括自己標記和框選圖片縮略圖,然後使用附加圖片或使用更自由的圖層圖片技術。


更多蒙太奇設定

以上展示的「magick montage」設定僅是蒙太奇的基本控制項。還有很多其他設定,您可以根據自己的需求考慮使用。

蒙太奇顏色設定

-background 繪製框架外的顏色。通常將其設置為「none」或「transparent」,以便在網頁上使用。如果給定,則將改用 -texture 設定。
-bordercolor   圖像框架內或任何邊框填充內的填充顏色。圖像中的任何透明區域都將變為此顏色,除非未添加此類裝飾。
-mattecolor 用作框架顏色的顏色。請注意,顏色也會變亮和變暗,以賦予框架斜角 3D 外觀。所以這個設定實際上定義了 5 種顏色。(另請參閱圖像框架
-fill 文字標籤和標題的填充顏色。
-stroke 文字標籤和標題的筆畫顏色。

蒙太奇控制設定

-tile {欄數}x{列數}
用於填充單個蒙太奇圖像的橫向和縱向圖像數量。如果讀取或創建的圖像數量超過單個蒙太奇圖像的容量,則會創建多個圖像。(請參閱上面的平鋪控制項
-title {字串}
使用與標記個別圖像相同的字體(但更大)在整個蒙太奇上設置標題。
-frame {寬度}
使用提供的寬度在包含圖像的方框周圍創建一個框架(必須至少為 2,但 5 或 6 是比較好的值)。如果使用圖像中的任何透明度,也會變成邊框顏色。
-border {寬度}
使用提供的寬度在圖像周圍創建邊框。如果使用圖像中的任何透明度,也會變成邊框顏色。
-shadow
生成框架的陰影。請注意,不需要也不應提供參數。
-texture {檔案名稱}
使用給定的紋理(平鋪圖像)作為背景,而不是特定的顏色。有關更多信息,請參閱下面的背景和透明度部分。
-geometry {}x{}+{X}+{Y}
在蒙太奇將所有圖像讀取並覆蓋到其畫布上之前調整圖像大小。它還定義了繪製圖像的圖塊的大小和間距。如果未指定大小,則不會調整圖像大小。
-gravity {方向}
如果圖像小於框架,則圖像在框架中的放置位置。默認情況下,它位於中央。
除了上述內容之外,還包含了「label:」圖像建立運算子能夠理解的所有字體設定(請參閱標籤圖像產生器)。這些設定用於建立顯示在圖像下方的標籤。其中包括「-font」、「-pointsize」(對於「-title」無效)、「-density」、「-fill」、「-stroke」和「-strokewidth」等設定。只要在最後的「輸出檔名」參數之前定義或重設任何或所有上述設定,montage 就會按照您的要求使用它們。

重複使用圖像讀取/建立設定

但請注意,其中許多選項也用於其他目的,無論是在圖像產生或圖像處理過程中。但由於 IM v6 中「依序處理」的命令列處理方式,這對「magick montage」命令來說不成問題。這表示您可以自由使用任何這些選項設定來讀取、建立或修改正在讀取的圖像,然後在讀取或建立所有圖像後重設這些設定。最終的設定值將是 montage 用於最終處理的值。這與版本 6 之前的 IM 版本不同,在那些版本中,通常無法在不產生中間圖像的情況下將圖像建立設定與 montage 設定分開(例如上述圖像標籤範例)。以下是一個設定重複使用的實際範例。我想建立一個表格,列出我在這些範例頁面中使用的一些字體,然後將設定重設為其他值,以便 montage 對圖像進行最終處理。
 magick montage -pointsize 24 -background Lavender \ -font Candice -label Candice label:Abc-123 \ -font Corsiva -label Corsiva label:Abc-123 \ -font SheerBeauty -label SheerBeauty label:Abc-123 \ -font Ravie -label Ravie label:Abc-123 \ -font Arial -label Arial label:Abc-123 \ -font ArialI -label ArialI label:Abc-123 \ -font ArialB -label ArialB label:Abc-123 \ -font ArialBk -label ArialBk label:Abc-123 \ -font CourierNew -label CourierNew label:Abc-123 \ -font LokiCola -label LokiCola label:Abc-123 \ -font Gecko -label Gecko label:Abc-123 \ -font Wedgie -label Wedgie label:Abc-123 \ -font WebDings -label WebDings label:Abc-123 \ -font WingDings -label WingDings label:Abc-123 \ -font WingDings2 -label WingDings2 label:Abc-123 \ -font Zymbols -label Zymbols label:Abc-123 \ \ -frame 5 -geometry +2+2 -font Arial -pointsize 12 \ -background none -bordercolor SkyBlue -mattecolor DodgerBlue \ montage_fonts.gif 
[IM 輸出]
請注意「magick montage」指令分為兩個階段。我使用一個幾乎為空的額外行清楚地標記出來。第一部分基本上與您使用一般的 IM「magick」指令定義多個圖像完全相同,並且以相同的「所見即所得」順序處理。第二部分定義了我希望「magick montage」指令本身使用的「所有」設定。也就是說,我想要在最終蒙太奇圖像中使用的框架、圖像大小調整、字體和顏色。我特別注意要為蒙太奇圖像下方的標籤重設「-font」和「-pointsize」設定。雖然您可以像這樣分隔「magick montage」的選項,但您實際上可以在命令列上的任何時間定義蒙太奇設定。只要這些設定不會干擾您的圖像建立和處理選項,並且在到達命令列末尾時仍然正確定義,「magick montage」就會使用它們。旁白:您可能想看看我編寫的 shell 腳本來執行與上述類似的操作(並且適用於早期版本的 montage)以顯示一個名為「show_fonts」的 TrueType (.ttf) 字體目錄。另一個 shell 腳本範例是「show_colors」。

蒙太奇與 Magick 選項差異

現在,雖然「magick montage」通常允許您在讀取和處理其輸入圖像時使用任何「magick」設定和運算符,但有一些差異需要強調。這些「magick」運算符和設定在「magick montage」中使用時有所不同。
-tile
在「magick」中,「-tile」設定定義要用作紋理的圖像,而不是使用「-fill」顏色。在「magick montage」中,它定義了如何佈局單個圖像單元格的「圖塊」。有關更多詳細資訊,請參閱上面的圖塊佈局控制
-frame
在「magick」中,這是一個用於在圖像周圍添加 3D 框架邊框的運算符,並且需要 4 個參數才能正常工作(請參閱轉換框架範例)。有關更多詳細資訊,請參閱框架裝飾
-border
大約在 IM v6.1.0 版本中,此運算符成為一個特殊的蒙太奇選項。因此,就像之前的 frame 選項一樣,它只接受一個數字作為參數,而不是像轉換邊框那樣接受兩個參數。有關更多詳細資訊,請參閱邊框裝飾
-shadow
magick」中的「-shadow」選項採用一個參數,該參數用於建立柔和的模糊陰影,可以放置在原始圖像的第二個副本下方。但是,在「magick montage」中,這只是一個布林值設定,用於開啟和關閉矩形陰影功能。有關更多詳細資訊,請參閱陰影裝飾
-geometry
magick montage」中的「-geometry」選項僅用於提供最終蒙太奇中每個單元格內的圖像大小,以及單元格之間的間距。在「magick」中,它只調整最後一個圖像的大小,並設定圖像合成的偏移量。
如果真的需要使用 "magick" 格式的選項,則需要先使用 "magick" 預處理影像,再將其傳遞給 "magick montage"。一種使用中繼檔案的方法已在上面的 影像標籤 範例中示範過。另一種方法是直接在 "magick" 中進行處理,然後將產生的多個影像通過管道傳輸到 "magick montage"。如果始終先進行影像輸入處理,然後再設定 "magick montage" 特定的設定(就像我在所有這些範例中所做的那樣),這種分離很容易做到。這在上面的最後一個字型範例中特別明顯。例如,讓我們使用 "magick" 框住影像,然後使用 "magick montage" 標籤框再次框住它們。

  magick -label %f   balloon.gif medical.gif present.gif shading.gif \
          -mattecolor peru  -frame 10x5+3+0    miff:-  |\
     magick montage  -   -tile x1  -frame 5  -geometry '64x56+5+5>' double_frame.jpg
[IM Output]
您也可以看到 "magick" 格式的 "-frame" 運算子所需的額外參數。

影像目錄索引

HTML 縮圖影像地圖

Montage 特別適合用於產生影像的縮圖地圖。例如,我在這裡建立了 照片影像 來源目錄的索引,其中包含 IM 範例中使用的數位照片範例。點擊下面的「藝術」影像以查看結果。

  magick montage -label '%t\n%[width]x%[height]' \
          -size 512x512 '../img_photos/*_orig.*[120x90]' -auto-orient \
          -geometry +5+5 -tile 5x  -frame 5  -shadow  photo_index.html
[IM Output]
IM 範例
照片庫
請注意使用 '%[width]x%[height]' 而不是僅僅使用 '%wx%h'。這一點很重要,因為影像在讀取時會被調整大小。前者會使用影像在磁碟上的原始像素大小來標記影像,而後者則會使用影像當前的調整後大小。這一點很容易被使用者忽略。
此命令的結果是產生了三個檔案...
photo_index.png 所有影像縮圖的蒙太奇
photo_index_map.shtml 縮圖影像的 HTML「影像地圖」
photo_index.html 全球資訊網的 HTML 縮圖索引頁面。
這也包含先前影像地圖的副本。
當然,如果您只需要一個索引圖像,則不必生成 HTML 索引文件。在這種情況下,只需將上述命令中的“INDEX.html”替換為您要生成的圖像。請注意,圖像“-label”使用了圖像屬性轉義%t”。這是沒有任何“路徑”組件的圖像文件名。儘管 HTML 鏈接仍將包含適當的“路徑”組件,允許您在與圖像本身不同的目錄中構建索引圖像。上述示例中的源圖像“'*_orig.*'”被引用,因此“magick montage”命令會自行擴展“*”,而不是由命令行 shell 擴展。這避免了您可能遇到的任何命令行長度限制問題。此外,我還會在讀取圖像時對其進行一些初始調整大小“[120x190]”(請參閱讀取圖像修改器)。對於 JPEG 圖像,我還指定了一個較小的“-size”設置,以便 JPEG 庫可以進行一些非常粗略的初始縮放,而不會將整個圖像讀入內存。如果沒有這樣做,那麼非常大的 JPEG 圖像可能會在沒有真正需要的情況下耗盡大量的內存和 CPU 週期。我還“-strip”刪除圖像可能具有的任何配置文件。有關更多信息,請參閱配置文件、剝離和 JPEG 處理讀取 JPEG 圖像。請記住,montage“-geometry”選項也可以指定最終的調整大小設置,但在這種情況下不需要它,因為我在讀取過程中完成了它,因此我沒有在該設置中設置任何“大小”。最後,使用“-tile”選項“5x”來確保所有圖像都出現在單個圖像中,否則“magick montage”可能會生成多頁 HTML 文件,這些文件沒有正確鏈接在一起。這有望會改變,儘管 HTML 生成不是 ImageMagick 的主要目標。有關生成縮略圖和 HTML 索引頁面的其他方法,請閱讀縮略圖示例頁面

使用 JPEG 圖像的較小 HTML 索引映射

上面的索引圖像生成了 PNG 格式的索引圖像。之所以使用這種格式,是因為它是一種無損格式,當被索引的圖像顏色差異很大時,這一點非常重要。如果背景顏色設置為“transparent”或“none”,它還可以使用 montage 的新“軟陰影”功能。非常非常舊的 IM 會為上述內容生成 GIF 圖像。但是,由於格式限制,這會對結果進行嚴重的色彩還原。它也不允許像 PNG 那樣使用半透明的“軟陰影”。JPEG 也不允許半透明,但如果您沒有為圖像使用透明背景,則這不是問題。但是,它比 PNG 小得多,這提供了一種方法來大幅減小索引圖像的大小,尤其是對於網絡使用,並且仍然可以處理大範圍的顏色。但是,上面的 HTML 輸出只生成 PNG 格式的圖像,因此您不僅需要將 PNG 轉換為 JPEG,還需要進行一些額外的處理來修復 HTML 文件。

  magick montage -label '%t\n%[width]x%[height]' \
          -size 512x512 '../img_photos/*_orig.*[120x90]' -auto-orient \
          -geometry +5+5 -tile 5x  -frame 5  -shadow  photo_jpeg.html
  magick photo_jpeg.png photo_jpeg.jpg
  perl -i -lpe 's/src="photo_jpeg.png"/src="photo_jpeg.jpg"/' photo_jpeg.html
  rm -f  photo_jpeg.png  photo_jpeg_map.shtml
[IM Output]
IM 範例
照片庫
上面的命令相當棘手,所以這裡是發生的事情...
  • 首先,我像之前一樣生成一個 montage 縮略圖 HTML 索引。這會生成以下文件:“photo_jpeg.html”和“photo_jpeg.png
  • 然後,我將 PNG 圖像轉換為更小的有損 JPEG 圖像。
  • 然後,我使用一個小的“perl”單行腳本將 HTML 文件更改為使用 JPEG 圖像而不是 PNG。
  • 最後,我刪除了 PNG 圖像以及我不需要的 SHTML 貼圖文件。
嘿,我們有一個使用非常小的 JPEG 圖像作為縮略圖索引圖像的縮略圖索引。以下是縮略圖索引圖像文件大小的比較...
[IM Text]
也就是說,索引使用的圖像大小僅為原始 PNG 圖像的 15% 左右。對於可下載的縮略圖網頁來說,這節省了大量的空間!您可以使用更小的「-quality」設定,使 JPEG 圖像更小,儘管預設設定產生的結果已經相當合理。其他可能的選項包括使用「-sampling-factor 2x1」使其更小。

視覺索引圖像(非蒙太奇解決方案)

除了使用蒙太奇之外,另一種方法是使用特殊的「視覺索引」輸入格式...

  magick 'vid:../img_photos/*_orig.*' vid_index.gif
[IM Output]
視覺索引
照片庫
並且還可以產生「可點擊」的 HTML 索引檔案。

  magick 'vid:../img_photos/*_orig.*' vid_index.html
[IM Output]
視覺 HTML
照片庫
顯然,「VID:」在內部使用蒙太奇來產生索引陣列。但是,您無法像直接使用蒙太奇那樣進行相同的控制。請注意,VID HTML 索引會建立 PNG 格式的縮略圖圖像。

拍立得照片的蒙太奇

隨著 複雜拍立得轉換 的出現,現在可以產生風格迥異的蒙太奇和蒙太奇索引。

  magick montage -size 256x256 '../img_photos/*_orig.*' -auto-orient \
          -auto-orient -thumbnail 128x128 \
          -set caption '%t' -bordercolor AliceBlue -background grey20 \
          +polaroid \
          +set label   -background white  -geometry +1+1  -tile 4x \
          polaroid_index.html
[IM Output]
拍立得
蒙太奇
請注意,由於我使用「+polaroid」來框住和標記圖像,因此我需要自己調整圖像大小(使用「-thumbnail」),並確保在實際建立「magick montage」索引陣列之前,已重置「-background」和圖像「-label」。然而,拍立得轉換 在將「捲曲」效果添加到縮略圖圖像的過程中,往往會使文字變得模糊。但是,您可以通過以較大的尺寸生成拍立得圖像,然後將結果縮小 50% 來改善整體效果。唯一的缺點是「陰影」效果會減弱。

  magick montage -size 400x400  '../img_photos/*_orig.*' \
          -auto-orient -thumbnail 200x200 \
          -set caption '%t' -bordercolor Lavender -background grey40 \
          -pointsize 9  -density 144x144  +polaroid  -resize 50% \
          +set label   -background white  -geometry +1+1  -tile 5x \
          polaroid_index2.html
[IM Output]
更清晰
拍立得
蒙太奇
這種花式蒙太奇以及上面顯示的其他技術被用於建立一個腳本,以在實際的「photo_store」目錄中生成蒙太奇縮略圖索引。有關此腳本的結果,請參閱照片庫索引

使用蒙太奇的特殊技巧

蒙太奇成列

默認情況下,「magick montage」只能按給定順序(通常是排序順序)逐行放置圖像。但是,有時您希望它們以列順序顯示。這無法通過單個命令完成,而需要至少兩個命令的管道。例如,在這裡,我使用兩個蒙太奇生成了一個 5x3 磁貼的頁面。

  magick montage font_*.gif  -tile 1x3  -geometry 16x16+1+1  miff:- |\
    magick montage -  -geometry +0+0 -tile 5x1  montage_columns.gif
[IM Output]
請注意,第一個「magick montage」建立磁貼並執行任何所需的幾何形狀磁貼大小調整、框住、標記和間距。然後,它將為每一列磁貼輸出一個圖像。第二個「magick montage」然後簡單地將各列合併成「頁面」圖像,而不在列之間添加任何額外的空間。如果您只需要一個包含可變列數的單個圖像,則可以用「magick」替換第二個「magick montage」,以便在不添加額外「頁面」空間的情況下進行合併。例如...

  magick montage font_*.gif  -tile 1x3  -geometry 16x16+1+1  miff:- |\
    magick - +append montage_columns_2.gif
[IM Output]

重疊的蒙太奇圖塊

IM 使用者論壇 中,Fred Weinhaus(又名 fmw42)與另一位使用者 pooco 在討論時發現,如果將圖塊間距(在 "-geometry" 設定中設定)設定為負數,則實際上可以重疊繪製圖像的圖塊區域。例如,我們在此使用負的水平圖塊間距來排列單行圖像。

  magick montage null:   font_*.gif   null: \
          -tile x1 -geometry -5+2  montage_overlap.jpg
[IM Output]
旋轉圖像將使重疊的系列更加有趣...

  magick montage null: font_*.gif null: -background none -rotate 30 \
          -background white -tile x1 -geometry -8+2  montage_rot_overlap.jpg
[IM Output]
請注意,我需要在圖像行的開頭和結尾添加一個特殊的 "null:" 間距圖像,這樣圖像就不會溢出 "magick montage" 計算並生成的畫布。這為我們提供了一些有趣的可能性。例如,您可以通過使用隨機旋轉的 拍立得變換 來生成一行非常有趣的重疊縮略圖。

  magick montage -size 400x400 null: ../img_photos/[a-m]*_orig.* null: \
          -auto-orient  -thumbnail 200x200 \
          -bordercolor Lavender -background black +polaroid -resize 30% \
          -gravity center -background none -extent 80x80 \
          -background SkyBlue -geometry -10+2  -tile x1  polaroid_overlap.jpg
[IM Output]
在上面使用 extent 是為了消除 "+polaroid" 在不同「運行」時可能產生的圖像大小的隨機性,從而更好地控制圖像之間的最終間距和重疊。這是一個非常有趣的結果,儘管它實際上應該被歸類為錯誤,因為這不是 "magick montage" 的預期用途。我也不希望任何 HTML 圖像映射都能正常工作,除非使用者進行一些修復。但是,使用腳本形式的 圖層合併 演示了一個更複雜且使用者可控的重疊圖像解決方案,這是推薦且更合乎邏輯的解決方案。請參閱 圖層圖像的程序化定位 中的示例。

蒙太奇串聯模式

如您所見,蒙太奇具有一种特殊的串聯模式,可以用於將圖像連接在一起,而無需任何額外的空間,就像 "-append" 選項一樣。但是,我建議您適當設定 "-tile" 選項,以便將附加方向設定為水平、垂直或陣列。例如,我們在此使用 "-tile x1" 水平附加圖像。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -mode Concatenate  -tile x1  montage_cat.jpg
[IM Output]
但您也可以使用它輕鬆地創建圖像陣列。最好圖像大小相同,以便它們正確地組合在一起。

  magick montage balloon.gif medical.gif present.gif shading.gif \
          -mode Concatenate  -tile 2x2  montage_array.jpg
[IM Output]
串聯不同大小的圖像時,圖像將以「頂部」垂直對齊方式串聯,然後以「左側」水平行對齊方式串聯。

  magick montage medical.gif rose:      present.gif shading.gif \
          granite:    balloon.gif netscape:   recycle.gif \
          -mode Concatenate  -tile 4x  montage_cat2.jpg
[IM Output]
但是,當添加框架時,垂直對齊會變得怪異。

  magick montage medical.gif rose:      present.gif shading.gif \
          granite:    balloon.gif netscape:   recycle.gif \
          -mode Concatenate  -tile 4x  -frame 5  montage_cat3.jpg
[IM Output]
當然,框架並不是真正的串聯模式的一部分,因此如果在 "-mode" 設定之前設定了 "-frame",它將被關閉。因此,除了在不小心使用「零幾何」(見下文)時,否則不太可能看到這種怪癖。
蒙太奇串聯到「HTML」圖像索引格式會產生不正確的圖像映射。基本上,生成的圖像映射就像生成的蒙太奇是真正均勻劃分的圖像「陣列」一樣,而不是圖像的串聯。換句話說,對於「短」圖像行來說,這是錯誤的。

零幾何,需要小心

如果只有 "-geometry" 間距值(未指定圖像大小調整),則所有蒙太奇圖像框架都將設定為相同大小,以便最寬和最高的圖像都能容納,而無需調整大小。這本身就是一種有用的行為...

  magick montage present.gif rose: shading.gif \
          -frame 5  -geometry +1+1   montage_geom_1.jpg
[IM Output]
但是,在圖像框架周圍和之間留下了 1 個像素的間隙。但是,如果您嘗試使用 "+0+0" 的位置刪除這些間隙,則會遇到一個非常不尋常的問題...

  magick montage present.gif rose: shading.gif \
          -tile x1  -frame 5  -geometry +0+0  montage_geom_0.jpg
[IM Output]
您指定的「零幾何」 (亦即「-geometry 0x0+0+0」),會產生將 montage 置於「連接」模式的額外效果 (見上文),這並*不是*我們在上述範例中想要的。對於單一影像,我們是否使用零「-append」(以及連接模式) 也沒有關係。預期的結果就是我們想要的,沒有額外的邊框。因此,如果您僅使用「magick montage」來為影像新增標籤,「-geometry +0+0」就可以了。但是,如果您為影像指定了非零的幾何「大小」,即使您使用了零偏移,也不會叫用連接模式。這反過來為我們最初的問題提供了一個巧妙的解決方案。我們要做的是設定一個「1x1」的幾何影像大小,但也告訴 IM 不要將影像縮小到這個大小 (使用「<」字元)!換句話說,永遠不要調整影像大小,只需在非零的幾何參數中使用零偏移。

  magick montage present.gif rose: shading.gif \
          -frame 5  -geometry '1x1+0+0<'  montage_geom_1x1.jpg
[IM Output]
這帶出了另一個好的經驗法則...
使用 montage 時,請務必設定非零的幾何。
即使它只是像我上面使用的「假」幾何。

背景和透明度處理

預設情況下,影像是疊加在 montage 畫布上的,畫布是使用「-background」顏色設定建立的,如下所示。

  magick montage font_9.gif  \( recycle.gif -set label recycle \)  medical.gif \
          -tile x1  -geometry +5+5  -background lightblue   bg_lightblue.gif
[IM Output]
您可以使用「-texture」來定義一個拼貼影像來代替「-background」顏色,而不是純色。

  magick montage font_9.gif  \( recycle.gif -set label recycle \)  medical.gif \
          -tile x1  -geometry +5+5   -texture bg.gif      bg_texture.gif
[IM Output]
新增邊框 (在拼貼中新增額外的邊框空間) 只會在背景畫布上新增更多繪製的「裝飾」。

  magick montage font_9.gif  \( recycle.gif -set label recycle \)  medical.gif \
          -tile x1  -frame 5  -geometry '40x40+5+5>' \
          -bordercolor lightblue  -texture bg.gif  bg_frame.gif
[IM Output]
請注意,在有邊框的情況下,「-bordercolor」設定將用於填充邊框內部,實際上成為影像的背景顏色。另請注意,影像的任何透明區域也會設定為此顏色。
在 IM 6.1.4 版之前,在影像的透明區域中看到的內容是未定義的。在某些版本中,您會看到穿過有邊框的影像到背景顏色或紋理。在其他版本中,您可能會看到黑色或白色。在其他版本中,您將能夠看到所有圖層,並且最終影像在原始影像透明的地方將是透明的。如果這對您來說是個問題,請*立即*升級。

IM 6.1.4 版的另一個新功能是能夠使用特殊的 1 像素寬邊框。這基本上會完全移除影像儲存格周圍的邊框,但會保留影像周圍 (和下方) 的內部「-bordercolor」填充。例如,比較「1」的邊框和最小邊框寬度「2」。

  magick montage font_1.gif  \( recycle.gif -set label recycle \)  medical.gif \
          -tile x1  -frame 1  -geometry '40x40+5+5>' \
          -bordercolor lightblue  -texture bg.gif  bg_frame_1.gif
[IM Output]

  magick montage font_2.gif  \( recycle.gif -set label recycle \)  medical.gif \
          -tile x1  -frame 2  -geometry '40x40+5+5>' \
          -bordercolor lightblue  -texture bg.gif  bg_frame_2.gif
[IM Output]
但是,如果您希望 montage 具有透明背景怎麼辦?特別是,如果您打算在包含紋理映射的網頁上使用它。很簡單,只需使用「None」或「Transparent」的「-background」顏色,而不要使用任何「-texture」影像來覆蓋該設定。例如,在這裡我們產生了一個透明的 montage。請注意,「-geometry」仍用於在影像周圍和之間新增空間。

  magick montage font_9.gif  recycle.gif  medical.gif \
          -tile x1  -geometry +2+2  -background none   bg_none.gif
[IM Output]
當然,如果您也使用「-frame」,您也需要將「-bordercolor」設為透明。

  magick montage font_9.gif  recycle.gif  medical.gif \
          -tile x1 -frame 5 -geometry '40x40+5+5>' \
          -bordercolor none  -background none    bg_framed_trans.gif
[IM Output]
請注意,montage 的「-shadow」選項完全不受上述所有因素的影響。它是在將其疊加到背景顏色或紋理之前,根據儲存格的最終透明形狀來套用的。

  magick montage font_9.gif  recycle.gif  medical.gif \
          -tile x1  -shadow  -geometry '40x40+5+5>' \
          -texture bg.gif  bg_shadow.gif
[IM Output]

  magick montage font_9.gif  recycle.gif  medical.gif \
          -tile x1 -frame 5 -shadow  -geometry '40x40+5+5>' \
          -bordercolor none   -texture bg.gif  bg_shadow_framed.gif
[IM Output]



歡迎提供任何關於使用「magick montage」的建議、想法或其他範例。這些範例頁面中的任何內容也同樣歡迎指教。
Montage Image Output Size

The mathematics of montage is straight forward...

Basically the montage width should be....
  (geometry_size + 2*frame_size + 2*geometry_offset) * images_per_column

That is, each 'cell' of montage has a fixed sized frame and spacing (border)
added around it before the cells are appended together.

In essence the size of montage is also a multiple of the tile size, which can
make it easy to break up montage, or re-arrange the 'cells', if so desired,
as they are simple fixed sized tiles in a rectangular array.

The height is similar but with tha additional spacing needed for labels and
the optional montage title, both of which are much more difficult to
calculate, as they depend heavilly on text, font, pointsize, and density
settings.

There is also an effect of adding a shadow to the montage in this calculation,
but that appears to be a simple small fixed addition to the bototm and right
edges.  It does not appear to effect the tile size used.