ImageMagick 範例 --
雜項

索引
ImageMagick 範例 序言和索引
插值 (像素間顏色查找)
虛擬像素 (遺漏圖像顏色查找)
純色隨機點
註釋參數用法
拼接:建立新的圖像運算子
邊框、框架和邊框顏色的使用
列表運算子測試
此頁面包含測試 ImageMagick 各個方面的範例。但這些範例不適合(至少不是正式地)放在其他範例頁面上討論。此頁面還包含一些表格,說明版本參數與特定 IM 運算子的結果。然而,其他人也做過這件事,除非我有什麼要補充的,否則我不會進一步處理。

像素插值或像素間顏色查找

-interpolate」設定用於在來源影像中查找顏色,但該「查找點」落在來源影像的像素之間。這在各種影像操作中都有使用,例如「-fx」(DIY 特效運算子)和「-distort」(廣義影像扭曲運算子),以及其他相關運算子,如圓形扭曲。基本上,「插值」會告訴 IM 如何從影像中解釋直接顏色查找,當該點與影像中的實際像素不完全匹配,而是落在像素之間的空間時。例如,如果您查找像素位置3,4 的顏色,您應該會得到確切的像素顏色。但是,如果您在點3.23,4.75 查找影像的顏色,IM 應該返回什麼?您應該得到3,4 還是3,5 的像素顏色?或者可能是周圍像素顏色的一些混合,如果是這樣,應該如何將顏色合併在一起?像素插值定義了 ImageMagick 在浮點位置(以像素坐標表示)查找單一顏色時應該做什麼。插值在某種程度上類似於像素重採樣,例如重採樣濾鏡提供的功能。本質的區別在於,重採樣具有「比例」、「區域」或可變「窗口」,從中返回代表區域中所有像素的顏色。插值不涉及「比例」,只有一個單一的查找「點」,並且只有一個固定大小的「區域」圍繞該點,用於確定在該點使用的顏色。當然,當重採樣的區域達到最小工作「窗口」時,大多數區域重採樣演算法往往會退化為插值方法,而當影像被放大或升採樣時,自然會發生這種情況。這就是為什麼插值濾鏡高斯模糊濾鏡在放大影像時往往效果更好的原因。插值基本上是一種較低形式的採樣,基本上用於在您想要對「什麼顏色」問題的簡單快速答案時使用。

簡單插值方法

這些都是直截了當的簡單方法,它們儘可能少地從「點插值」中返回要使用的顏色。最簡單的是「Nearest」和「Integer」,它們只會從來源影像中挑選單一像素顏色,因為它没有任何混合或其他混合效果。這保留了影像的原始顏色值,但代價是會產生鋸齒效應,而且影像通常看起來不太平滑。
從 IM v6.7.6-2 開始,您可以使用「Nearest」作為「Nearest-Neighbour」插值設定的簡稱。
這兩種方法非常相似,唯一的區別在於查找坐標從源圖像中提取哪個像素。具體來說,「Integer」會簡單地將查找點向下舍入以選擇像素,這會導致整體平移半個像素到右下方。它通常只用於源圖像的簡化「縮放」。另一方面,「Nearest」會選擇最接近浮點查找坐標的像素,因此會產生更準確的結果。「Blend」會混合(平均)最近的 1、2 或 4 個像素,具體取決於它們與採樣點的距離。結果是原始像素顏色仍然存在,但大小減半,而混合顏色的棋盤格填充了它們之間的空間。(請參閱下面的示例)「Average」實際上永遠不會產生完全相同的顏色匹配,但始終會混合周圍的 4 個像素以產生局部平均值。這在顏色查找情況下很有用。「Average4」也可以用作此插值方法的別名。「Average9」類似,但會平均採樣點周圍最近的 9 個像素,產生模糊的結果。「Average16」會平均採樣點周圍最近的 16 個像素,產生極度模糊的結果。以下是各種簡單插值方法的總結,當放大一小群彩色像素或單個白色像素時。原始圖像看起來像「最近」的結果,但要小得多。

  for method in  integer nearest blend average average9 average16 ; do
    magick \( xc:red xc:blue +append \) \
            \( xc:yellow xc:cyan +append \) -append \
            -bordercolor black -border 1 \
            -filter point -interpolate $method \
            +distort SRT 20,0 ip_color_${method}.jpg
    magick xc: -bordercolor black -border 2 \
            -filter point -interpolate $method \
            +distort SRT 16,0 ip_pixel_${method}.jpg
  done
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
整數 最近 混合 平均 平均 9 平均 16
在 IM v6.7.7-6 之前,「Average」實際上等同於現在的「Average16」。其他兩個平均插值器以及「Blend」和「Background」也是在這個時候添加的。
還提供了另一種簡單的插值方法「Background」,它僅返回任何「採樣」源圖像的當前背景顏色。在許多方面,這毫無用處,因為您通常只會得到一張空白的純色圖像。它的主要用途是檢查更複雜的重新採樣函數,例如重新採樣失敗,其中 EWA 重新採樣濾波器(通常用於一般失真運算符)在重新採樣在其“支持”或重新採樣區域中找不到任何像素時將回退到插值查找。通過將插值設置為「Background」並將背景顏色設置為突出的顏色(如「red」),您可以查看結果圖像中的像素以查看重新採樣「失敗」或「遺漏所有源圖像像素」的原因。通常是由於支持設置太小,或者是由於使用了專家濾鏡選項。未來:未來可能的插值選項是對插值區域進行“隨機”選擇。可能對花式插值效果有用!

雙線性

Bilinear」(或線性插值)是默認的插值方法,並且可能是通過組合查找或採樣點周圍像素的顏色來獲得真正插值結果的最簡單方法之一。以下是解釋雙線性插值如何工作的圖表。
[diagram]
也就是說,它只是在正交方向上連接直線以定位給定採樣點的顏色。當與調整大小一起使用時,結果也等同於三角形重新採樣濾波器

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap  -fx 'v.p{i/(w-1),j/(h-1)}' \
          interpolate_bilinear.jpg
[IM Output]

  magick \( xc:white xc:black +append \) \
          \( xc:black xc:white +append \) -append \
          -size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
          interpolate_saddle.jpg
[IM Output]
最後一張圖片顯示線性漸層是如何沿著四個已知點之間的邊緣形成的,然後在這些邊緣之間形成第二個線性漸層。也就是說,周圍像素之間的顏色是使用水平和垂直線性漸層生成的。這反過來會產生彎曲的二維漸層,通常稱為「鞍形」,因為它在兩個相對的角上凸起,而在另外兩個角上凹陷。您甚至可以使用這種方法更直接地生成 45 度角的線性漸層,但需要您指定對角相對角的中間顏色。

  magick \( xc:blue xc:navy +append \) \
          \( xc:navy xc:black +append \) -append \
          -size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
          interpolate_45linear.jpg
[IM Output]
這種默認插值方法最重要的方面是,圖像的最中心像素始終是所有四個角顏色的平均值,邊緣處具有完美的線性漸層,並且角處的顏色完全匹配。

網格

-interpolate」設置為「Mesh」是「雙線性」插值的一種變體。 「雙線性」會產生三維曲面,而「網格」旨在將像素間區域分成兩個平坦的三角形表面。將區域劃分為兩個三角形的依據是具有兩個「最接近」角顏色的對角線。
有關「網格」演算法的詳細資訊,請參閱論文基於像素級資料相關三角化的圖像插值
例如,讓我們使用上面使用的相同一組角顏色。

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap   -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh.jpg
[IM Output]
如您所見,「網格」演算法產生的顏色插值集幾乎與「雙線性」完全相同。但是,如果我們反轉黃色和青色..

  magick \( xc:red xc:blue +append \) \
          \( xc:cyan xc:yellow +append \) -append \
          -size 100x100 xc: +swap   -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh2.jpg
[IM Output]
這次「網格」演算法判定「藍色」和「青色」是兩個最接近的角,並在這兩個角之間創建了一個對角線線性漸層。然後,其餘顏色從該線到另外兩個角形成一個簡單的平面三角形漸層。這似乎是一種不尋常的插值,但該方法確保在僅稍微調整顏色圖像的大小、旋轉或剪切時,銳利的邊緣仍然保持相當銳利。事實上,自適應調整大小操作(「-adaptive-resize」)將這一事實用於小圖像調整大小,以減少結果的過度模糊。例如,如果我們有一個「白色」角,「網格」會假設找到了一條邊緣,並調整插值顏色以突出顯示該邊緣。

  magick \( xc:black xc:black +append \) \
          \( xc:white xc:black +append \) -append \
          -size 100x100 xc: +swap    -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh3.jpg
[IM Output]
當然,如果顏色產生合理一致的漸層,「網格」插值也會產生合理一致的漸層。

  magick \( xc:blue xc:navy +append \) \
          \( xc:black xc:black +append \) -append \
          -size 100x100 xc: +swap    -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh4.jpg
[IM Output]
如您所見,結果是非常合理的漸層,但如果仔細觀察,您會看到兩個獨立三角形的對角線連接處。這種變化不像雙線性那樣平滑(雙線性本身也不完全平滑),但這些變化也不會嘗試在調整大小或扭曲的圖像中保留銳利的邊緣。

Catrom(Catmull-Rom)

-interpolate」設置為「Catrom」(通常不精確地稱為「雙三次」插值)在確定點查找的顏色方面更為複雜。基本上,它不僅查看像素間區域角落的顏色,還進一步查看那些最近鄰像素以外的顏色。採樣點周圍 4x4 區域中總共 16 個像素。基本上,它適合整個相關區域的曲線,以便確定要使用的最佳整體顏色。這是一個圖表,可以更好地解釋這個過程...
[diagram]
這是我們標準四種顏色的插值顏色。

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap   -interpolate Catrom \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_catrom.jpg
[IM Output]
上面的圖像可能看起來與「雙線性」插值非常相似,但結果是具有更平滑的混合曲線,而不是用於產生插值顏色的直線。 然而,此圖像沒有顯示的是圍繞我們四個近鄰的其他像素的影響。 為此,我們需要查看一個稍微大一點的區域。 對於這個特定的(非常小的)示例,周圍的像素由 虛擬像素 設置控制。

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Catrom -virtual-pixel edge \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_catrom_edge.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Catrom -virtual-pixel White \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_catrom_white.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Catrom -virtual-pixel Black \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_catrom_black.jpg
[IM Output] [IM Output] [IM Output]
在真實圖像中,虛擬像素 的影響通常只會影響圖像最邊緣附近的結果。 由於此圖像只有 2 個像素寬,因此上面的示例會受到強烈影響。 在更大、更典型的圖像中情況並非如此。
正如您所見,曲線受周圍顏色的強烈影響,導致非常緊密的急劇顏色變化,或由周圍顏色定義的更混合的顏色變化。 但是,您也可以看到周圍像素顏色的強烈變化會產生該顏色的反轉或負色的較小區域。 這是一種 振鈴偽影,通常只出現在真實圖像中互補色的極其銳利的邊緣上。
這種對非常強烈的顏色邊緣的振鈴效應可能會被剪裁,從而導致出現一條可怕的像素線。 可以通過在「RGB」以外的其他色彩空間(例如「Lab」或「Luv」色彩空間)中進行調整大小和插值來防止此問題。

有關此問題的更多信息和示例,請參閱 在 LAB 色彩空間中調整大小

請注意,「雙三次」(插值 三次濾波器)是指一個非常大的濾波器系列,因此其含義非常不精確。 但是它仍然可用,但它的使用已被棄用,有利於更準確的名稱。

在 IM v6.7.7-7 之後,「雙三次」只是「Catrom」的別名,後者通常被認為是一個好的「三次插值器」(b=0,c=1/2)。 您應該使用名稱「Catrom」而不是「雙三次」,以便清楚您使用什麼進行插值。

在 IM v6.7.7-7 之前,「雙三次」實際上使用了一個極端的「Cardinal 三次」濾波器 (b=0, c=1),它具有過強的負振鈴效應。 它已被「Catrom」完全取代,並且不再可用作插值函數。

在 IM v6.3.5-3 之前,「雙三次」被實現為一個非常模糊的「Spline」三次插值器。 該濾波器已在此版本的 ImageMagick 中重命名。 (見下文)

Spline

與上面的「Catrom」一樣,「Spline」插值方法也使用最近的 16 個像素。 然而,這是一種非常模糊的、類似高斯的插值。

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap   -interpolate spline \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_spline.jpg
[IM Output]
正如您所見,上述「Spline」插值最角落的顏色是柔和的,因為插值表面實際上沒有穿過這些像素的原始顏色。 從本質上講,它過於“模糊”,更準確的說法是“B 樣條”曲面。 該曲面仍然是一種 三次濾波器 (b=1, c=0),因為它是使用分段三次曲線的技術生成的。 然而,這條曲線僅接近原始像素顏色,尤其是在顏色變化強烈的區域。 也就是說,對精確整數像素位置的插值查找不會返回該實際像素的顏色,而是返回與周圍像素的顏色模糊。 這通常被認為是不好的,但可以用作一般的平滑函數。 與「Catrom」一樣,它也受周圍像素的影響。

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Spline -virtual-pixel edge \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_spline_edge.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Spline -virtual-pixel White \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_spline_white.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Spline -virtual-pixel Black \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_spline_black.jpg
[IM Output] [IM Output] [IM Output]
在真實圖像中,虛擬像素 的影響僅限於圖像的邊緣。 真實像素圍繞著進行查找的像素間區域。
在這裡,您可以看到由於「spline」曲線與像素顏色擬合不良而導致的顏色減弱效果。結果通常是彩色區域的邊緣更加模糊,並且線條變細。但是,它們也永遠不會出現您在使用「Catrom」插值時可能會遇到的任何負面「振鈴」效應。

插值背景

由於插值的影響通常在較大區域上,因此這裡放大了四種主要插值方法,周圍像素為白色或黑色。

  for method in   bilinear mesh catrom spline  ; do
    for vpixel in   white black  ; do
      magick \( xc:red xc:blue +append \) \
              \( xc:yellow xc:cyan +append \) -append \
         -size 100x100 xc: +swap -interpolate $method -virtual-pixel $vpixel \
         -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' ip_area_${method}_$vpixel.jpg
    done
  done
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
雙線性 網格 Catrom Spline
如您所見,周圍的背景顏色對「雙線性」插值顏色沒有真正的影響。它看起來就像疊加在任何存在的背景顏色上。但是,您可以看到「網格」如何生成更強更清晰的邊緣,但當它涉及圖像邊緣時,可以決定根據周圍顏色翻轉對角線。請查看白色和黑色背景之間紅色和藍色之間的連接處,以查看這種「翻轉」。「Catrom」和「Spline」的插值曲線受周圍像素的影響。特別是在涉及絕對顏色的測試案例中。最後,「Spline」插值實際上只是圖像的高斯模糊(使用 sigma 為 0.65)。足夠的模糊以消除任何「振鈴」或鋸齒效應,儘管通常它對於大多數用途來說太模糊了。請參閱高斯濾波器

旋轉線的插值

在這裡,我通過創建垂直線的圖像並使用仿射變換將線旋轉 17 度,然後放大視圖以便您可以看到生成的抗鋸齒像素來演示各種插值方法。

  magick -size 10x20 xc: -draw 'line 4,0 4,20' \
          -scale 50x100 ip_line_none.gif
  for method in integer nearest bilinear mesh catrom spline;  do
    magick -size 10x20 xc: -draw 'line 5,0 5,20' \
            -interpolate $method -filter point -distort SRT 17 \
            -scale 50x100 ip_line_${method}.gif
  done
[IM Output]
未旋轉
==> [IM Output]
整數
[IM Output]
最近
[IM Output]
雙線性
[IM Output]
網格
[IM Output]
Catrom
[IM Output]
Spline
如您所見,直接顏色查找方法「Interger」和「NearestNeighbor」產生了高度鋸齒的結果,但僅使用圖像中找到的原始顏色。兩者之間的主要區別在於「Interger」傾向於將生成的圖像向下和向左推半個像素。「Bilinear」、「Mesh」和「Catrom」通常會產生非常好的和相似的結果(稍後會詳細介紹),後者會產生非常清晰的旋轉線。其中任何一個通常都被認為是一個好的解決方案。「Spline」插值方法會產生明顯的細線模糊,從而消除鋸齒效應。但是,「Spline」往往會過度模糊結果,並且實際上更適合於平滑漸變,而不是旋轉線。
在上面的示例中,特殊設置「-filter point」用於確保扭曲運算符在確定最終像素顏色時僅使用單個「點」插值。如果沒有它,則將使用區域重採樣而不是插值查找,儘管這也會產生非常好的結果。
請注意,我沒有在這些示例中使用「-rotate」運算符,因為該運算符使用像素剪切方法來旋轉圖像。因此,不使用像素插值。

有關以這種方式使用「-rotate」運算符的示例以及由此產生的像素級別效果,請參閱旋轉細線

更新:從 IMv7.7.3-4 開始,旋轉運算符現在在內部使用扭曲運算符,因此上述情況可能不再成立。

旋轉邊緣的插值

與單條像素線相比,區域邊緣扭曲時的結果略有不同。

  magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
          -scale 50x100 ip_edge_none.gif
  for method in  integer nearest bilinear mesh catrom spline; do
    magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
            -interpolate $method -filter point  -distort SRT -17 \
            -scale 50x100 ip_edge_${method}.gif
  done
[IM Output]
未旋轉
==> [IM Output]
整數
[IM Output]
最近
[IM Output]
雙線性
[IM Output]
網格
[IM Output]
Catrom
[IM Output]
Spline
以上內容通常不言自明。「Bilinear」和「Mesh」會在一般旋轉時產生相當銳利的邊緣,而「Catrom」則會在失真影像中產生更銳利的邊緣。然而,「Spline」會產生較模糊的邊緣。在上述情況下,「Bilinear」和「Mesh」之間的差異極其微小。這兩種方法只有在失真操作期間極度放大的情況下才會產生可見的差異。否則,您只會看到像素強度略有變化,幾乎難以察覺。

虛擬像素遺漏的影像顏色查詢

許多運算子經常需要查詢超出影像本身邊界的顏色。這包括用於影像模糊化一般影像失真形態學和卷積運算子一般失真運算子,甚至是相當舊的內爆運算子的運算子。那麼,如果您要求查詢位於 -22,-3 的像素,應該返回什麼顏色?這樣的像素實際上並不存在,但返回的顏色值會對影像處理的整體效果產生深遠的影響,尤其是接近影像實際邊緣的像素的最終顏色。「-virtual-pixel」設定定義了 IM 在存取影像正常邊界以外的像素時應該返回的值。[IM 輸出] 例如,在這裡我們使用FX DIY 運算子-fx」來「查詢」並顯示小型影像內部和周圍的所有像素,以便我們查看預設-virtual-pixel」設定返回的值。

  magick -size 70x70 xc:  tree.gif \
                  -fx 'v.p[-19,-19]'  virtual_default.gif
[IM Output]
Edge」「-virtual-pixel」設定會返回最接近所請求「虛擬」位置的真實像素的顏色。也就是說,最接近的「邊緣」顏色。這次我將使用較快的帶有視窗的影像失真來顯示周圍的虛擬像素,而不是速度較慢的FX 運算子。失真方法「SRT 0」實際上不會扭曲影像結果,它只是查看影像運算子實際看到的像素,尤其是原始影像周圍的「虛擬」像素。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Edge -filter point   -distort SRT 0 \
          +repage  virtual_edge.gif
[IM Output]
Edge」虛擬像素設定是預設設定,因此以上結果應該與上一個範例相同。這個設定在處理影像時,對邊緣效應的影響通常最小。這也是為什麼它被選為預設設定的原因。當使用模糊化或其他使用「鄰域」或像素進行處理的形態學和卷積運算子時,這一點尤其重要。請注意,角落像素的顏色最終將如何完全填充實際影像周圍的對角線相鄰區域。這可能會導致單個角落像素對各種影像轉換產生很大的影響。這種「角落」效應在影像模糊化時尤其明顯。Tile」虛擬像素設定對於產生並確保影像處理邊緣效應環繞影像邊界非常有用。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Tile  -filter point  -distort SRT 0 \
          +repage virtual_tile.gif
[IM Output]
這讓您可以確保正在處理的影像保持「可平鋪」,或者在修改影像時變得更「可平鋪」。如需更多範例,請參閱修改平鋪影像Mirror」與「tile」非常相似,對於某些效果可能比預設的「edge」更好。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Mirror -filter point   -distort SRT 0 \
          +repage virtual_mirror.gif
[IM Output]
這在減少正在模糊化的影像的邊緣和角落效應方面特別有用。但是,它也會產生其他效果。
在 IM v6.5.0-1 之前的版本中,只有直接附加到原始圖像的圖像會被鏡像。其他距離原始圖像較遠的虛擬副本則不會被鏡像(正常的平鋪模式)。這個問題已經被修復,現在整個虛擬畫布空間都會被正確地鏡像平鋪,而不僅僅是相鄰的虛擬副本。

只有在使用鏡像平鋪與通用扭曲運算符來鏡像平鋪非常大的區域時,例如在觀看遙遠的地平線時,這一點才變得重要。
Transparent」只會傳回真實圖像邊界外像素的透明顏色。

  magick tree.gif -alpha set  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Transparent  -filter point  -distort SRT 0 \
          +repage virtual_trans.gif
[IM Output]
以上使用的Alpha「設定」運算符是必需的,以確保圖像具有遮罩或 Alpha 色板,以便透明顏色能夠正確填入。如果沒有這個設定,以上範例可能會傳回「黑色」,而不是透明色,因為顏色「none」或「完全透明的黑色」是預設的透明顏色。例如,這裡我錯誤地關閉了透明度...

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Transparent -filter point  -distort SRT 0 \
          +repage virtual_trans2.gif
[IM Output]
Transparent」設定對於圖像扭曲特別有用,因為扭曲後的圖像稍後會被「分層」以構建更大的圖像。例如,3D 仿射立方體3D 透視框 white」、「gray」和「black」設定與前面的「Transparent」設定類似。它們只是針對任何超出邊界的像素傳回該特定顏色。

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel White -filter point  -distort SRT 0 \
          +repage virtual_white.gif
[IM Output]

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Gray -filter point  -distort SRT 0 \
          +repage virtual_gray.gif
[IM Output]

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Black -filter point  -distort SRT 0 \
          +repage virtual_black.gif
[IM Output]
如果您需要任何其他簡單的顏色,則必須在「-background」設定中定義該顏色,並使用「Background」「-virtual-pixel」設定。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Background -background coral \
          -filter point -distort SRT 0     +repage virtual_bgnd.gif
[IM Output]

HorizontalTile」VP 設定已添加到 IM v6.4.2-6 中,作為一種特殊的平鋪形式,適用於完整的 360 度「弧形」和「極座標」扭曲。圖像僅水平平鋪,而平鋪上方和下方的虛擬像素則由目前的「-background」顏色設定。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel HorizontalTile  -background coral \
          -filter point -distort SRT 0     +repage virtual_horizontal.gif
[IM Output]
這可以確保正在轉換的圖像在水平方向上保持「可平鋪」。如需更多範例,請參閱修改平鋪圖像HorizontalTileEdge」(在 IM v6.5.0-1 中添加)也會在虛擬空間中水平平鋪圖像,但會將側邊像素複製到虛擬畫布空間的其他部分。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel HorizontalTileEdge  -background coral \
          -filter point -distort SRT 0     +repage virtual_horizontal_edge.gif
[IM Output]
添加這兩種 VP 方法是為了更好地處理完整的圓形「弧形」和「極座標」扭曲,其中環繞的圖像會「環繞」並首尾相接。
同樣地,「VerticalTile」VP 設定(也為了完整性而在 IM v6.4.2-6 中添加)僅垂直平鋪圖像,並使用目前的「-background」顏色填充圖像的側面。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel VerticalTile  -background coral \
          -filter point -distort SRT 0     +repage virtual_vertical.gif
[IM Output]
VerticalTileEdge」是在 IM v6.5.0-1 中添加的,它會將側邊像素複製到虛擬畫布空間的其餘部分。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel VerticalTileEdge  -background coral \
          -filter point -distort SRT 0     +repage virtual_vertical_edge.gif
[IM Output]
在 IM v6.5.0-1 中添加了「CheckerTile」,用於以填充棋盤格圖案的方式平鋪圖像。其他方塊則簡單地填充背景顏色(可能是透明的)。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel CheckerTile  -background coral \
          -filter point -distort SRT 0     +repage virtual_checker.gif
[IM Output]
通過將背景設為透明,並將該圖像疊加到另一個相同大小的完全平鋪圖像上,您可以將兩個平鋪層疊在一起,以產生兩個圖像交錯的棋盤格圖案。

  magick -size 96x96 tile:balloon.gif \
          \( tree.gif -alpha set  -set option:distort:viewport 96x96 \
             -virtual-pixel CheckerTile  -background none \
             -filter point -distort SRT 0 \) \
          -flatten  virtual_checker_2.gif
[IM Output]

還有一些更不尋常的「-virtual-pixel」設定。random」只是從圖像中隨機挑選一個像素來使用。

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Random -filter point   -distort SRT 0 \
          +repage virtual_random.gif
[IM Output]
這個設定通常會搭配 "-blur" 使用,用來產生粗糙斑駁的平均影像色彩,在其產生的邊緣效果中。請注意,像素值並不一致,並且每次查找都會產生不同的效果,甚至每次執行操作時也是如此,除非隨機數產生器被賦予初始的 "-seed"。當與 捲積形態學 影像處理一起使用時,這種情況尤其糟糕,因為沿著影像邊緣的每次查找都會貢獻不同的值,即使使用了相同的像素查找也是如此。然而,我發現當產生 透視地平線 時,隨機模式非常好,因為當您靠近地平線時,該模式會顯示更模糊的結果。模糊處理使產生的隨機紋理具有一定的深度,如果使用簡單的純色則無法看到。
然而,'dither' 會根據所請求位置的 32x32 像素內的像素,返回一個有序的抖動色彩模式。
這意味著,一旦您從影像開始超過 32 個像素,結果將再次只是影像的角落像素顏色。它有點像 'edge' 和 'random' 的合併。

  magick tree.gif  -set option:distort:viewport 120x120-44-44 \
          -virtual-pixel Dither -filter point  -distort SRT 0 \
          +repage virtual_dither.gif
[IM Output]
在上面,您可以看到,這個 32x32 像素影像的一個角落裡的太陽的黃色設法一直選到右下角,但僅此而已。也就是說,有序抖動顏色選擇的 32 像素“鄰域”的限制。如果此影像更大,則黃色太陽顏色將無法到達其他角落。此模式不是“隨機的”,並且對於同一影像將始終產生相同的結果。您可以將其視為更接近影像的 'random' VP 的一種更有序的形式,但是一旦您處理距離實際影像超過 32 個像素,其效果就會變得更像 'edge'。

虛擬像素和無窮大

一般失真運算符 的結果中,尤其是在 透視 失真中,您可以更清楚地看到 "-virtual-pixel" 的效果,從而可以創建朝向無限遠的失真視圖。例如,我在這裡展示了樹的透視圖上 "-virtual-pixel dither" 設定的結果。這顯示了此設定如何影響一直返回到無窮遠的像素。

  magick tree.gif -mattecolor DodgerBlue   -virtual-pixel dither \
          -set option:distort:viewport  150x100-50-50 \
          -distort perspective '0,0 9,0  31,0 38,0  0,31 0,18  31,31, 40,18' \
          perspective_dither.gif
[IM Output]
嘗試使用其他 "-virtual-pixel" 設定以更好地了解它們的工作原理。其他一些範例也可以在 觀看遙遠的地平線 中看到。請注意,上述視圖中的“天空”實際上是從 "-mattecolor" 設定產生的,失真使用該設定來呈現“無效”區域,在本例中為透視失真的“天空”。它不是來自 "-virtual-pixel" 設定。

虛擬像素顏色

除非通過下列其中一種純色方法明確請求該顏色:「background」、「transparent」、「background」、「black」、「white」、「gray」;否則,任何「-virtual-pixel」方法實際上都不會返回與圖像中已存在的顏色不同或複合的顏色。也就是說,永遠不會產生新的顏色,儘管可以添加一種特定的顏色(一般扭曲運算符 為兩種)。當然,如果請求的像素正在被 像素插值區域重新取樣,例如在上面的透視失真視圖中,那麼這些方法可能會根據所選的「-virtual-pixel」設置合併返回的顏色。

虛擬像素對運算符的影響

在這裡,我將探討「-virtual-pixel」設置對各種運算符的影響。「-blur」...

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel edge   -blur 0x8     vp_blur.png
[IM Output]

    magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
            -virtual-pixel mirror  -blur 0x8  vp_blur_2.png
[IM Output]
請注意以下內容:如何使用「-blur」和「-virtual-pixel」設置為「tile」來交叉污染圖像。當然,如果圖像一開始就可以平鋪,那麼這可能是期望的結果。

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel tile  -blur 0x8  vp_blur_3.png
[IM Output]
為圖像中的「-virtual-pixel」設置特定顏色會產生一些非常有趣的影響和可能性。

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel background  -background blue \
          -blur 0x8     vp_blur_4.png
[IM Output]

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel transparent  -channel RGBA  -blur 0x8 \
          -background red  -flatten       vp_blur_5.png
[IM Output]
請注意,在我放置在圖像後面的「red」背景如何在邊緣周圍可見,其中生成的模糊圖像利用了圍繞圖像實際像素的虛擬像素。「-gaussian」具有與「-blur」相同的基本結果,這是可以理解的,因為它們在數學上是相同的。

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel background   -background blue \
          -gaussian 0x8     vp_gaussian.png
[IM Output]
但是,「-radial-blur」(實際上是旋轉模糊)會產生更有趣的邊框效果...

  magick -size 70x70 xc:lightblue \
     -virtual-pixel background  -background blue \
     -radial-blur 0x30    vp_radial.png
[IM Output]
最後一個使用默認的「透明邊緣」可能會在與較大的徑向模糊角度一起使用時生成平滑的邊緣。與其他技術相比,它可能會產生更清晰的「暈影」或柔和的邊緣疊加圖像。有關使用此效果的示例,請參閱 柔和和模糊邊緣。請注意,「-motion-blur」可能會受到邊緣效應的嚴重影響。
-motion-blur」目前不理解使用「-channel」將其效果限制在特定通道,這使情況變得更糟。

  magick -size 70x70 xc:none  -virtual-pixel edge \
     -fill yellow  -stroke red  -strokewidth 3 -draw 'circle 45,55 35,45' \
     -channel RGBA -motion-blur 0x12+65  vp_motion.png
[IM Output]

  magick -size 70x70 xc:none  -virtual-pixel transparent  \
     -fill yellow  -stroke red  -strokewidth 3  -draw 'circle 45,55 35,45' \
     -channel RGBA -motion-blur 0x12+65  vp_motion_2.png
[IM Output]

  magick -size 70x70 xc:none  -virtual-pixel background -background blue \
     -fill yellow  -stroke red  -strokewidth 3  -draw 'circle 45,55 35,45' \
     -channel RGBA -motion-blur 0x12+65  vp_motion_3.png
[IM Output]

虛擬像素的內爆效果

以下是一些更有趣的示例,這些示例使用了各種「-virtual-pixel」設置來實現各種大值(>1.0)內爆。

  for v in edge tile mirror dither random gray; do
    for i in 2 5 10 50 500; do \
      magick koala.gif -virtual-pixel $v \
              -implode $i  implode_${v}_${i}.gif
    done
  done
內爆 邊緣 平鋪 鏡像 抖動 隨機 灰色
2 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
5 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
10 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
50 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
500 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
上述結果呈現「點狀」是「-implode」運算子使用的直接「插值取樣」的直接結果。請參閱直接插值查找。這可能會在 IM 的未來版本中使用區域重新取樣來改變。目前,您需要使用超級取樣技術來改善結果。「edge」設定是更常用且預設的設定,用於避免大多數奇怪的效果。其他的(除了「background」之外)基本上會從圖像中的現有像素產生複製的圖案,而且效果變化很大。另請注意,參數如何需要指數級的增加才能產生類似的效果增強。此外,對於大於約 200 的參數,結果圖像的中心可能會出現一個黑色圓圈。這是由電腦的數學限制造成的。我們不建議您使用這麼大的值。

純色隨機點

通過模糊「plasma:fractal」畫布,然後將顏色減少到非常低的值,您可以生成包含不同顏色隨機區域的簡單圖像。但是,結果會因請求的最終顏色數量和虛擬像素設定(見上文)而有很大差異。在這個實驗中,我對初始隨機圖像有兩種選擇。一個分形電漿圖像和一個隨機雜訊圖像隨機圖像就其性質而言,會產生一個可以使用(使用「-virtual-pixel」平鋪設定)建立更好的平鋪圖像的圖像。而電漿圖像傾向於在其顏色點的邊緣建立矩形邊緣。另一方面,電漿圖像會產生相當漂亮的柔和色點或斑點。而隨機圖像往往會產生可怕的中間色調灰色。因此,我選擇使用電漿圖像進行這些實驗。


magick -size 80x80 plasma:fractal -normalize spot_start.gif #magick -size 80x80 xc: +noise Random \ # -virtual-pixel tile -blur 0x5 -normalize spot_start.gif
for n in 2 3 4 5; do for v in edge mirror tile white black; do magick spot_start.gif -virtual-pixel $v -blur 0x10 \ +dither -colors $n spot${n}_${v}.gif done done
顏色數量 邊緣 鏡像 平鋪 白色 黑色
2 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
3 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
4 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
5 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
前三張圖像對顏色「點」與圖像邊緣的交互作用有非常具體的效果。「Edge」和「Mirror」傾向於使顏色以 90 度角連接到邊緣。「Random」或「Dither」設定對圖像邊緣的顏色斑點具有相似但更強的附著力,儘管兩者也會在靠近圖像邊緣的地方引入一些銳利的邊緣效果。可能需要第二個模糊量化循環來清理和平滑斑點的邊緣。「Tile」設定傾向於允許斑點環繞圖像。但是,由於來源電漿圖像本身不是平鋪的,因此結果是在矩形邊緣附近產生一般的顏色變化。如果使用可平鋪的隨機圖像作為來源,則顏色點將完全忽略圖像的邊界。通過使用「White」或「Black」背景虛擬像素設定,顏色點往往會集中在圖像本身的中心。這種「居中」的效果如何取決於原始隨機圖像相對於所使用的「背景顏色」的差異程度。「-blur」的大小基本上會影響斑點的大小和平滑度。小的模糊會產生許多小的斑點,而大的模糊(例如我們在上面使用的)會產生一個更圓形的顏色斑點。
您還可以通過使用不同的顏色量化色彩空間來產生一組完全不同的顏色和交互作用。例如,我在這裡重複上面的最後一個示例(減少到 5 種顏色),但使用一些更不尋常的「-quantize」色彩空間進行顏色選擇。(請參閱顏色量化和色彩空間
色彩空間 邊緣 鏡像 平鋪 白色 黑色
RGB [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
YIQ [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
HSL [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
XYZ [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
OHTA [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
請記住以上所有圖像都是從同一個隨機來源圖像生成的。您看到的不同效果是使用不同方法減少圖像顏色數量的結果。您可以看到「-virtual-pixel」設置如何定義像素顏色模糊如何影響圖像邊界外的區域,從而對顏色區域的形狀產生很大的影響。

註釋參數的使用

IM 版本 6 為文字繪製提供了一個新的命令列選項「-annotate」,它繞過了舊的「-draw」方法,直接使用 Annotate() API。這為命令列使用者提供了一些新功能。在這個例子中,我選擇了 Arial Black 字體,因為它的字母是直的,所以旋轉應該很清楚。

    magick -font ArialB -pointsize 24 -gravity center \
            -size 55x55 xc:white -annotate 0x0+0+0 'Text' \
            annotate_source.jpg
[IM Output]
此選項的格式為...
  -annotate {SlewX}x{SlewY}+{X}+{Y} 'Text String' 
上面 _X_ 和 _Y_ 的偏移量是受重力影響的註釋文字位置,將在此處繪製。但是,_SlewX_ 和 _SlewY_ 代表一種旋轉形式。如果這兩個值相同,則執行正常旋轉。但如果它們不同,可能會產生一些非常有趣的效果。
[IM Output]
如您所見,某些參數導致沒有繪製任何文字,基本上是在文字將全部繪製在一行中的情況下。這是意料之中的。但是,您可以看到我們可以通過各種方式繪製文字,例如翻轉、鏡像、旋轉、斜體等。這是一個非常有用的圖像運算符。

拼接:建立新的圖像運算符

就在 ImageMagick 6.0 版首次發佈之後,針對一個問題展開了討論。該問題涉及在圖像中間添加額外的空間(行和列)。以下範例是使用 IM 6.0 版強大功能並詳細說明應執行操作的複雜命令集,這些命令是根據此討論得出的。根據此範例,建立了「-splice」運算符(如需詳細資訊,請參閱將行和列拼接和切割到圖像中中的範例)。因此,此命令列是此新命令的定義操作,兩者應以完全相同的方式工作。

  magick rose: -size 20x10 xc:blue   -background blue \
          \( -clone 0  -crop 40x0 +repage +clone -insert 1 +append \) \
          -swap 0,-1 +delete +repage \
          \( -clone 0  -crop 0x30 +repage +clone -insert 1 -append \) \
          -delete 0 -delete 0 +repage  splice_rose_seq.gif
[IM Output]
在上面的範例中,我們將玫瑰花分割成許多垂直切片,然後在該序列中插入一個間距圖像,最後將它們全部追加在一起。基本上,我們在玫瑰花圖像中添加了一列像素。然後,用修改後的圖像替換原始圖像,我們重複相同的操作,但方向是水平的。稍微清理一下工作圖像,我們就完成了。此範例還向郵件清單突出了新的有序命令列處理以及 6.0 版 ImageMagick 的圖像序列操作的實用性。在舊版 IM 中,這需要大量單獨的命令和臨時圖像才能實現相同的結果。

邊框、框架和 BorderColor 的使用

有一種爭論是,「-bordercolor」應該僅用於為使用「-border」或「-frame」的圖像添加邊框。也就是說,許多使用者認為它_不_應該用於設置透明圖像背後的背景。例如,在 IM 下,這會將星形圖像的透明區域設置為「-bordercolor」,並完全忽略「-background」顏色設置。

  magick star.gif -bordercolor LimeGreen   -background Gold \
                   -border 10       star_border.gif
[IM Output]
使用「-bordercolor」設定透明圖像背景的主要原因是,當使用「magick montage」處理一組可能包含透明圖像的隨機圖像時,這種方法可以讓使用者只需最少的設定就能獲得良好的效果。

    magick montage star.gif  -frame 6  -geometry '64x64+5+5>' star_montage.gif
[IM Output]
如果保留透明度,那麼上述「magick montage」的結果看起來就不會那麼好了。
這並不表示在使用「-border」或「-frame」運算子時無法保留圖像的透明度。這只是表示您需要提供額外的「-compose」設定,以告訴 IM 保留透明度。

  magick star.gif  -bordercolor LimeGreen \
          -compose Copy  -border 10   star_border_copy.gif
  magick montage star.gif  -bordercolor LimeGreen \
          -compose Copy -background None    -frame 6 \
          -geometry '64x64+0+0>'   star_montage_copy.gif
[IM Output]
[IM Output]
有關在新增「-border」或「-frame」時保留圖像透明背景的更多資訊,請參閱新增邊框。有關「magick montage」的更多資訊,請參閱蒙太奇背景和透明度處理範例。有人建議的另一個替代方法是在這些運算子中將圖像區域背景設定為「-background」顏色,但這會干擾其在「magick montage」中的使用。當然,您始終可以在新增任何額外的框架或邊框之前移除圖像的透明度。在這種情況下,使用「-compose Copy」就變得無關緊要了。

  magick montage star.gif -background Gold -alpha remove \
          -frame 6  -geometry '64x64+5+5>' -size 16x16 \
          -bordercolor LimeGreen  -background SeaGreen \
          star_montage_texture.gif
[IM Output]
使用「-compose」設定來保留透明度要比讓邊框保留透明度並導致其他問題容易得多。這對新使用者來說可能並不明顯,但這正是這些範例頁面的意義所在。

清單運算子測試

以下所有命令都應該產生完全相同的圖像,但所有圖像的產生方式略有不同,展示了新的 IM 版本 6 圖像清單運算子

  magick eye.gif news.gif  storm.gif  +append  list_test_01.gif
[IM Output]

  magick \( \) eye.gif news.gif  storm.gif  +append  list_test_02.gif
[IM Output]

  magick eye.gif news.gif  storm.gif \( \) +append  list_test_03.gif
[IM Output]

  magick \( eye.gif news.gif  storm.gif \) +append  list_test_04.gif
[IM Output]

  magick \( eye.gif news.gif  storm.gif  +append \) list_test_05.gif
[IM Output]

  magick eye.gif \( news.gif storm.gif +append \) +append list_test_06.gif
[IM Output]

  magick \( eye.gif news.gif +append \) storm.gif +append  list_test_07.gif
[IM Output]

  magick \( storm.gif -flop \) \( news.gif -flop \) \( eye.gif -flop \) \
          +append -flop  list_test_08.gif
[IM Output]

  magick \( eye.gif -rotate 90 \) \( news.gif  -rotate 90 \) \
          \( storm.gif -rotate 90 \) -append  -rotate -90   list_test_09.gif
[IM Output]

  magick eye.gif tree.gif news.gif storm.gif   -delete 1 \
          +append list_test_10.gif
[IM Output]

  magick eye.gif tree.gif news.gif storm.gif  -delete -3 \
          +append list_test_11.gif
[IM Output]

  magick eye.gif news.gif storm.gif tree.gif   +delete \
          +append list_test_12.gif
[IM Output]

  magick news.gif storm.gif eye.gif  +insert  +append list_test_13.gif
[IM Output]

  magick eye.gif storm.gif news.gif  -insert 1  +append list_test_14.gif
[IM Output]

  magick news.gif eye.gif storm.gif   -swap 0,1  +append list_test_15.gif
[IM Output]

  magick storm.gif news.gif eye.gif   -swap 0  +append list_test_16.gif
[IM Output]

  magick eye.gif storm.gif news.gif   +swap  +append list_test_17.gif
[IM Output]

  magick eye.gif storm.gif news.gif   \( -clone 1 \) \
          -delete 1   +append list_test_18.gif
[IM Output]

  magick eye.gif -negate \( +clone -negate \) news.gif  storm.gif \
          -delete 0   +append list_test_19.gif
[IM Output]

  magick storm.gif news.gif eye.gif \( -clone 2,1,0 \) \
          -delete 2,1,0   +append  list_test_20.gif
[IM Output]

  magick storm.gif news.gif eye.gif \( -clone 2-0 \) \
          -delete 0-2   +append  list_test_21.gif
[IM Output]

  magick {balloon,medical,present,shading}.gif  -delete 0--1 \
          {eye,news,storm}.gif   +append  list_test_22.gif
[IM Output]

  magick balloon.gif -delete 0,0,0,0,0,0,0,0,0 \
          eye.gif news.gif  storm.gif  +append  list_test_23.gif
[IM Output]

  magick eye.gif balloon.gif news.gif storm.gif \
          -delete 1,1,1,1,1   +append  list_test_24.gif
[IM Output]

  magick {balloon,medical,present,shading}.gif {eye,news,storm}.gif \
          -delete 0--4   +append   list_test_25.gif
[IM Output]

  magick eye.gif news.gif storm.gif \
          -delete 0--4   +append   list_test_26.gif
[IM Output]

  magick storm.gif news.gif eye.gif -reverse +append  list_test_27.gif
[IM Output]