ImageMagick 範例 --
合成影像

索引
ImageMagick 範例前言和索引
IM 中的影像合成
定位重疊影像
合成方法原始表格(獨立頁面)
Duff-Porter Alpha 合成方法
數學合成方法
照明合成方法(Light、Dodge、Burn)
通道複製方法
將一張影像溶解到另一張影像上
將兩張影像混合在一起
浮水印或調整影像
使用遮罩限制合成區域
使用影像拼貼進行合成
特殊合成方法
Mathematics、  Change Mask
影像映射合成方法
變數 Blur、   Displace 映射
影像合成是將具有或不具有透明度或 Alpha 色板的影像組合起來的技術。這通常使用 IM "magick composite" 命令來執行。它也可以作為一系列較大操作的一部分執行,或由其他影像運算子內部執行。

IM 中的影像合成

影像合成是以各種方式合併兩個(且僅限兩個)影像的過程。它與**Alpha 合成**相關聯,Alpha 合成根據覆蓋層的哪個部分是透明的來描述結果。影像合成用於混合和平均影像、傳輸影像通道、剪切、連接或分層奇形怪狀的影像片段。或者,作為複雜數學運算的一部分。關於影像合成的另一個很好的介紹是SVG Compositing in 30 Minutes。或者,您可以通過閱讀SVG Alpha Compositing 頁面來發現精確的數學細節,該頁面描述了更重要的影像合成方法。以下命令是 ImageMagick 中可用的兩個直接影像「合成」方法...

  magick composite {overlay} {background} [{mask}] [-compose {method}]   {result}

  magick {background} {overlay} [{mask}] [-compose {method}] -composite   {result}
"magick composite" 命令是 IM 中的傳統合成方法。擁有一個專用命令證明了影像合成是多麼重要。"magick" 運算子 "-composite" 也可以將影像合成作為較大影像處理任務的一部分。 </> 請注意使用 "magick" 時影像的順序相反。該順序很實用,因為您通常是在一個主畫布上工作,在該畫布上準備和合併影像以形成新影像。影像的順序很重要。兩種技術(以及更多技術)的實際示例可以在多個影像的圖層中查看,建議在繼續之前閱讀。

定義和術語

更重要的影像是*背景*影像,也常稱為*目標*影像,是通過影像合成進行修改的影像。 *背景* 不僅設定了影像合成的最終大小,而且*元數據*(例如「註釋」、「標籤」、「密度」、「配置文件」等)也會被保留。它的位置是固定的,通常形成您正在構建的畫布,因此得名*背景*。記住這一點!

*覆蓋*影像或*來源*影像控制 "-compose" 方法應如何修改固定的*背景*或*目標*影像。影像可以相對於固定的*背景*影像重新定位(通常使用 "-geometry" 和 "-gravity" 設定)。但是,當合成操作完成時,*覆蓋*影像及其包含的任何元數據都將被刪除。

有時會向命令中添加第三個*遮罩*影像。此影像用於定義和控制*背景*影像的哪些部分將被修改,以及最終合成結果的修改程度。有關更多詳細信息,請參見下面的合成遮罩。從 IM v6.5.3-4 開始,特殊的定義設定 "compose:outside-overlay"(請參見外部覆蓋設定)可以設定為值 'false' 以禁用對*覆蓋*影像覆蓋的矩形區域之外的*背景*影像的任何修改。如果沒有這個,一些合成*方法*會清除*覆蓋*未覆蓋的區域,作為*合成*定義的一部分。
實際的合成「方法」是由「-compose」設定控制,預設值為「Over」。也就是說,來源圖像會繪製在「背景」圖像「上方」,這也是大多數人在執行圖像合成時所想像的方式。IM 範例的這一節主要詳細說明各種合成「方法」的作用,以及如何使用它們。如需查看合成方法的結果,請參閱合成方法表。這些表格僅說明各種測試圖像的原始輸出,而非說明這些方法的預期用途。合成方法不區分大小寫,「_」或「-」字元為選用。因此,合成方法「Dst_Over」也可以指定為:「dst_over」、「dst-over」、「DstOver」、「dstover」,甚至是「dstOVER」。它們的意思都一樣。此外,合成方法:「Over」、「ATop」、「In」和「Out」分別是較冗長合成方法名稱的縮寫:「Src_Over」、「Src_ATop」、「Src_In」和「Src_Out」。除了「-compose」方法的長長清單之外,還有一些方法需要額外的數值參數才能正常運作。在「magick composite」命令中,這些參數是使用特殊選項傳遞的:「-dissolve」、「-blend」、「-watermark」(「modulate」)、「-displace」和「-distort」。從 IM v6.5.3-4 開始,「magick」命令可以使用定義設定compose:args」將特殊參數傳遞給「-composite」運算子。如需範例,請參閱下方特殊的溶解混合方法。

影像合成運算子

除了上面顯示的直接雙影像合成樣式之外,還有許多其他影像操作也會將 Alpha 合成作為其內部影像處理的一部分。這些操作會受到目前「-compose」設定的影響,不過它們會使用自己的內部定位,或分層影像虛擬畫布偏移定位技術。以下是已知會受到合成設定影響的所有運算子的清單...
影像對的合成
使用主要影像合成運算子的實際範例,包括原始「magick composite」命令,以及「magick」的「-composite」運算子。這種低階方法使用幾何/重力設定來決定重疊影像的位置。
分層運算子
影像「layerimage」運算子「flatten」、「mosaic」和「-layers merge」會將目前影像序列中的所有多個影像重疊到單一新畫布上,新畫布的大小和位置由所選取的分層運算子決定。這會使用虛擬畫布/頁面偏移設定來決定重疊影像的位置。
邊緣擴展運算子
將每個個別影像重疊在內部準備的畫布上的運算子。這包括「-border」、「-frame」和「-extent」等運算子。(請參閱新增/移除影像邊緣)。不使用定位資訊,不過「-extent」會利用重力和幾何偏移,重疊在純色背景影像上。
繪製影像
-draw 'image...'」影像疊加方法會將單一外部「來源」影像疊加到目的影像列表上。這是「mogrify」唯一可用的影像合成技術。它從外部來源獲取「疊加」影像,使其能夠克服該命令的無列表運算子限制。調整大小和位置資訊也由使用者提供,並且這些資訊可能會受到重力影響。
多列表圖層合成
-layers composite」運算子可讓您將兩個獨立的多個影像列表組合在一起,一次一對影像,以形成新的合併多影像序列。它還會將影像序列與單一影像(可以是靜態的「疊加」影像,也可以是靜態的「目的」影像)合成。它也是唯一允許您同時使用通用「-gravity」影響的「-geometry」偏移量(全域)和虛擬畫布「-page」偏移量(從該全域位置)的合成運算子。此合成運算子對於合成整個影像動畫或其他影像序列特別重要,而不是需要指令碼一次處理一對影像。


定位疊加影像

合成幾何/重力設定

在一般的 Alpha 合成中,「-geometry」設定與「-gravity」一起使用,以相對於目的影像定位來源影像。在使用重力進行影像定位中詳細介紹了這些設定的使用。請注意,「-geometry」的大小組元很特別,因為它會調整影像大小(幾何)。在「composite」中,它會調整來源影像的大小,但對於「convert」,會調整影像序列中最後一個影像的大小。從技術上講,這是影像合成的一個獨立方面。請參閱幾何調整大小使用 Composite 對影像進行分層。在 Alpha 合成中,只涉及兩個影像,「來源」和「目的」(或「背景」),儘管也可以提供第三個遮罩影像來限制合成的受影響區域。

圖層畫布/頁面偏移

分層影像的合成使用非常不同的理念。所有影像(數量不限)都按給定的順序平等對待。它們都有一個「-page」或頁面偏移量,用於相對於虛擬畫布「原點」(預設偏移量)定位每個影像的左上角,但不受重力影響。為了處理多個影像,將使用目前的「-background」顏色產生新的背景影像,其大小取決於正在執行的操作。這被假設為「目的」影像(畫布)。所有影像都按順序一次合成到這個新畫布上。即使只給了兩個影像,仍然會建立一個新影像,並應用兩個獨立的合成。也就是說,它可能會很慢。所有影像都被視為「來源」影像,它們列出的順序決定了結果。然而,圖層偏移量不受重力影響。由於每個影像都可以有一個單獨的「畫布偏移量」,因此多影像合成最好使用影像分層運算子以及用於動畫的多影像序列合成來應用。這兩種樣式是截然不同的定位技術,使用適合您計畫使用的合成技術的樣式非常重要。

兩種定位技術

只有一種合成技巧,多圖像清單 圖層合成 運算子,允許您同時使用兩種定位方法。 首先,使用「-geometry」和「-gravity」對兩個清單進行全局定位,這將應用於每個清單中第一個圖像的虛擬畫布大小。 然後,使用「-page」從該全局位置偏移清單中的每個單獨圖像,以確定最終位置。 當然,如果覆蓋圖像不適合提供的圖像中的特定目標圖像,則它將被該圖像裁剪。 因此,通常最好只對目標圖像使用完全合併的圖像,以滿足適當的大小需求。 當然,可以在之後再次修剪結果圖像的大小。

Duff-Porter Alpha 合成方法

Duff-Porter 圖像合成方法是一組傳統的 12 種方法,這些方法定義明確。它們被稱為 Alpha 合成,因為圖像根據圖像透明度或「Alpha 通道」的某些方面合併。您可以在 SVG Alpha 合成 文件中找到這些方法的數學定義。這是一個經典的表格,顯示了這 12 種方法使用兩個三角形圖像的結果。
[IM Output]
另請參閱 Compose 方法原始表格,其中包含顯示更多具有不同圖像形狀和漸變的合成方法的圖表。默認的合成方法(當完全未定義時)是「Over」,這是大多數人在合成圖像時通常想要的。要理解和記住所述每種合成方法的作用,結果圖像將與您說...相同。
{Source} --{compose_method}--> {background}

也就是說,方法「ATop」的結果圖像是等效於「在背景圖像「ATop」上的覆蓋圖像」。意思是,背景圖像將保持其「形狀」,但源圖像的顏色將位於背景的「頂部」。但是請記住,使用「magick -composite」運算子時,圖像順序會顛倒。這 12 種方法不僅定義了兩個圖像中的哪一個在結果中「可見」,還定義了它如何影響未被*源*圖像覆蓋的圖像部分。也就是說,原始的「背景」是保持原樣還是完全清除。我特意將上表中的「目標」圖像放大,以便您可以看到圖像的其餘部分是否被清除。這些「清除」方法是:「Src」、「In」、「Dst_In」、「Out」、「Dst_ATop」和「Clear」。從 IM v6.5.3-4 開始,您可以使用 定義設置compose:outside-overlay=false」來防止 Duff-Porter 合成清除覆蓋區域外的*目標*圖像。有關詳細信息,請參閱「Copy」和「Clear」合成方法以及 外部覆蓋設置 中的示例。請注意,「Copy」是由 IM 提供的特殊「第 13 種」合成方法。基本上等效於「Over」合成,但在覆蓋區域中清除背景。然而,在實現方面,它是禁用了外部覆蓋(或背景清除)的「Src」合成。
ImageMagick v5 及更早版本沒有清除源圖像未覆蓋的任何區域。這是對 Duff-Porter 合成運算符的錯誤處理,並在 IM v6 開發期間得到糾正。
Duff-Porter Alpha 合成方法最重要的層面之一,就是它們永遠不會讓任何「完全透明的彩色像素」顯示出來。這一點很重要,因為圖像中完全透明的部分顏色未定義。實際上,它可以包含任何顏色值,而不會影響圖像的可見結果。如需「處理透明度通道」的詳細資訊,請參閱控制圖像透明度。這就是為什麼 Duff-Porter 合成通常是首選的遮罩方法,而不是另一種「CopyOpacity」方法,後者會完全取代圖像的 Alpha 通道,並可能使未定義的不可見顏色變得可見。

覆蓋(將圖像覆蓋在背景上)

這是預設的合成方法,是每個人在將一個圖像覆蓋在另一個圖像之上時都會想到的方法。覆蓋圖像以與「動畫單元格」或「透明膠片」相同的方式放置在背景圖像或圖像的「上方」。這一點非常普遍,我懷疑我是否真的需要多說。因此,讓我們舉一個將單個字母圖像覆蓋在背景圖像上的例子。

  magick -background none  -fill white \
          -font Ravie  -pointsize 36   label:A   label_A_white.png
  magick composite -gravity center label_A_white.png   rose:  compose_over.gif
[IM Output]
[IM Output]
可以使用如上所示的重心將覆蓋圖像置中,或者使用「-geometry」設定精確定位。如果它被放置在背景邊界之外,它將被適當地裁剪或忽略。在此範例中,使用「convert -composite」運算子覆蓋圖像,但位置在背景上方的一半處。請注意圖像順序的反轉。

  magick rose:  label_A_white.png \
          -geometry +5-15   -composite   convert_over.gif
[IM Output]

Dst_Over(將圖像置於背景「下方」)

與其他「Dst_」方法一樣,此方法的工作方式幾乎與該方法的「Src_」版本完全相同,但覆蓋圖像和背景圖像交換了位置。因此,「Dst_Over」等同於將來源覆蓋圖像放置在目標圖像的「下方」。其結果是,只有未被目標圖像或背景圖像遮擋的來源圖像或覆蓋圖像部分才會顯示出來,因為它們會從下方露出。這與交換參數圖像的「Over」不完全相同,因為大小、位置和其他圖像中繼資料仍然來自背景圖像或目標圖像。請記住,輸出圖像大小與「背景」圖像相同,並且來源圖像的位置是相對於背景的(使用「-geometry」和「-gravity」)。例如,在這裡,我們在原始的白色 A「下方」覆蓋一個黑色的「A」標籤。我們可以相對於白色 A 背景重新定位黑色 A。如您所見,這非常適合新增硬陰影,而無需擔心擴展圖像大小。

  magick -background none  -fill black \
          -font Ravie  -pointsize 36   label:A   label_A_black.png
  magick composite -compose Dst_Over  -geometry +5+5 \
          label_A_black.png  label_A_white.png   compose_under.png
[IM Output]
[IM Output]
需要注意的重要一點是,背景的大小會保留,而覆蓋圖像相對於背景的位置可以修改,並且會被背景裁剪。這就是使此運算子如此重要和有用的原因。「magick composite」的「-tile」設定也使這種形式的「覆蓋」作為在圖像下方平鋪圖像的方式非常有用。例如,將內建的棋盤格圖案平鋪在我們剛剛建立的陰影字母下方。

  magick composite  -compose Dst_Over -tile pattern:checkerboard \
             compose_under.png   compose_under_tiled.jpg
[IM Output]

Src(「裁剪」到背景圖像尺寸)

此運算子會使用覆疊影像完全取代背景影像。背景中的顏色和透明度將被完全捨棄,留下與原始目標相同大小的空白影像,然後在其上套用來源影像。但这有什麼用呢?嗯,有兩個用途。首先,您實際上是用來源影像替換背景影像,但保留與原始背景影像關聯的所有中繼資料。也就是說,影像會改變,但中繼資料不會改變。其次,即使影像內容發生變化,最終影像的大小也不會改變。也就是說,產生的影像與原始背景的大小相同。因此,您可以有效地使用此運算子裁剪來源影像或覆疊影像,或為其添加邊框,使其與給定的背景影像(以及背景中繼資料)大小相同。例如,假設您要製作電漿影像並將其裁剪為與內建玫瑰影像相同的大小。這將讓您無需知道玫瑰影像的確切大小即可完成此操作。

  magick composite -compose Src  -size 100x100  plasma:tomato-dodgerblue \
            rose:  compose_crop.gif
[IM Output]
當然,以上操作等同於對電漿影像執行「-crop」,而不是「resize」。原始影像的中繼資料也會被保留。也就是說,即使這現在是一個電漿影像,影像中繼資料仍然會顯示它是一個「玫瑰」影像,並且來自「rose:」影像來源。
如果覆疊影像較小,則背景影像的其餘部分將被替換為透明度以填充。但請注意,背景必須具有 Alpha 色板,否則它將使用黑色(在沒有任何 Alpha 色板的情況下「none」或「transparent」的顏色)填充額外空間。

  magick composite -compose Src -gravity South \
            hand_point.gif   rose:  -alpha set   compose_expand.gif
[IM Output]
[IM Output]

複製(複製或替換影像)

此運算子不是 12 種「Duff-Porter」合成方法之一,這就是為什麼它沒有出現在上表中的原因。儘管如此,它仍然非常重要。它的工作原理與「Src」合成方法完全相同,但它不會觸及覆疊區域之外的背景影像。也就是說,它將其複製能力限制在僅覆蓋區域,而沒有其他區域。這使您可以裁剪較大影像的一小部分,處理較小的影像以提高速度,然後將結果「複製」回較大的影像,而不會觸及該影像的其他區域。這反過來又允許您優化超大影像的影像處理。以下是我上面使用的相同示例,但使用「Copy」而不是「Src」,顯示 IM 不會浪費時間清除「Duff-Porter」演算法要求的其餘背景。

  magick composite -compose Copy -gravity South \
            hand_point.gif   rose:  -alpha set   compose_copy.gif
[IM Output]
此運算子也與「Over」非常相似,只是來源影像的透明度也會被複製,完全替換背景影像。如果沒有透明度,它的執行方式將與「Over」完全相同。在內部,它會修改特殊的合成控制設定「outside-overlay」(見下文)。

外部覆疊設定

從 IM v6.5.3-4 開始,通過 定義compose:outside-overlay」,可以控制合成方法是否也會影響覆蓋區域之外的區域。預設情況下它是「開啟」的,但您可以通過將其值設定為「false」來將其關閉。例如,以下操作等效於 複製合成方法,但使用的是更傳統的 Src 合成方法

  magick rose: hand_point.gif -alpha set -gravity South \
          -define compose:outside-overlay=false \
          -compose Src -composite    compose_copy_src.gif
[IM Output]
有關使用此標誌的示例,請參見 捲頁角落覆疊

外部覆疊與 SVG「clip-to-self」

compose:outside-overlay」定義在許多方面類似於使用 SVG 的「clip-to-self」屬性。兩者都將合成限制在覆蓋區域,而不會影響目標圖像的其餘部分。但是,SVG 的「clip-to-self」僅適用於繪製區域(如遮罩),而 IM 的「outside-overlay」設置適用於覆蓋背景圖像的源圖像的完整矩形區域。這在 SVG 合成手冊中不是很清楚,因為給出的示例沒有很好的解釋,這讓它們非常混亂。但如果您想嘗試理解它們,請參閱 SVG 合成「clip-to-self」屬性理解 SVG 1.2 合成,clip-to-self。請注意,寫入遮罩 也可用於實現這種類型的控制,但要根據給定的遮罩使用形狀區域。在這方面,它更像是 SVG 的「clip-to-self」屬性,其中源圖像也被用作寫入遮罩。

Dst(「無操作」合成)

此運算符不做任何事情。源圖像或覆蓋圖像將被完全忽略,並且目標圖像或背景圖像將保持不變。該方法的真正用途是在其他圖像運算符中「關閉」Alpha 合成操作。例如,我們使用 框架運算符 為我們的玫瑰圖像(帶有透明背景)添加框架,但隨後使用「-compose Dst」來防止圖像被添加到框架中。換句話說,我們只使用玫瑰來設置結果的內部框架的大小。框架,並且只有框架,是結果。

  magick rose:  -alpha set  -mattecolor Gold  -bordercolor none \
          -compose Dst   -frame 7x7+3+2   compose_frame_dst.gif
[IM Output]
特殊的 Alpha 設置 操作確保圖像中存在 Alpha 通道,否則您最終會得到一個黑色的中間部分,而不是透明的。「-bordercolor」定義了框架內部的顏色,該顏色通常位於源圖像下方。「Dst」方法在腳本中也很有用,可以在大型且複雜的命令中禁用 Alpha 合成,而無需創建兩個不同的 IM 命令。

Dst_In(或使用源圖像「遮罩」背景)

Dst_In」方法就像使用源圖像作為背景圖像的「Copy_Opacity」遮罩。它將像餅乾切割器一樣從背景圖像中移除覆蓋圖像的形狀,餅乾切割器從餅乾麵團中切出餅乾的形狀。例如,讓我們使用上面花式的「A」作為遮罩,從玫瑰圖像中切出它的形狀。

  magick composite -compose Dst_In  -gravity center \
            label_A_white.png  rose: -alpha Set  compose_mask.png
[IM Output]
與「Copy_Opacity」方法不同,您不能使用灰度圖像作為遮罩,因為在此操作中僅使用覆蓋圖像的 Alpha 通道。覆蓋層中的任何顏色都將被完全忽略。
所有「Dst_In 和「Src_In」方法實際上所做的只是將兩個圖像的 Alpha 通道相乘。相應圖像的顏色(根據方法)將被保留。

Dst_Out(或「擦除」操作)

使用「Dst_In」的「餅乾麵團」比喻,「Dst_Out」方法的結果是切出餅乾後留下的麵團。它可以用於使用覆蓋層的形狀在背景圖像中切割孔或咬合。覆蓋層中的任何顏色都將再次被完全忽略。

  magick composite -compose Dst_Out  -gravity center \
            label_A_white.png  rose: -alpha Set  compose_erase.png
[IM Output]
這兩種合成方法的數學公式經過精心設計,因此,如果您在同一組圖像上使用「Dst_In」和「Dst_Out」,您可以將它們重新組合在一起(使用「Plus」方法),就像拼圖遊戲一樣。例如,我們在這裡「添加」(使用「Plus」合成)我們上面生成的最後兩個圖像。此圖像與原始的「rose:」圖像完全相同(到像素)。

  magick composite -compose Plus  compose_mask.png  compose_erase.png \
            compose_rejoin.png
[IM Output]
在任何圖像處理程式中,擦除圖像的一部分都不是一件容易的事。例如,「-draw」操作只能為圖像添加顏色。一旦顏色應用到畫布上,就無法移除。想像一下,一位畫家正在玻璃門或窗戶上畫廣告。他或她可以添加顏料,但不能透過在上面塗抹來移除顏料。透過在透明畫布上繪製要擦除的形狀,您可以使用「Dst_Out」將其從工作圖像中移除。這有點像我們的畫家用特殊形狀的抹布小心地擦去濕顏料。該形狀可用於移除全部或部分顏色,使其完全或半透明。例如,假設您想在透明畫布上繪製一個新月符號。這種 Alpha 合成方法透過疊加兩個圓圈,可以輕鬆繪製這個複雜的形狀。

  magick -size 70x70 xc:none -fill white -draw 'circle 35,35 35,5' \
          \( -size 70x70 xc:none -fill black -draw 'circle 28,30 35,5' \) \
          -alpha Set -compose Dst_Out  -composite   moon_crescent.png
[IM Output]
必須在括號中建立和繪製第二個圖像。如果您不這樣做,您會發現「-draw」會同時繪製在疊加圖像和原始背景上,這顯然是錯誤的。

如果您沒有使用括號,您會在圖像擦除部分周圍發現一圈半透明的黑色像素。我知道,這在我建立這個範例時也發生在我身上,讓我非常懊惱。

ATop(「Over」,但裁剪到背景圖像)

類似於「Over」,但將結果限制為背景圖像的原始形狀。換句話說,目標上的 Alpha 通道保持不變,但圖像顏色會被來源圖像的任何非透明部分覆蓋。如果背景圖像完全不透明(沒有透明度),則此操作的行為將與正常的「Over」合成完全相同。只有當背景包含也會裁剪疊加層的透明度時,它才會有所不同。這一點的用處在於疊加僅限於目標物件(形狀)的光照和陰影效果。
例如,假設我們有一個紅色圓圈,並且想要添加一個高光,就好像它是一個 3D 球體一樣。我們可以建立圓圈和高光,然後使用「ATop」疊加高光,將其限制在圓圈內。

  magick -size 70x70 xc:none \
            -fill red -draw 'circle 35,35 10,30'  red_circle.png

  magick -size 70x70 xc:none -draw 'circle 35,35 35,20' \
          -negate  -channel A -blur 0x8    red_highlight.png

  magick composite -compose ATop -geometry -13-17 red_highlight.png \
            red_circle.png red_ball.png
[IM Output] [IM Output] [IM Output]
白色高光的建立是使用「-negate」完成的,以確保整個圖像實際上是白色的。這是為了避免「-blur」運算符中的一個錯誤,該錯誤現在已在 IM 6.2.4 版中修復。有關此舊錯誤的更多詳細資訊,請參閱使用透明度模糊錯誤
以類似的方式,我們可以為球體添加模糊的陰影,並將其裁剪到球體本身的邊界,使其看起來更像 3D。我將把如何實現以下命令的效果作為練習留給讀者。

  magick moon_crescent.png -fx 0 -channel A -blur 0x7 \
           red_ball.png  +swap -compose ATop -composite  red_ball2.png
[IM Output]
如果對預備圖像更加小心,則可以使上述圖像更加逼真。為了展示此合成方法的用法,這已經很不錯了。有關使用「ATop」合成方法的更多範例,請參閱產生 3D 標誌

清除(清除背景。忽略疊加圖像)

這是一種不尋常的合成方法,它基本上完全忽略疊加圖像,而只是清除背景圖像。這使其成為為複雜專案建立與背景圖像大小相同的透明或黑色畫布的理想方法。由於未使用疊加圖像,因此單個像素「null:」圖像是很好的疊加選項。

  magick composite -compose Clear null:  rose: -alpha Set compose_clear.png
[IM Output]
當然,Alpha 集合操作(雖然在這種情況下不需要)可確保目標具有在將圖像清除為透明時可以使用的 Alpha 色板。如果您專門關閉 Alpha 色板,則由於涉及數學運算,運算符會將圖像清除為黑色。

  magick composite -compose Clear null:  rose: -alpha Off compose_black.png
[IM Output]
特殊的定義設定compose:outside-overlay」可讓您將此清除限制在重疊區域,無論重疊圖像是否包含透明度。例如

  magick rose: hand_point.gif -alpha Set -gravity South \
          -define compose:outside-overlay=false \
          -compose Clear -composite   compose_clear_limited.gif
[IM Output]

Xor(清除共用區域)

這是一種非常奇怪且很少使用的合成方法。它會重疊兩個圖像,然後將重疊區域清除為透明。

  magick -size 60x60 \
          \( xc:none -fill blue   -draw 'circle 21,39 24,57' \) \
          \( xc:none -fill red    -draw 'circle 39,39 36,57' \) \
          -compose Xor   -composite   compose_xor_2.png
[IM Output]
當第三個圖像在上述結果上進行異或運算時,事情會變得更加有趣。

  magick -size 60x60  compose_xor_2.png  \
          \( xc:none -fill green  -draw 'circle 30,21 30,3'  \) \
          -compose Xor   -composite   compose_xor_3.png
[IM Output]
如您所見,重疊多個圖像會產生一些奇妙的效果,其中任何偶數個重疊圖像都將是透明的,而任何奇數個重疊圖像都將導致顯示最後一個重疊的圖像。
FUTURE:  Xor effects on semi-transparent images get extremely weird.
Explore this and create an example demonstrating this weirdness.

數學合成方法

這組合成方法可讓您對圖像執行數學運算。這似乎不是很有用,但對於圖像的低階操作,這些方法允許您執行您通常不會想到的事情。與之前的Duff-Porter圖像合成方法不同,它們通常是灰度方法。也就是說,它們通常應用於一個或兩個圖像都是灰度的圖像,並且通常不包含透明度。也就是說,並不是說不能使用透明度(請參閱下面的數學合成和 Alpha),但這不是一種非常常見的做法。數學合成的默認用法由 SVG 圖像文件格式規範定義。您可以在SVG 合成指南 (2009)Pegtop 混合模式SimpelFilter:Photoshop 混合模式中閱讀有關它們的更多信息。您在以下每個運算符旁邊看到的特殊漸變圖像根據其影響顏色值的方式將運算符可視化。結果是通過合成兩個漸變圖像產生的,如下所示...

  magick -size 64x64 gradient:             gradient_src.png
  magick -size 64x64 gradient: -rotate 90  gradient_dst.png
  magick composite gradient_src.png -compose Multiply gradient_dst.png \
            gradient_result.png
[IM Output]
來源
 + [IM Output]
目標
=> [IM Output]
結果
基本上,如果您垂直使用覆蓋(來源)像素的顏色值,並水平使用背景(目標)像素的顏色值,則可以查找通過對這些值應用該運算符將產生的值。在上面的示例中,您將看到「」通常會使圖像變暗,並且任一輸入圖像中的任何黑色值 (0) 都將產生黑色結果。這一點可能非常有用。 [IM Output]

乘  ( )   (使白色對圖表/文字透明)

是更有用但被低估的合成方法之一,並且是兩個圖像的簡單乘積。它的公式當然是:  來源*目標 這意味著如果其中一個圖像是純白色,則結果將是另一個圖像。另一方面,如果一個圖像是黑色的,則結果將是黑色的。在這些極端之間,一個圖像將使目標圖像變暗到給定的量。請注意,「」只會使圖像變暗,而永遠不會使其變亮。也就是說,它會使圖像向黑色「衰減」,這使得這種合成方法成為「加深」類型的合成。(請參閱下面的光照合成方法

  magick label:Rose label_white.gif
  magick composite -compose Multiply -gravity center \
            label_white.gif  rose: compose_multiply.gif
[IM Output]
[IM Output]
這種方法在許多情況下都非常有效,但當其中一張圖像在主要為白色的背景上具有黑色(或灰階)線條時,例如文字圖像,這種方法尤其有效。 如果兩張圖像都包含彩色區域,則您可能會得到異常結果。 換句話說,此技術非常適合將圖像和其他圖表直接疊加到具有白色或非常淺的背景的線條圖上。 例如,我想在我將包含在光線追蹤圖像中的文字頁面上添加一些圖表。 您可以在我的多面體研究的結果圖像中看到這個「文字頁面」。 給定兩個灰階圖像遮罩,乘法也是一種根據某個遮罩將圖像部分擦除為黑色的好方法。 它是線性執行的,因此遮罩可以是灰階圖像,而不是純粹的布林開/關圖像。 請參閱數學合成。 將圖像与其自身相乘實際上是一種產生圖像平方變暗的有用技術,因此明亮的顏色保持突出,而其他顏色則變得更暗。 實際上,這相當於值為「0.5」的伽瑪運算符,或值為「2.0」的評估冪運算。 例如,請參閱星形產生器,以產生更逼真的恆星強度分佈。 或者它可以在將結果疊加到地理地圖上之前用於衛星雲圖。 [IM 輸出]

螢幕(使黑色對圖表/文字透明)

這幾乎與「」完全相同,只是兩個輸入圖像在合成之前都被反轉,並且最終結果也被再次反轉以將圖像恢復到正常狀態。 用技術術語來說,這兩種方法互為「對偶」。 這使得它的公式為:  1-(1-來源)*(1-目標) 這意味著如果其中一張圖像為純黑色,則結果將是另一張圖像。 另一方面,如果一張圖像是白色的,則結果將是白色的。 在這些極端之間,一張圖像將按給定的量使目標圖像變亮。 請注意,「螢幕」合成只會使圖像更亮,而永遠不會更暗。 這是一種稱為「加亮」合成的合成樣式。 (請參閱下面的照明合成方法) 這種合成方法非常適合將白色文字疊加在黑色背景上,然後再疊加到其他圖像上...

  magick -background black -fill white label:Rose label_black.gif
  magick composite -compose Screen -gravity center \
            label_black.gif  rose: compose_screen.gif
[IM Output]
[IM Output]
請參閱數學遮罩,以獲取有關如何使用此方法將白色形狀疊加到圖像上的示例。 [IM 輸出]

凹凸貼圖(灰階乘法)

凹凸貼圖」方法本質上與「」相同,只是來源圖像在疊加之前會轉換為灰階。 換句話說,它會使來源圖像較暗的任何地方的圖像變暗。 您可以將其視為「按強度相乘」類型的運算符。 例如...

  magick composite -compose Bumpmap -gravity SouthEast -geometry +3+3 \
            hand_point.gif   cyclops.gif   -alpha Set   compose_bumpmap.gif
[IM Output]
請注意「hand_point.gif」圖像如何在應用之前進行灰階處理。 它的原始目的是為圖像添加紋理(如紙張或織物紋理)。 然而,由於它只能使圖像變暗,因此它不如可以使圖像變亮和變暗的「強光」方法有用(見下文)。 [IM 輸出]

除法、目標除法、來源除法 ( )   (去除陰影效果)

這兩張影像彼此分開。哪個影像是被除數取決於套用的是「Divide_Src」還是「Divide_Dst」。「Divide_Dst」的公式是   Src / Dest  ,「Divide_Src」的公式是   Dest / Src。由於影像合成的定義以及「magick composite」指令中影像的順序,原始方法「Divide」意味著…
{Source} Divide {background}

也就是說,原始方法名稱「Divide」是「Divide_Dst」的同義詞,表示「除以目標」。它也是用於定義顯示的漸層圖表的運算子。請注意,影像的順序非常重要,因為如果影像或運算子交換,您將獲得非常不同的結果。對於目標影像在來源影像之前的「magick」指令來說尤其如此。請記住,目標影像將定義最終的實際大小,以及兩個影像合成結果中的中繼資料。另請記住,來源影像是相對於目標影像定位的。這種合成方法在從照片中移除暈影中最為實用。在下一個範例中,我將使用它作為移除背景的方法。
由於使用的是標準化顏色值,通常範圍從 0.0(黑色)到 1.0(白色),因此除法實際上會通過「除以」的影像中出現的「黑色」量來增亮分子影像。現在將影像相除,因此「分子」影像(未由運算子指定的影像)會變亮,這聽起來可能很奇怪。然而,這是一個非常有用的操作。這意味著您可以有效地移除由鏡頭暈影、掃描不良或老化引起的色調造成的影像暗區。例如,我有一張手寫文字的影像,掃描得非常粗糙(使用沒有閃光燈的數位相機,然後縮小尺寸以移除數位雜訊)。紙張邊緣褪色,由於沒有使用閃光燈,因此背景非常暗,並且由於紙張不完全平坦而產生陰影效果。
[IM Output]
僅僅標準化影像來增強影像的對比度無助於移除邊緣顏色或其他陰影效果。

  magick text_scan.png -normalize text_scan_norm.png
[IM Output]
但是,通過模糊影像以移除線條,然後從原始影像中分割出來,我們可以有效地移除影像中的所有粗糙陰影效果。

  magick text_scan.png \( +clone -blur 0x20 \) \
          -compose Divide_Src -composite  text_scan_divide.png
[IM Output]
除法的結果是背景顏色變為白色,而文字的細線保持清晰,儘管稍微「變細」了一些。如您所見,它比僅僅標準化要清晰得多,儘管一些消除鋸齒也被移除了。可以對除數影像進行一些額外的調整,但它與預期非常接近。使用較小的模糊可以產生生成藝術輪廓影像的另一種方法,如為輪廓影像著色所示。此運算子可以與背景漸層產生器(例如稀疏顏色漸層)結合使用,以生成比僅僅模糊整個影像更好的背景「除數」影像。
除法運算子實際上類似於「Color_Dodge」合成方法,但除數影像是負片,並用作來源影像。這是 Photoshop 中通常使用的合成方法,但它可能需要您交換反轉影像。有關等效項,請參閱「Color_Dodge」。
在 IM v6.6.8-5 之前,僅提供原始的「Divide」方法(等效於較新的「Divide_Dst」)。
[IM Output]

加  ( )   (將顏色加在一起形成混合)

將覆蓋層的顏色添加到背景。本質上是使兩個圖像平等地混合在一起。它的公式自然是:  來源 + 目標 但請注意,如果添加的顏色超過了顏色限制,則顏色將被正常的顏色範圍限制所截斷。這就是為什麼生成的漸變圖像中有一半是純白色的,因為這些值在其最大值處被截斷了。建議謹慎行事,以確保生成的圖像不會在不需要的情況下被截斷。該運算符有許多主要用途。合併包含獨立通道顏色的圖像,但只有單個通道有顏色。例如...

  magick -size 60x60 xc:none -fill red \
          -draw 'circle 30,21 30,3'   compose_R.png
  magick -size 60x60 xc:none -fill lime \
          -draw 'circle 39,39 36,57'  compose_G.png
  magick -size 60x60 xc:none -fill blue \
          -draw 'circle 21,39 24,57'  compose_B.png
  magick composite -compose plus  compose_R.png compose_G.png  compose_plus_RG.png
  magick composite -compose plus  compose_R.png compose_B.png  compose_plus_RB.png
  magick composite -compose plus  compose_G.png compose_B.png  compose_plus_GB.png
  magick composite -compose plus  compose_R.png compose_plus_GB.png \
            compose_plus_RGB.png
[IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
由於 IM 符合 SVG 標準,「green」不是真正的綠色(就像在 X11 顏色名稱中那樣),而是深綠色或半亮綠色。真正的 RGB 綠色可以使用顏色「lime」來指定,就像我們在上面的示例中所做的那樣。
它還可以用作數學運算符來將單獨的漸變圖像加在一起。例如,在計算「曼哈頓」差異圖像漸變數學 時。「」有時用於將白色文本添加到圖像中。這是不正確的用法,可能會導致一些反鋸齒不一致。更好的方法是使用「屏幕」合成方法。這使用乘法而不是加法來增加亮度。線性減淡合成方法 等效於「」,但使用更普通的「覆蓋」alpha 混合。

加法和加法混合

使「」更重要的是,它是唯一實現與「覆蓋」混合不同的混合函數的數學運算符。它不僅「添加」顏色,而且還「添加」alpha 通道值,並且是唯一默認執行此操作的運算符。這一點很重要,因為它允許正確連接互補的遮罩圖像。例如,請參見 目標內外 圖像的合併。它還允許您使用透明度來生成兩個圖像的加權平均值或 混合。如果不是因為「」的這種特殊混合方法,這些特殊的透明度處理技術通常是不可能實現的。
從 IM v6.6.1-6 開始,通過從「-channel」設置中刪除默認的「同步」標誌(只需指定要應用它的特定通道),就可以將數學運算符用於所有 數學合成方法 的 alpha 通道。請參閱下面的 使用圖像合成的圖像通道數學。這意味著「」運算符是唯一不受此功能影響的 數學合成方法 運算符,因為它已默認應用。
[IM Output]

減、Minus_Dst、Minus_Src  ( )

結果是從另一個圖像中減去一個圖像。哪個圖像是從另一個圖像中減去的取決於應用的是「Minus_Src」還是「Minus_Dst」。具體來說,「Minus_Dst」表示「減去目標」,或者如果在「magick composite」命令中應用....「Minus_Dst」的公式是   來源 - 目標   而「Minus_Src」的公式是   目標 - 來源 根據圖像合成和「magick composite 命令中通常定義的圖像順序,原始方法「」表示...
{Source} Minus {background}

也就是說,原始方法名稱「Minus」是「Minus_Dst」的同義詞,表示「減去目標」。它也是用於定義顯示的漸層圖表的運算符。例如,從上面 'Plus' 操作的最終結果中減去一個圓形。

  magick composite compose_plus_RGB.png  -compose minus_dst  compose_R.png \
            compose_minus.png
[IM Output]
請注意 Alpha 色板的處理方式,它與除 'Plus' 之外的所有其他數學運算符相同。請參閱數學合成與 Alpha 混色。這種處理方式可以通過使用特殊的 'Sync' 色板標誌來修改。有關詳細信息,請參閱下面的影像色板數學。'線性加深' 合成方法也可以用於顏色減法,但其工作原理是由使用者對要減去的影像進行負片處理。有關更多詳細信息,請參閱線性加深合成方法
在 IM v6.6.8-5 之前,僅提供原始的 'Minus' 方法(等效於較新的 'Minus_Dst')。
[IM Output]

模數加法

'模數加法' 與 '加法' 非常相似,只是當結果超過白色時,它會被包裹(模數)回黑色。例如,如果我們添加兩個灰度漸層,則最亮的顏色將包裹形成第二個漸層。

  magick -size 60x60 gradient:    gradient.png
  magick composite  gradient.png gradient.png -compose ModulusAdd  compose_add.png
[IM Output]
這種模數類型的合成可用於產生一些非常有趣的漸層,例如。

  magick composite gradient.png \( gradient.png -rotate -90 \) \
            -compose ModulusAdd   gradient_diagonal.png
[IM Output]
多次模數加法可以形成百葉窗類型的重複漸層。

  magick gradient.png \( +clone +clone +clone +clone \) \
          -background gray50 -compose ModulusAdd -flatten  gradient_venetian.png
[IM Output]
產生重複 5 次的漸層。請注意我如何使用 'gray50' 的背景將漸層有效地「滾動」了模數週期的一半。 [IM 輸出]

模數減法

'模數減法' 運算符與 '減法' 相同,只是它是模數減法。從「灰色」中減去「白色」將導致原始的「灰色」,而不是黑色,因為值會回繞。模數減法的一個副作用是某些部分可能會變成白色而不是黑色,其方式看似不受控制。

  magick composite -compose subtract  compose_plus_RGB.png  compose_R.png \
            compose_subtract.png
[IM Output]
負片影像執行 '模數加法' 將產生相同的結果。 [IM 輸出]

差異(影像比較和選擇性負片)

生成的影像是顏色值的絕對差異。其公式為:  abs(來源 - 目標)黑色」和「白色」差異將產生最大的白色結果,而任何相同的顏色將產生黑色。基本上是一種簡單的影像比較形式。這種合成方法更常見的用途是比較兩張大小相同的影像以查看它們的差異,甚至產生差異百分比。此運算符通常用於生成比較差異影像。該運算符還可以用於選擇性地對影像進行負片處理。疊加黑色對背景沒有影響,而疊加白色會反轉該位置影像中的顏色。換句話說,此運算符(以及下一個運算符)提供影像映射的負片運算符。
例如,讓我們將玫瑰影像的一半負片化。

  magick -size 2x1 pattern:gray50  -scale 70x50\! black_n_white.gif
  magick composite black_n_white.gif   rose: \
            -gravity center -compose difference   compose_negate.gif
[IM Output]
[IM Output]

[IM Output]

排除(排除灰色的影像差異)

其公式為:  Src + Dest - 2*Src*Dest 這是一種平均差異。白色疊加白色會產生黑色(無差異),黑色疊加黑色也是如此。然而,灰色疊加灰色會產生灰色結果。白色和黑色自然仍然會產生白色(最大差異)。 換個角度來看,明亮的圖像區域會導致相應另一圖層的反轉。非常暗的區域則完全不會改變。 在這種方式下,排除方法與「差異」(見前文)相同。這個運算子的用途之一是乘以「偏置漸層」,例如用於 位移貼圖 的漸層。這些漸層中,50% 灰度值被視為「零」,較暗的顏色代表「負」值,較亮的顏色代表「正」值,值的範圍從 -1 到 +1。詳情請參閱 乘以偏置漸層。 這個合成方法的另一個用途(由 Joe Fry 提出)是一種將多個差異圖像合併在一起的方法。最終圖像顯示所有圖像的變化,而不僅僅是兩個圖像之間的變化。也就是說,給定圖像 A、B 和 C,首先生成 A、B 和 B、C 的差異圖像,然後對這些結果使用排除,以便獲得一張顯示所有三個圖像如何變化的圖像。這種方法也與 Xor 合成混合運算子處理 Alpha 透明度值的方式密切相關。 [IM 輸出] [IM 輸出]

變亮和變暗(選擇最大值/最小值)

比較來源和目標圖像的顏色值,並採用相應的較亮或較暗的值。
變亮的公式為:    如果 Src > Dest   則   Src
  否則   Dest
對於變暗,只需反轉比較。

變亮」的一個用途是合成原始圖像的模糊版本,以便原始圖像中的「高光」周圍產生柔和的光 glow。


  magick flower_sm.jpg \( +clone -blur 0x3 \) \
          -compose Lighten -composite  flower_softglow.jpg
[IM Output] => [IM Output]
如需更好的方法(使用「混合模糊技術」)以獲得類似的結果,請參閱 柔化模糊
這些運算子的運作方式是比較和選擇個別的 RGB 色彩通道值,因此可能會導致一些顏色失真,尤其是在處理圖像的原色時。例如,我在這裡建立了一個紅色和藍色的漸層圖像,然後使用變亮將它們合成在一起。

  magick -size 100x100 gradient:red-black -rotate 90  red_gradient.png
  magick -size 100x100 gradient:blue-black            blue_gradient.png

  magick red_gradient.png blue_gradient.png \
          -compose Lighten -composite   lighten_by_value.png
[IM Output] [IM Output] => [IM Output]
因為藍色通道在紅色漸層圖像中為零,反之亦然,而「變亮」合成是透過顏色值進行的,所以結果只是簡單地合併紅色和藍色圖像,產生一個紅藍漸層圖像。也就是說,上述方法等同於簡單的 色彩通道複製合成。防止顏色失真的一種方法是限制運算子僅使用 HSL 色彩空間 調整圖像的「亮度」通道。不過,這並不一定會產生良好的結果。
請注意,「Gimp」、「Photoshop」、「PhotoLine」、「Paint Shop Pro」都像 IM 一樣直接比較通道。

Photo-Paint」透過顏色強度比較圖像,並使用該強度來決定要從哪個圖像中選擇顏色,從而保持顏色完整性。請參閱下面的 亮度強度方法

另一方面,「Picture Publisher」和「PhotoImpact」使用顏色亮度(由 HSL 色彩空間定義)進行比較。

如需比較各種色彩空間中灰階差異,請參閱範例 使用色彩空間進行灰階處理

[IM Output] [IM Output]

提亮強度和降低強度(按強度選擇顏色)

在 IM v6.6.9-5 中,新增了「Lighten_Intensity」和「Darken_Intensity」變體。這將比較兩張影像中像素的強度,然後根據結果選擇像素值。這意味著不會將新顏色添加到影像中,但新影像將是兩張影像中顏色的混合。此外,影像順序並不重要,但大小和中繼資料來自目標影像。例如,這裡採用包含紅色和藍色漸層的較亮影像。

  magick red_gradient.png blue_gradient.png \
          -compose Lighten_Intensity -composite   lighten_intensity.png
[IM Output] [IM Output] => [IM Output]
如您所見,從選定影像中選擇了整個像素。您不會看到顏色通道的混合。但是,由於藍色的強度被認為比紅色暗,因此只有最暗的紅色會被較暗的藍色漸層影像取代。
這種合成方法並未在我們目前為止所研究的所有先前合成方法所使用的 SVG 合成指南 (2009) 中定義。因此,對於 Alpha 通道應如何影響像素比較,並沒有真正的定義。

關於 Alpha,該方法有兩種操作模式。啟用「-channel」設定的特殊「Sync」標誌(預設值)時,比較將基於顏色的強度,並由 Alpha(透明度)通道加權。這意味著「半透明的白色」的加權強度與「不透明的中灰色」大致相同。

這意味著在其他條件相同的情況下,「Lighten_Intensity」將建立形狀影像的「聯集」,而「Darken_Intensity」將建立(至少是非黑色)形狀影像的「交集」。這並不理想,而且可能會改變,但總比沒有 Alpha 輸入好。

如果您關閉「Sync」通道標誌,則將使用第二種操作模式(請參閱下方的 使用「Sync」標誌)。例如,使用「-channel All」。然後,像素選擇將完全基於顏色強度,而不會受到 Alpha 加權的任何影響。但是,Alpha 通道值將與實際選擇的像素資料一起複製。對於沒有透明度的影像,無論採用哪種模式,結果都將相同。第二種模式還允許您使用更受限制的「-channel」來定義哪些通道可以從來源複製到目標影像(如果已選擇)。但是,選擇仍然完全基於未加權的顏色強度。這意味著您可以更輕鬆地根據兩張影像中顏色的強度建立選擇的「形狀遮罩」。您可以根據顏色強度比較影像,但只關心結果中的 Alpha 通道值。要製作「遮罩」,您可以使用 Alpha 透明,將一張影像設為完全透明(但仍有顏色),而將另一張影像設為完全不透明(預設值)。最後,您可以使用 Alpha 提取 來取得哪張影像在該像素位置具有較亮顏色的遮罩。

  magick red_gradient.png -alpha transparent    blue_gradient.png \
          -compose Lighten_Intensity -composite \
          -alpha extract    lighten_intensity_mask.png
[IM Output]
請注意,兩張影像中的 Alpha 值不必僅為「開啟」和「關閉」,而是可以設定為某些「參考」值。這意味著您可以擁有一系列影像,每個影像都具有不同的 Alpha 通道值。然後,您可以使用此合成方法比較所有影像,並取得一張地圖,顯示哪張影像在影像中每個位置都包含最亮(或最暗)的像素。換句話說,強度合成方法可以用作一長串影像的「選擇」或「比較」運算符。
自 IM v6.6.9-5 版本新增。但尚未找到該方法的正式定義。因此,目前的實作被歸類為**高度實驗性**,並且可能會根據使用者建議而改變。然而,其基本概念是合理的。

舊版 IM 的強度替代方案

如果您的 ImageMagick 版本不支援 'Lighten_Intensity' 方法,您可以透過在兩張影像的灰階副本上使用 'Lighten' 來重建純粹的色彩版本,並透過將結果與灰階副本進行比較,建立要套用於原始影像的選取遮罩。這並不容易,以下是一種解決方案...

  magick red_gradient.png blue_gradient.png \
          \( -clone 0--1 -colorspace Gray \
             \( -clone 0--1 -compose Lighten -composite \) \
             -delete 1 -compose Difference -composite -threshold 0 \
          \) -compose Src -composite     intensity_lightened.png
[IM Output]
這是一個相當可怕的處理過程,但如您所見,它確實有效。若要取得 'Darken_Intensity' 版本,請將「-delete 1」替換為「-delete 0」,或者將「-compose Lighten」替換為「-compose Darken」。兩種方法都有效。

集合論等價運算

上述許多數學方法也用於對形狀執行集合論或布林運算。 'Lighten' 合成方法可用於查找兩個(或多個)群組(集合)或像素的「聯集」(布林「或」)。

  magick -size 64x64 xc: -draw 'circle 22,32 5,32'  -negate circle_left.gif
  magick -size 64x64 xc: -draw 'circle 41,32 58,32' -negate circle_right.gif
  magick circle_left.gif circle_right.gif \
          -compose Lighten -composite    circle_union.gif
[IM Output] u [IM Output] => [IM Output]
'Darken' 合成方法會產生像素的「交集」(布林「且」)。

  magick circle_left.gif circle_right.gif \
          -compose Darken -composite    circle_intersection.gif
[IM Output] n [IM Output] => [IM Output]
'Difference' 合成方法會產生兩個集合的「互斥或」(布林「XOR」)。

  magick circle_left.gif circle_right.gif \
          -compose Difference -composite    circle_disjunction.gif
[IM Output] (+) [IM Output] => [IM Output]
也可以使用 'Exclusion' 方法來達到此目的,但處理灰階(非布林)值的方式不同。然而,這是用於 'XOR' Duff-Porter Alpha 混合的方法。最後,'Minus' 可用於產生兩個像素集合的「相對差集」。

  magick circle_left.gif circle_right.gif \
          -compose Minus_Src -composite    circle_complement.gif
[IM Output] - [IM Output] => [IM Output]
請注意,在將上述任何「集合」或「布林」合成方法套用於 HDRI 版本的 ImageMagick 時,可能需要使用「-clamp」來防止產生超出範圍的值。

數學合成和 Alpha 混合

您可以使用上述數學合成方法對影像執行數學運算。然而,這有一個主要的注意事項。它可能無法如您預期般在包含透明度的影像上運作。根據預設,幾乎所有上述數學合成都遵循 SVG 規範所定義的慣例。 SVG 合成指南 (2009)。這表示如果您嘗試在具有 Alpha 色板(即某種形式的透明度)的影像上使用數學合成,您可能無法獲得真正的數學合成,而是獲得「混合」形式的合成。例如,我在這裡建立了周圍具有一些透明度的漸層影像。然後我將它們「相乘」在一起。

  magick -size 64x64 xc:none -draw 'rectangle 20,0 43,63' \
          gradient: -compose In -composite    alpha_src.png
  magick alpha_src.png -transverse     alpha_dst.png
  magick alpha_dst.png  alpha_src.png \
          -compose Multiply -composite  alpha_result.png
[IM Output]
來源
 + [IM Output]
目標
=> [IM Output]
結果
請注意,未重疊的影像部分只是簡單地包含在結果影像中,沒有任何修改。也就是說,影像是「混合在一起的」。更糟糕的是,如果影像包含部分透明度,則顏色值將由 Alpha 色板「加權」。這對於 加法合成 很有用,它提供了「加權顏色加法」或 混合運算,但我尚未找到任何在影像中使用「顏色加權相乘」的方法。*有人知道嗎?* 如果您正在進行影像數學運算,則通常不希望出現這種行為。但是,在進行此類數學運算時,您通常也沒有任何 Alpha 色板,因此「Alpha 混合」和「加權顏色」問題很少出現。
加法合成 是唯一一種不進行「覆蓋 Alpha 混合」的 數學合成方法。相反地,根據 SVG 規範,它會分別添加每個通道。然而,在添加顏色通道之前,它們仍然會由 Alpha 值加權,只是 Alpha 值的處理方式(混合)不同。

這對於提供遮罩形狀的正確「加法」非常重要,如 DstOut 合成 中所示。

使用影像合成進行影像通道數學運算

如果您正在使用 數學合成方法 的圖像只是完全不透明的灰階圖像,那麼您可以直接使用上述方法,而不會有任何問題。但是,默認情況下,合成方法將應用於所有顏色通道,並進行 Alpha 混合,就像您在上面看到的那樣。這使得將它們僅應用於特定通道(例如 Alpha 通道)變得困難。例如,這裡我使用 'Multiply' 合成兩個包含透明漸層的黑色圖像。使用默認的 "-channel" 設定。

  magick -size 64x64 gradient:black-none   alpha_grad_src.png
  magick alpha_grad_src.png -transverse   alpha_grad_dst.png
  magick alpha_grad_dst.png  alpha_grad_src.png \
          -compose Multiply -composite  alpha_grad_result.png
[IM Output]
來源
 + [IM Output]
目標
=> [IM Output]
結果
請注意,將 'Black' 與 'Black' 相乘是 'Black',因此顏色在此範例中不會改變。只有產生的透明度會被修改。然而,結果絕對不是圖像 Alpha 通道值的乘積,因為根據 SVG 定義,半透明度是使用“over”方法混合的。這在數學上等於 Alpha 通道的 'Screen' 合成,而不是乘積。

同步通道標記和數學合成

從 IM v6.6.1-6 開始,數學合成方法 已被修改為遵守 "-channel" 設定的 'Sync' 標誌。這個標誌實際上意味著“同步顏色和 Alpha 通道操作”。默認的 "-channel" 設定是 'RGBK,Sync'。因此,默認情況下,顏色和 Alpha 通道會根據 SVN 規範“同步”處理。但是,通過刪除 'Sync' 標誌,數學合成方法 將變為“通道運算符”,將數學函數分別應用於每個通道。

  magick alpha_grad_dst.png  alpha_grad_src.png \
          -channel RGBA  -compose Multiply -composite  alpha_grad_nosync.png
[IM Output]
這是 Alpha 通道的正確乘積。
所有這些僅適用於 數學合成方法(如上所述)以及特殊的 '數學' 合成方法(見下文)。它不適用於其他合成方法,例如 光照合成方法(見下文)。至少現在還沒有。 'Sync' 標誌還會影響 按強度變亮/變暗合成方法(不是 SVG 定義的合成方法)如何處理 Alpha 通道(如上)。有關使用圖像數學的更多信息,請參見 漸層上的數學。更具體地說,這些示例著眼於使用數學合成來生成*偏置漸層圖像*,這稍微複雜一些。

光照合成方法-- Light、Dodge、Burn

這些方法以高度複雜的方式修改圖像的顏色,並且通常用於調整圖像的陰影或強度,使某些區域更亮,而其他區域更暗。
光照合成方法分為三個相關運算符的子類別。
'*加深*',通常會使圖像變暗。
'*減淡*',通常會使圖像變亮。
'*光照*',根據其中一張圖像的暗度和亮度來使圖像變暗和變亮。
'Multiply'(顏色變暗)通常被視為純粹的'*加深*'合成操作,而 'Screen'(變亮)是'*減淡*'合成操作。通常,其中一張圖像將包含顏色圖案或照片,而另一張圖像是用於適當變亮或變暗圖像的灰階圖像。哪張圖像應該是彩色,哪張應該是灰階,這一點尚有爭議,並且取決於方法的實現方式。在這方面沒有標準,因此建議謹慎和實驗。由於這些運算符缺乏標準,許多用戶不了解或錯誤地使用了這些運算符。我還沒有找到任何關於如何正確使用這些合成方法的指南,實際上根本不存在,所以我盡力在下面的示例中做了一些說明。 [IM 輸出]

疊加(為灰階對象添加顏色)

這種合成方法非常特殊,因為它被設計成同時對圖像進行「乘法」(變暗)和「濾色」(變亮)。應用於特定像素的方法由目標圖像的值選擇,該值可以被視為「光照遮罩」。因此,目標通常是一個灰度圖像,顏色會被添加到其中。
其公式為:     如果 目標 <= 0.5   則   2*來源*目標
  否則   1-2*(1-來源)*(1-目標)
結果是一種特殊的合成方法,它保留目標圖像中存在的任何純白色和黑色(高光),同時用疊加圖像中的顏色對該圖像的中間調灰色進行著色。也就是說,給定一個灰度圖像作為目標,此運算符將使用源圖像對該背景進行著色,保留目標中存在的任何陰影和高光效果。

  magick -size 64x64 gradient:yellow-blue gradient_yell-blue.jpg
  magick -size 64x64 gradient: -rotate 90 gradient_grey.jpg

  magick gradient_grey.jpg   gradient_yell-blue.jpg \
          -compose Overlay  -composite   compose_overlay_gradients.jpg
[IM Output]
目標
 + [IM Output]
疊加
=> [IM Output]
結果
如您所見,漸變圖像的中間調灰色用提供的圖像的顏色進行了著色。這是合成方法的正常用法,將顏色添加到灰度光照遮罩。與「乘法」或「濾色」不同,此方法不具有關聯性。

  magick gradient_yell-blue.jpg  gradient_grey.jpg \
          -compose Overlay   -composite   compose_overlay_gradients2.jpg
[IM Output]
目標
 + [IM Output]
疊加
=> [IM Output]
結果
這種將顏色「疊加」到灰色高光圖像中的方法使其非常適合為「-shade」運算符的輸出添加顏色。但是,您需要非常小心地從該運算符生成完美的中間調灰色,以便在沒有任何高光的區域獲得正確的著色。有關詳細信息,請參閱陰影疊加高光。例如,給定一個圓形,我們可以對其進行著色以產生 3D 效果,然後使用原始圖像對結果進行著色以恢復原始顏色。

  magick -size 64x64  xc:dodgerblue \
          -draw 'fill skyblue   circle 32,32 7,27'  circle_blue.jpg
  magick circle_blue.jpg -shade 120x30 -auto-level circle_shaded.jpg
  magick circle_shaded.jpg  circle_blue.jpg \
            -compose Overlay -composite   circle_shaded_tinted.jpg
[IM Output]
目標
 + [IM Output]
疊加
=> [IM Output]
結果
有關使用「疊加」方法的更實際示例,請參閱背景生成器示例頁面上的「levels_3d」圖像。此合成方法的最大問題是任何圖像中的透明度都不會被保留。也就是說,在任一圖像中可見的內容在結果中都將可見。通常,此運算符用於不包含透明度的圖像,這通常意味著您可能需要執行一些額外步驟來恢復目標或背景圖像的透明度。一種保留透明度的簡單方法是簡單地關閉目標圖像的 Alpha 通道,從而使其無法訪問。合成完成後,您可以再次打開它。在陰影形狀圖像中給出了一個示例。另一種方法是保存「遮罩」或原始圖像的副本,然後使用該遮罩或圖像來恢復透明度。在疊加顏色著色中提供了這樣做的示例。或者在更複雜的示例更好的 3D 徽標生成中。
在 IM 版本 6.1.6 之前,「疊加」合成方法已損壞,因為它只會產生純黑色或純白色的結果(很可能您只會得到純黑色的結果)。因此,大多數 IM 用戶幾乎沒有機會了解此運算符。現在,這個問題已經得到修復,用戶現在可以充分利用此方法。
[IM Output]

強光(為圖像添加紋理或高光/陰影)

這與「疊加」相同,只是源圖像和目標圖像互換了。如果您比較這兩個運算符的漸變圖像,您可以看到漸變是沿對角線轉置的,顯示了源輸入和目標輸入的交換。
其公式為:     如果 來源 <= 0.5   則   2*來源*目標
  否則   1-2*(1-來源)*(1-目標)
因此,雖然「疊加」可以為灰階陰影物件添加顏色,但「強光」會為影像添加灰階光照效果。您使用哪種方法取決於您如何考慮添加影像光照效果。重要的區別在於哪個影像為「目標」影像,以便保留影像中繼資料,甚至暫時停用 Alpha 色板以在操作過程中保留它。例如,在這裡,我使用與原始影像大小相同的純灰色影像的模糊「-raise」操作產生「光照效果」。然後使用「強光」合成此效果,將這些光照效果添加到影像中。

  magick rose: -fill gray50 -colorize 100% \
          -raise 4 -normalize -blur 0x4  lighting_effect.png
  magick rose: lighting_effect.png \
          -compose hardlight -composite  compose_hardlight.png
[IM Output]
目標
 + [IM Output]
疊加
=> [IM Output]
結果
這種方法可以輕鬆地使用單一操作為現有影像添加高光(如反射光)或深色陰影效果。以下是在影像中直接添加光照「紋理」的範例。

  magick rose: \( granite: -blur 0x.5 -normalize \) \
          -compose hardlight -composite compose_texture.png
[IM Output]
請注意產生的文字有多麼強烈,幾乎以明亮和黑暗區域覆蓋了原始影像。這是使用「強光」的缺點。為了克服這個問題,您可能需要降低疊加紋理的對比度。

  magick rose: \
          \( granite: -blur 0x.5 -normalize  +level 30,70%  \) \
          -compose hardlight -composite compose_texture_muted.png
[IM Output]
其他光照合成方法(例如「柔光」)也可以更直接地產生更好的結果。如需更好的範例,請參閱照片食譜中的疊加紋理。「強光」陰影的實際應用範例提供在IM 論壇上,從平面原始影像產生 3D DVD 封面。請記住,「疊加」和「強光」陰影本質上是相同的合成方法。唯一的區別是影像順序。 [IM 輸出]

柔光(影像的較柔和高光)

柔光」合成方法也會為現有的彩色影像添加高光和陰影。但是,會修改目標影像的顏色以產生更柔和的對比度和更平滑的光照效果漸層。如果您仔細觀察「灰階映射影像」(見右圖),您會發現沒有明顯的不連續性,儘管實際上有兩個。(另請參閱下一個「點光」)。它與「疊加」合成比「強光」更密切相關,因此目標通常是灰階光照遮罩。這是否是故意的尚不清楚,但它確實使其與「強光」不同,但這意味著您最好將主影像合成到陰影影像上,而不是反之亦然。 :-(
警告: 此光照效果的定義更像是「疊加」而不是「強光」。但是,哪個應該包含灰階光照影像尚不清楚。使用來源可以產生全黑和全白的結果,但使用目標則無法產生這些極端情況。

如果有人有任何明確的參考資料,請告訴我。
例如,以下是「柔光」紋理映射。

  magick rose:  \( granite: -blur 0x.5 -normalize \) \
          -compose softlight -composite compose_softlight.jpg
[IM Output]
如您所見,即使使用標準化的「granite:」影像,顏色變化也比「強光」甚至「疊加」更柔和、更不強烈。但是,您也永遠不會在產生的影像中獲得任何純黑色的陰影或純白色的高光。基本上,「柔光」具有更柔和的紋理效果,可以保留來源影像的原始色彩。
在這裡,我展示了使用純黑色、白色和完美灰色疊加層所產生的顏色變化。

  magick -size 1x3 gradient: -sample 70x46\! grayscale_3.gif
  magick composite grayscale_3.gif  rose: -compose softlight  compose_softlight_2.gif
[IM Output]
[IM Output]
如果您使用「強光」執行此操作,則影像的側面將是純黑色和白色,而不是僅變暗或變亮 50%。
在 IM v6.5.4-3 之前的版本中,'柔光' 的運作方式與預期不符,對於任何非灰階的影像疊加,都會產生增亮效果。實際上,我確認過它的實作方式符合官方的 2004 年 SVG 規範

不幸的是,錯誤的不是實作方式,而是規範本身。這個問題在 2009 年 3 月的 SVG 規範 中已獲得修正。因此,從 IM v6.5.4-3 版本開始,這個運算子的運作方式會如您預期般,呈現出光線遮蔽的效果。
[IM Output]

帳篷光(柔光的更平滑變化)

雖然 '柔光' 比 '強光' 或 '疊加' 都要平滑得多,但它實際上仍然是基於兩個獨立函數的組合。'帳篷光' 方法產生的結果與 '柔光' 幾乎相同,但它使用的是單一平滑函數,没有任何不連續性,甚至連 '柔光' 使用的兩個微小不連續性都沒有。正因為如此,它實際上更簡單、速度也更快。其公式為:  2*Src*Dest + Src2*(1 - 2*Dest) 如需詳細資訊,請參閱 Pegtop 柔光替代方案 頁面。
警告:這個光線效果的定義更像是 '疊加',而不是 '強光'。
'帳篷光' 合成方法已新增至 IM 6.5.4-3 版本。
[IM Output]

線性光(一種非常簡單但強烈的遮蔽方案)

另一種對疊加遮蔽影像非常敏感的影像遮蔽方法。它具有更大的純黑色和純白色限制區域。其公式為:  2*Src + Dest - 1 雖然它是一個連續函數,但實際上可以將其視為 '線性加亮'(相當於 '加法' 合成)和 '線性加深'(一種偏移「加法」,有時用於影像減法)的組合。
在 IM v6.5.4-3 之前的版本中,'線性光' 被證明實作不正確。
[IM Output]

豔光(線性光的變體)

'豔光' 方法與 Photoshop 7 中實作的方法相同,基本上是對 '線性光' 方法的微調。它的作用是避免遮蔽極端值,以使影像中的強原色更「鮮豔」。
其公式為:     如果 來源 <= 0.5   則   1-(1-Dest)/(2*Src)
  否則   Dest/(2*(1-Src))
另一種看待它的方式是將 '色彩加深' 和 '色彩減淡' 結合用於極端值,而將 '線性光' 用於中間色調。
'豔光' 合成方法已新增至 IM 6.5.4-3 版本。
[IM Output]

點光

'點光' 函數旨在更好地保留目標影像的中間色調,將其遮蔽限制在較亮和較暗的疊加遮蔽。據說這模擬了由微小的針孔光源產生的強烈而銳利的光線變化,而不是更分散的「柔和」光源。
其公式為:     如果 Dest < 2*Src-1   則   2*Src - 1
否則,如果   Dest > 2*Src   則   目標
  否則   2*Src
'點光' 合成方法已新增至 IM 6.5.4-3 版本。
[IM Output]

線性加亮(Photoshop 的「加法」合成)

如果您將 '線性加亮' 的漸層影像(右)與 '加法' 的漸層影像進行比較,您會發現對於兩個不透明影像,它們的效果完全相同。其公式當然是:  Src + Dest 也就是說,對於沒有透明度的影像,這兩個命令使用影像 'A' 和 'B' 會產生相同的結果影像 'R'...

  magick A  B   -compose    Plus     -composite   R
  magick A  B   -compose LinearDodge -composite   R
此方法等同於 Photoshop 中相同名稱的合成模式。這兩種方法之間唯一真正的區別在於它們處理包含半透明顏色的圖像的方式。本質上,線性加亮合成 使用“覆蓋” Alpha 混合,而 加法合成 使用“加法” Alpha 混合。詳情請參閱 加法混合
Linear_Dodge” 合成方法已添加到 IM 版本 6.5.4-3 中。
[IM Output]

線性加深(Photoshop 的“減去”方法)

線性加深” 合成方法是一種“加一減一”的合成,它產生的結果與您將“線性加亮” 或“加法” 合成方法的所有輸入和輸出圖像都取反時相同。其公式為:Src + Dest - 1 在 Photoshop 中,這不僅被稱為“線性加深”,也被稱為“減去”。這是因為如果您將其中一張輸入圖像(例如源圖像)反相,則該圖像將從另一張圖像中減去。例如,以下是您對源圖像進行反相時的結果數學運算...
(1-Src) + Dest - 1 ==> Dest - Src
也就是說,在沒有透明度的情況下,您可以使用圖像“A”減去圖像“B”,產生相同的結果圖像“R”...

  magick A  B               -compose  minus_src  -composite  R
  magick B  A               -compose  minus_dst  -composite  R
  magick A \( B -negate \)  -compose linear_burn -composite  R
  magick B -negate  A       -compose linear_burn -composite  R
基本上,無論哪個圖像被反相,都是“線性加深” 將從另一個圖像中減去的圖像。圖像是源圖像還是目標圖像並不重要。在某些方面,這使得這種合成方法更加通用。例如,在這裡,我從左邊的圓圈圖像中減去右邊的圓圈圖像(我對其進行了反相)。

  magick circle_left.gif \( circle_right.gif -negate \) \
         -compose LinearBurn -composite   circle_subtract.gif
[IM Output] - [IM Output] => [IM Output]
這種合成方法也使其可以用作 減去評估序列方法 的替代方法,從單個起始圖像中減去多個圖像。但請注意,“線性加深” 不能直接應用於圖像的 Alpha 通道,而更具 數學合成方法減法 可以。
Linear_Burn” 合成方法已添加到 IM 版本 6.5.4-3 中。
[IM Output]

色彩加亮(Photoshop 除法)

這種合成方法使用源疊加圖像作為遮罩,在長時間的“曝光”下保護背景圖像。暴露在較亮遮罩下的部分會變亮(或加亮),而黑色區域則不會產生變化。您可以將其想像成將一個物體長時間放置在照片上,導致暴露在光線下的部分隨著時間的推移而慢慢變白,而被覆蓋的部分則保持原樣。純黑色疊加不會改變圖像,而純白色疊加會使所有背景顏色變為白色,除了那些原本就是純黑色的顏色。然而,與“濾色”(反相相乘)或“線性加亮”(加法)加亮合成方法不同,純黑色或全白色目標圖像將不受光照遮罩的影響。換句話說,只有包含灰色和非純色的區域才會受到影響。其公式為:Dest / (1-Src) 需要在此處提供示例和實際用途 事實上,“色彩加亮” 和兩個“除法” 運算符可以產生相同的結果。但是,“色彩加亮” 需要將用作“除數”的圖像反相,並用作運算符的“源”圖像。例如,所有這些對圖像“N”(分子)除以“D”(分母)進行運算的命令都會產生相同的結果圖像“R”... 假設所有圖像的大小都相同。

  magick N \( D -negate \)  -compose ColorDodge -composite  R
  magick N    D             -compose DivideSrc  -composite  R
  magick D    N             -compose DivideDst  -composite  R
有關如何使用圖像除法來移除背景漸變的示例,請參閱“除法”。 [IM 輸出]

色彩加深

這與「色彩增亮」相反,相當於將所有輸入和輸出圖像反轉。結果是背景圖像被深色遮罩圖像變暗,而白色不會產生變暗。但是,與「正片疊底」或「線性加深」燒錄合成方法不同,純黑色或全白色目標圖像將不受照明遮罩的影響。換句話說,只有包含灰色和非純色的區域才會受到影響。其公式為:1 - ( (1-目標) / 來源) 此處需要範例和實際用途 此指令等同於先前用於實現圖像除法的公式集。請注意指令中的最終否定。

  magick N -negate D   -compose ColorBurn -composite  -negate  R
色彩加深」的一種用途是將深色漸變背景清理為純黑色。就像「色彩增亮」可以將背景劃分為白色一樣。
在 IM v6.5.4-3 之前,「色彩加深」被證明實作不正確。

通道複製方法

這些圖像合成方法旨在將圖像通道信息從一個圖像傳輸到另一個圖像。但是,它對正在複製「通道」的圖像進行了一些假設。我建議您在使用它們之前,先閱讀圖像色彩空間顏色通道運算符部分,以了解 IM 如何在內存中表示圖像顏色通道。最有用的通道複製合成方法是「複製不透明度」(見下文)。這是使用單獨的灰度遮罩圖像將 Alpha 通道完全替換(或添加)到現有圖像的最簡單方法。

複製不透明度(從灰度遮罩設置透明度)

複製不透明度」運算符的最初目的是將源圖像的透明度通道複製到目標圖像中,以設置該圖像的透明部分。這通常使用 Duff-Porter 運算符來完成,這些運算符專為合成具有 Alpha 透明度的圖像而設計。例如,如果目標是完全不透明的(這在該運算符的使用中很典型),則「目標內」甚至「目標置頂」運算符將實現相同的結果。那麼,為什麼「複製不透明度」運算符如此重要,而有替代方案呢?答案是這個運算符如何處理特殊情況。當疊加(源)圖像沒有 Alpha 通道時,此運算符會將其視為簡單的灰度圖像遮罩。也就是說,它會用給定的灰度圖像替換圖像的任何現有 Alpha 通道。總之,灰度圖像中任何黑色的東西都將被認為是完全透明的,而白色的東西則完全不透明。這一點非常重要,而且使用非常普遍,我將把它作為一個經驗法則...
使用此運算符的圖像不應包含任何 Alpha 通道。
您可以通過在使用「複製不透明度」合成設置進行合成之前關閉 Alpha 通道來確保圖像在兩個輸入圖像上都沒有任何 Alpha 通道。
例如,製作一個灰度月亮圖像(很容易繪製),然後將其用作藍色等離子漸變的遮罩,以產生一個漂亮的斑駁藍色月亮。

  magick -size 70x70 xc:black -fill white -draw 'circle 35,35 35,5' \
                               -fill black -draw 'circle 28,30 35,5' \
          moon_mask.gif

magick -size 70x70 plasma:white-dodgerblue moon_mask.gif \ -alpha Off -compose CopyOpacity -composite moon_gradient.png
[IM Output]
[IM Output]
如果您的圖像有需要保留的透明組件,那麼這不是您需要的 Alpha 合成運算符。您更有可能需要使用「Dst_In」來從目的地減去來源疊加層的透明區域(在這種情況下,兩個圖像都需要啟用並使用 Alpha 色板)。此運算符在將遮罩圖像與字體一起使用編輯圖像遮罩中有更詳細的說明。它也用於這些頁面中的許多其他示例中。

Copy_Red、Copy_Green、Copy_Blue

將來源圖像的給定顏色通道複製到目標圖像。由於灰度 RGB 圖像在所有三個顏色通道中具有相同的數據,因此這些方法可以被認為是複製灰度通道圖像以替換目標圖像中的指定通道。就像「Copy_Opacity」(見上文)可以用灰度圖像替換圖像的「Alpha 色板」一樣。由於使用各種顏色通道運算符通過灰度通道圖像分離和重新組合顏色通道,因此這些通道複製方法如今已很少使用。請注意,當合併各種灰度漸變圖案時,可以使用這些運算符生成非常有趣的彩色圖像。有關一些示例,請查看原始合成運算符表中的顏色漸變組合。

Copy_Cyan、Copy_Magenta、Copy_Yellow

這些是上一節中相同方法的同義詞。基本上,因為 RGB 圖像中的「Red」通道也用作 CYMK 圖像中的「Cyan」通道。「Green」和「Magenta」通道以及「Blue」和「Yellow」通道也是如此。因此,複製「Cyan」通道與複製「Red」通道相同。圖像數據表示的通道類型取決於內存中圖像的當前色彩空間

Copy_Black

如果存在,這也會將「Black」通道從來源複製到目的地。但是,該通道僅存在於 CMYK 圖像中。如果「Black」通道不存在,則此操作無效,這可能是一個錯誤。它應該做的是將灰度「Black」通道圖像複製到目標圖像的黑色通道(假設它存在)。

色相(將 RGB 圖像的色相複製到目的地)

此運算符複製來源圖像的色相 H 以替換目標圖像的色相,保持背景飽和度 S 和亮度 L(*或者它是亮度 Y?*)不變。這假設兩個圖像都在 RGB 色彩空間圖像中。我還沒有使用非 RGB 色彩空間圖像對此進行測試。

飽和度(將 RGB 圖像的飽和度複製到目的地)

將飽和度 S 從來源複製到目的地(假設圖像是 RGB 色彩空間圖像),保持顏色色相 H 和亮度 L(*或者它是亮度 Y?*)不變。這假設兩個圖像都在 RGB 色彩空間圖像中。我還沒有使用非 RGB 色彩空間圖像對此進行測試。

亮度(將 RGB 圖像的亮度複製到目的地)

將亮度 L(*或者它是亮度 Y?*)從來源複製到目的地,保持顏色色相 H 和飽和度 S 不變。這假設兩個圖像都使用 RGB 色彩空間存儲。我還沒有使用非 RGB 色彩空間圖像對此進行測試。

著色(將顏色色相和飽和度複製到目的地)

將色相 H 和飽和度 S 從來源複製到目的地,保持顏色亮度 L(*或者它是亮度 Y?*)不變。這假設兩個圖像都使用 RGB 色彩空間存儲。我還沒有使用非 RGB 色彩空間圖像對此進行測試。

將一個圖像溶解到另一個圖像上

-dissolve」運算子的作用是提供一種可控的「Over」合成方法。它會根據給定的百分比,在疊加圖像疊加到背景圖像之上之前,調整疊加圖像的透明度。
    magick composite -dissolve {percent} overlay  bgnd  result


magick composite -dissolve {src_percent}x{dst_percent} overlay bgnd result

magick bgnd overlay -compose dissolve \
-define compose:args={src_percent},{dst_percent} \
-composite result
提供兩個參數(IM v6 的新功能),您可以精確定義在圖像疊加之前要溶解疊加圖像和背景圖像的程度。如果只給出一個百分比參數,則只會溶解疊加圖像以保留該數量(0% 表示完全透明,100% 表示來源不變),然後再疊加(使用「Over」合成方法)到背景上。此外,如果您繼續超過 100% 的值(也是 IM v6 的新功能),它將開始溶解背景圖像。換句話說,在 0 到 100% 的範圍內,背景圖像完全沒有被溶解(dst_percent100%),而在 100 到 200 的範圍內,疊加圖像保持原樣(src_percent 設定為 100%),並且背景圖像被溶解,因此當參數達到 200% 時,它會完全消失。以下是具有各種溶解參數的結果表...

  magick composite -dissolve {argument}  -gravity South \
            star.gif   dragon_sm.gif -alpha Set   {result}
[IM Output] [IM Output]
[IM Output]
如您所見,「-dissolve」會先將新圖像緩慢溶解到背景上,然後再將原始背景圖像緩慢溶解掉。這非常適合包含透明區域的圖像。您也可以控制背景的溶解,因此當一個圖像在頂部溶解時,您可以安排背景在下方溶解。這非常好,但不適合在圖像之間進行適當的幻燈片放映式溶解。由於一個圖像疊加在另一個圖像之上時,圖像不會平均合併,並且交換圖像參數(以及相應的溶解參數)會產生不同的結果。
對於 100% 到 200% 的範圍,或要使第二個百分比參數生效,背景圖像必須包含 Alpha 色板。這對於預設情況下不包含任何透明度的 JPEG 圖像尤其重要。

因此,最好在應用「dissolve」合成方法之前,使用「-alpha Set」運算子告訴 IM 為所有圖像提供 Alpha 色板。

在兩個圖像上使用溶解的最大注意事項是透明度會影響平均值。也就是說,將兩個圖像溶解 50% 總是會導致顏色變成半透明,即使兩個輸入圖像都是完全不透明的。例如

  magick dragon_sm.gif star.gif -alpha on \
          -compose dissolve -define compose:args='50,50' \
          -gravity South  -composite     dissolve_50_50.png
  magick composite -compose Dst_Over -tile pattern:checkerboard \
            dissolve_50_50.png   dissolve_50_50_bg.png
[IM Output]
您可以看到,在將圖像疊加到棋盤格圖案上之後,圖像的所有部分都至少是半透明的。儘管實際疊加的部分比其中一個來源圖像透明的任何部分都不透明。您唯一可以從「Dissolve」合成中獲得完全不透明圖像的情況是,其中一個圖像(通常是「背景」)沒有被溶解(100% 的值),並且保持不透明。這就是為什麼預設情況下對「背景」使用 100 的值,至少一開始是這樣。以下是一些特定「-dissolve」參數的特殊情況...
0x0 兩個圖像都被溶解到完全透明。
等效於「Clear」合成方法。
0 只有背景圖像不變(來源變成透明)。
等效於「Dst」合成方法。
100 將疊加圖像正常疊加到背景上。
等效於「Over」合成方法。
200 空白畫布上的疊加圖像(背景變成透明)。
等效於「Src」合成方法。
-dissolve」合成方法通常被用作使用圖像添加浮水印的另一種方法,特別是對於彩色浮水印。

將兩個圖像混合在一起

-blend」合成方法提供了「-dissolve」合成方法最初打算提供的功能,之後它被用於其他更基本的操作。 「-dissolve」方法將圖像疊加在一起,而「-blend」則根據給定的百分比參數將圖像合併在一起,使兩個圖像得到同等對待(僅僅是相加)。 因此,您可以通過交換百分比和圖像參數來實現相同的結果(最終圖像大小除外)。 「-dissolve」方法則不然。 換句話說,「-blend」是關聯的(參數可以交換),而「-dissolve」則不是。

    magick composite -blend {percent} overlay  bgnd  result


magick composite -blend {src_percent}x{dst_percent} overlay bgnd result

magick bgnd overlay -compose blend \
-define compose:args={src_percent},{dst_percent} \
-composite result

如果只給出一個百分比值,它將用作疊加層的溶解百分比,而背景圖像將按完全相反的量溶解。 也就是說,「-blend 30」會將疊加層溶解 30%,將背景溶解 70%,然後再將兩個圖像加在一起。 因此它等同於「-blend 30x70」。 這樣做的結果是,兩個圖像的不透明度(在疊加區域中)加起來仍然是 100%。

通過給出兩個百分比,您可以精確控制要合併兩個圖像的多少。 以下是具有各種溶解參數的結果表...

  magick composite -blend {argument}  -gravity South \
            compose_R.png compose_plus_GB.png  -alpha Set  {result}
[IM Output] [IM Output]
[IM Output]
從結果中您可以看到,「-blend」可以讓您在沒有疊加的情況下,將一個圖像緩慢地替換為另一個圖像。 如果您將混合的結果疊加在黑色畫布上(例如顯示器的尺寸),您可以輕鬆地製作出一個可觀的幻燈片放映程序,其中一個圖像緩慢溶解到另一個圖像中。 您還可以發現,因為圖像是加在一起的(內部使用「」合成運算符),您可以輕鬆地超過顏色通道的最大值,從而產生一些偽影。 特別是 100% 的白色將確保其他圖像的任何部分都不可見,因為所有顏色通道都已達到最大值。 建議在大多數情況下,您只需要使用單一參數版本的 blend。
與「-dissolve」一樣,背景圖像必須包含 Alpha 通道才能使「-blend」正常工作,以溶解背景圖像。

因此,最好告訴 IM 在應用「混合」合成之前對所有圖像設置 Alpha 通道

以下是特定「-blend」參數的特殊情況...
0x0 兩個圖像都被溶解到完全透明。
等效於「Clear」合成方法。
0 僅背景圖像不變。
等效於「Dst」合成方法。
100 空白畫布上的疊加圖像。
等效於「Src」合成方法。
100x100 僅將兩個圖像加在一起。
等效於「」合成方法。
50 兩個圖像的平均值。 這等效於「-evaluate-sequence mean」圖像序列運算符,但使用兩個圖像。 (另請參閱平均圖像

混合與溶解

雖然 Dissolve 和 Blend 都會讓圖像變成半透明的,「-dissolve」使用「Over」合成圖像,而「-blend」則使用「Plus」合併圖像。這看起來可能沒什麼大不了,但它可能非常重要,因為它定義了兩種合成方法如何處理圖像中未被覆蓋的部分,或覆蓋層是透明的區域。例如。

  magick dragon_sm.gif star.gif -alpha on \
          -compose dissolve  -define compose:args=50 \
          -gravity South  -composite     dissolve_50.png
  magick dragon_sm.gif star.gif -alpha on \
          -compose blend  -define compose:args=50 \
          -gravity South  -composite     blend_50.png
[IM Output]
Dissolve
[IM Output]
Blend
請注意,雖然在 Blend 圖像中,「龍」背景的非重疊部分是半透明的,但星星區域在兩者中都是完全不透明的,並且具有相同的顏色結果!也就是說,對於兩個圖像都完全不透明的區域,並且您允許 IM 計算適當的第二個「{dst_percent}」參數,您也將獲得完全不透明的相同結果。例如,在這裡我將「龍」圖像與內置的「玫瑰」圖像合併。我將兩個圖像裁剪為相同的大小,以便兩個完全不透明的圖像可以完全相互覆蓋。

  magick dragon_sm.gif rose: -crop 70x46+0+0 +repage -alpha on \
          -compose dissolve  -define compose:args=50 \
          -gravity South  -composite     dissolve_50_opaque.png
  magick dragon_sm.gif rose: -crop 70x46+0+0 +repage -alpha on \
          -compose blend  -define compose:args=50 \
          -gravity South  -composite     blend_50_opaque.png
[IM Output]
Dissolve
[IM Output]
Blend
如果您要比較這兩個圖像,您會發現它們完全相同。總之,Dissolve(僅在給定透明度的覆蓋圖像上覆蓋)與 Blend(兩個圖像各自具有適當百分比的加權相加)對於任何完全不透明的圖像產生相同的結果。只有當一個或兩個圖像包含透明度時,這兩種方法才會有區別。

使用混合修改單一影像

Blend 基本上是一個「插值函數」或「加權平均」,允許您以受控的線性方式組合兩個完全不透明的圖像。也就是說,30% 的來源加上 70% 的背景,以產生一個新的 100% 不透明圖像。然而,它不僅僅可以組合兩個圖像。它還可以讓特定圖像變亮、設置對比度、飽和度、上色,甚至銳化。BugBear <bugbear@papermule.co.uk> 在 WWW 上找到的一份文件中進一步討論了 Blend 的這種用法,《通過插值和外推法進行圖像處理》是《Grafica Obscura》的副本(不能從外部來源直接鏈接)。建議進一步閱讀此文件以了解如何使用此函數。
在 IM v6.3.5-10 中,「-blend」運算符中添加了外推功能。
例如,在這裡,我們可以通過將玫瑰圖像與相同大小的純黑色圖像混合來使其變亮或變暗。

  magick composite -blend   0 rose: -size 70x46 xc:black -alpha Set blend_dark_0.jpg
  magick composite -blend  50 rose: -size 70x46 xc:black -alpha Set blend_dark_50.jpg
  magick composite -blend 100 rose: -size 70x46 xc:black -alpha Set blend_dark_100.jpg
  magick composite -blend 150 rose: -size 70x46 xc:black -alpha Set blend_dark_150.jpg
  magick composite -blend 200 rose: -size 70x46 xc:black -alpha Set blend_dark_200.jpg
[IM Output]
0%
[IM Output]
50%
[IM Output]
100%
[IM Output]
150%
[IM Output]
200%
與任何使用 Blend 合成方法 一樣,0% 會產生「目標」圖像,而在 100% 時,結果是原始「來源」圖像保持不變。這裡更有趣的是混合圖像和外推圖像。類似地,與純灰色圖像混合可以讓您調整任何圖像的對比度。

  magick composite -blend   0 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_0.jpg
  magick composite -blend  50 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_50.jpg
  magick composite -blend  80 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_80.jpg
  magick composite -blend 100 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_100.jpg
  magick composite -blend 120 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_120.jpg
  magick composite -blend 150 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_150.jpg
[IM Output]
0%
[IM Output]
50%
[IM Output]
80%
[IM Output]
100%
[IM Output]
120%
[IM Output]
150%
在這裡,我將圖像與其灰度版本混合,讓您可以控制顏色的飽和度。

  magick rose: -type grayscale  rose_gray.png
  magick composite -blend   0 rose: rose_gray.png -alpha Set blend_color_0.jpg
  magick composite -blend  50 rose: rose_gray.png -alpha Set blend_color_50.jpg
  magick composite -blend 100 rose: rose_gray.png -alpha Set blend_color_100.jpg
  magick composite -blend 150 rose: rose_gray.png -alpha Set blend_color_150.jpg
  magick composite -blend 200 rose: rose_gray.png -alpha Set blend_color_200.jpg
[IM Output]
0%
[IM Output]
50%
[IM Output]
100%
[IM Output]
150%
[IM Output]
200%
在這裡,我將玫瑰圖像与其模糊版本混合,在插值時產生 柔和模糊,在外推時產生 不銳化

  magick rose: -blur 0x5  rose_blurred.png
  magick composite  -blend   0  rose: rose_blurred.png -alpha Set blend_blur_0.jpg
  magick composite  -blend  50  rose: rose_blurred.png -alpha Set blend_blur_50.jpg
  magick composite  -blend 100  rose: rose_blurred.png -alpha Set blend_blur_100.jpg
  magick composite  -blend 150  rose: rose_blurred.png -alpha Set blend_blur_150.jpg
  magick composite  -blend 200  rose: rose_blurred.png -alpha Set blend_blur_200.jpg
[IM Output]
0%
[IM Output]
50%
[IM Output]
100%
[IM Output]
150%
[IM Output]
200%

浮水印選項 - 合成「Modulate

-watermark」合成選項或「modulate」合成方法旨在在 HSB 空間中對圖像進行「去色」處理,以達到版權保護的目的。

    magick composite -watermark {brightness}[x{saturation}] overlay  bgnd  result \

magick bgnd overlay -compose modulate \
-define compose:args={brigthness}[,{saturation}] \
-composite result
「覆疊」影像是指帶有 Alpha 遮罩的黑白影像,用於根據指定的「亮度」百分比來調亮或調暗目標影像。「亮度」為「0」時,影像亮度保持不變;而「100」則會將亮度替換為覆疊影像的強度。也就是說,如果覆疊為黑色,則目標會變為黑色;如果覆疊為白色,則目標影像的顏色將完全飽和。「飽和度」預設為「100」,產生最大的色彩飽和度。如果設定為「0」,則遮罩區域將去飽和為黑白。以下是使用不同參數的結果表...

  magick composite -watermark {argument}  -gravity South \
            sphinx.gif  cyclops.gif   {result}
[IM Output] [IM Output]
[IM Output]
輕度浮水印影像的良好「亮度」值約為 15% 到 30%。以下列出特定「-watermark」參數的特殊情況...
0 目標影像完全沒有任何變化。
100 目標在覆疊為黑色的地方變為黑色,在覆疊為白色的地方變為完全飽和的色調。
0x0 遮罩的覆疊區域去飽和為灰階。
100x0 灰階覆疊僅僅是「ATop」覆蓋在目標上方。
如需其他浮水印技巧,請參閱使用影像製作浮水印

使用合成遮罩限制合成區域

magick composite」指令和「-composite」運算子也會採用第三個遮罩影像,該影像將限制受「-compose」方法影響的區域。例如,給定兩個影像和一個「遮罩」影像,您可以根據該遮罩將「來源」影像的一部分覆蓋到「背景」影像上。但請注意,「背景」影像仍然決定了結果影像的最終大小。

  magick composite tile_water.jpg   tile_aqua.jpg  moon_mask.gif   mask_over.jpg
[IM Output] [IM Output] [IM Output] => [IM Output]
遮罩」影像被視為目標影像的一部分,定義了目標的哪些部分可以被 Alpha 合成的結果修改。也就是說,白色部分可以修改,而黑色部分(以及遮罩影像外部的部分)則保持原樣。遺憾的是,雖然「-gravity」和「-geometry」設定允許您重新定位「來源」影像,但「遮罩」影像「不會」重新定位,並且保持與「目標」影像對齊。所以讓我們明確一點...
遮罩與原始背景影像對齊。
任何重力/幾何設定都不會套用於它。
這意味著如果我想重新定位遮罩,我需要使用適當數量的黑色行和列來放大遮罩影像。請參閱拼接,添加像素行和列。例如,以下是一個「magick」版本(來源和背景影像參數已交換),其中遮罩影像已調整,以便相對於背景影像移動。

  magick tile_aqua.jpg   tile_water.jpg \
          \( -background black -splice 10x25+0+0 moon_mask.gif \) \
          -composite   mask_offset.jpg
[IM Output]
請記住,「magick」指令的「-composite」運算子會先指定目標或背景影像。其結果就像給遮罩一個「+10+25」的偏移量,但來源和背景影像都不會移動。如果您想將遮罩與來源影像對齊,最好單獨遮罩來源影像(使用「Copy_Opacity」或其他技巧)。然後,您可以將結果定位到背景上,而不會出現對齊問題。
以下是一個類似的範例,但這次我使用了一個與背景影像大小相同的漸變遮罩,以便將兩個影像混合在一起,產生「淺灘」效果。

  magick tile_aqua.jpg  tile_water.jpg  -size 94x94  gradient: \
          -composite   water_shallows.jpg
[IM Output]
這提供了一種簡單的影像重疊方式。請參閱重疊照片

合成遮罩和透明度

您可能會從上面認為,使用三圖像複合遮罩與使用「Copy_Opacity」設置覆蓋圖像的透明度,然後將其合成到背景上非常相似。對於没有任何透明度的圖像(例如上面的圖像),您是對的。但這還不是全部。首先,遮罩綁定到目標圖像而不是源圖像,因此它不會受到偏移或重力的影響。此外,與「Copy_Opacity」不同,遮罩圖像被視為純灰度圖像。IM 將忽略遮罩可能具有的任何 Alpha 透明度。因此,您*不必*擔心在遮罩圖像中關閉 Alpha 通道。最後,遮罩通過限制被修改的區域來工作,這與僅遮罩源圖像非常不同。對於簡單的「Over」合成,這與將遮罩與源圖像中的任何透明度相乘以限制覆蓋的內容相同。因此,對於完全不透明的源圖像,您可以將其視為源圖像的透明度。例如,正常覆蓋兩個圓圈,然後使用遮罩覆蓋它們,限制目標圖像更改的區域。

  magick -size 60x60 xc:none -fill red  -draw 'circle 35,21 35,3'  m_src.png
  magick -size 60x60 xc:none -fill blue -draw 'circle 21,39 24,57' m_bgnd.png
  magick -size 60x60 xc:   -draw 'polygon 0,59 59,0, 0,0'          m_mask.png

  magick composite m_src.png  m_bgnd.png                   m_over.png
  magick composite m_src.png  m_bgnd.png   m_mask.png      m_over_masked.png
[IM Output] [IM Output] => [IM Output]
[IM Output] [IM Output] [IM Output] => [IM Output]
結果等於紅色圓圈圖像被給定的灰度遮罩“遮罩”,然後覆蓋到目標圖像上。但是,對於任何其他類型的 Alpha 合成方法,您最好將遮罩視為限制效果區域,而不是將其視為源圖像的透明度遮罩。在這裡,我使用「Src」方法用源圖像的內容替換目標圖像中的遮罩區域。

  magick composite  m_src.png  m_bgnd.png  m_mask.png  -compose Src  m_src_masked.png
[IM Output]
如您所見,只有具有定義遮罩的區域實際上被 Alpha 合成的結果替換。如果遮罩僅用於修改源圖像的透明度,則上面只會顯示源圖像,而不會顯示背景圖像中的任何內容。
FUTURE:  Using masked composition to overlay an object in front of a
backdrop, but behind some foreground object.  Also develop an animated example,
of something being obscured by foreground objects in the destination. 
以上是一個主要的長期錯誤,涉及當您涉及具有透明度的源圖像或覆蓋圖像,以及/或嘗試使用「Over」合成方法以外的其他 Alpha 合成時的複合遮罩。有關詳細信息,請參閱複合遮罩錯誤


使用圖像區塊進行合成

magick composite」中的「-tile」設置與「magick」或「magick montage」中的相同設置非常不同。如果給定,則表示*源*圖像將平鋪在*背景*圖像上。例如,在這裡,我們將“彩色星形”平鋪在 Netscape 彩色地圖圖像上...

  magick composite  -tile star.gif   netscape:   tile.gif
[IM Output]
複合平鋪的一種常見用途是在將圖像發佈到網絡上之前,在其上平鋪半透明的版權聲明或其他一些通知。有關此示例,請參閱使用文字添加浮水印的最後幾個示例。請注意,該設置基本上(至少目前)是無參數的。它只是最終「magick composite」操作的布爾開關標誌。因此,您不能使用它來平鋪*背景*圖像,因為這意味著 IM 無法使用背景圖像來設置結果的最終大小。但是,您可以改為使用「Dst_Over」將圖像平鋪在另一個圖像下方。

  magick -background none -pointsize 36 label:'Tile Under'  png:- |\
  magick composite -tile bg.gif  -   -compose Dst_Over   tile_under.gif
[IM Output]
此外,許多數學運算符是關聯的,這意味著源和目標可以交換而不影響結果(最終圖像大小除外)。目前,沒有一種簡單的方法可以在「magick」命令中執行平鋪 Alpha 合成。這很遺憾,因為它會使使用已在記憶體中的圖像進行平鋪比現在容易得多。使用「magick」進行合成平鋪的基本技術是複製原始圖像,並使用平鋪畫布中給出的方法之一對其進行平鋪。例如...

  magick -gravity center -pointsize 32 -font Corsiva \
          label:'Tile White\nBackgrounds' -bordercolor white -border 5 \
          \( -clone 0 -tile tile_aqua.jpg -draw "color 0,0 reset" \) \
          -compose Multiply -composite  tile_convert.gif
[IM Output]
以上操作使用 數學合成 方法 "Multiply" 將標籤的「白色背景」替換為透明。另請參閱 使用影像遮罩、數學合成

特殊合成方法

基於各種原因,還添加了一些特殊用途的合成方法。

數學運算(使用者定義的數學合成方法)

此合成方法採用 4 個數值,允許使用者定義許多不同的 數學合成方法。四個參數 "A"、"B"、"C" 和 "D" 定義了公式...
A*Sc*Dc + B*Sc + C*Dc + D
其中 "Sc" 是來源或覆蓋影像,"Dc" 是背景或目標影像。必須提供所有四個值。例如,我們可以使用值 "1,0,0,0" 生成相當於「Multiply」(乘法)合成方法的效果。

  magick gradient_dst.png gradient_src.png \
          -compose Mathematics -define compose:args='1,0,0,0' -composite \
          mathematics_multiply.png
[IM Output]
來源
 + [IM Output]
目標
=> [IM Output]
結果
同樣地,透過查詢或找出所需的公式,您可以生成其他合成方法,例如... Screen(濾色):1-(1-Sc)*(1-Dc) => -Sc*Dc + Sc + Dc => -1,1,1,0

  magick gradient_dst.png gradient_src.png \
          -compose Mathematics -define compose:args='-1,1,1,0' -composite \
          mathematics_screen.png
[IM Output]
或「LinearLight」(線性光)可以直接使用參數 "0,2,1,-1" 定義...

  magick gradient_dst.png gradient_src.png \
          -compose Mathematics -define compose:args='0,2,1,-1' -composite \
          mathematics_linearlight.png
[IM Output]
同樣地,您可以生成其他合成方法,例如...
 合成方法   數學參數 
Multiply(乘法) 1,0,0,0
螢幕 -1,1,1,0
排除 0,1,1,-1
線性加亮 0,1,1,0
線性加深 0,1,1,-1
線性光 0,2,1,-1
其他合成方法需要使用平方、平方根、除法,甚至多個特殊的分段函數和條件語句,這使得它們無法使用此方法提供的簡單平滑多項式函數來定義。您也可以建立新的合成方法,例如 LinearLight(線性光)的擴展替代方法...

  magick gradient_dst.png gradient_src.png \
          -compose Mathematics -define compose:args='0,1,1,-0.5' \
          -composite  mathematics_linearlight_2.png
[IM Output]
這種特殊的 DIY 合成方法很重要,因為它可以用於 添加偏移漸層,例如正弦波。或者另一個可用於「光照效果」的變體...

  magick gradient_dst.png gradient_src.png \
          -compose Mathematics -define compose:args='0,1,.5,-.25' \
          -composite mathematics_linearlight_3.png
[IM Output]
數學合成方法對於讓您對 漸層進行特殊類型的數學運算 特別重要,否則使用多個單獨步驟將非常複雜。
Mathematics」(數學運算)合成方法已添加到 IM 6.5.4-3 版本中。目前只能使用 "-compose" 運算子使用。由於需要參數,因此無法透過 "magick composite" 命令使用。

Change_Mask(使相似的像素透明)

這是一種不尋常的方法,它只會使目標影像中的特定像素完全透明。也就是說,根據目前的 模糊度 設定,目標影像中與給定來源影像匹配的像素。例如,這可以用於將透明度重新添加到已覆蓋在複雜(但非常不同)背景上的影像。例如,這正是 Jesper Eije 遇到的問題...

  magick overlay_figure.gif   overlay_bgnd.gif  \
          -compose ChangeMask  -composite  overlay_removed.png
[IM Output] [IM Output] => [IM Output]
很簡單。請注意,由於 JPEG 影像顏色通常會因檔案格式的有損特性而產生輕微的顏色變化,因此需要一個小的 模糊度 設定才能匹配非常相似的顏色。此外,如果影像中已更改的部分恰好與背景顏色或圖案匹配,則結果影像或遮罩中將出現「孔洞」,因此在將其用於非常相似的影像時,始終建議您注意這一點。
透過交換兩個影像,將背景影像作為目標影像,您可以提取被覆蓋影像替換或修改的背景部分。

  magick overlay_bgnd.gif  overlay_figure.gif \
          -compose ChangeMask  -composite  overlay_changed.png
[IM Output]
請注意,結果只是原始背景影像的透明形狀遮罩,其中相似的像素僅清除為透明。它不會嘗試生成部分透明度或更改顏色,因此可能會在原始覆蓋和背景顏色合併在一起的影像周圍留下稍微不同的背景顏色的「光暈」。
由於此合成方法僅將像素“清除”為完全透明,因此始終會將 Alpha 色板新增至產生的影像。 但是,目標影像的顏色不會像大多數其他 Alpha 合成方法那樣被清除。 因此,您可以反轉 Alpha 色板以獲得不變的顏色。

  magick overlay_figure.gif overlay_bgnd.gif -compose ChangeMask  -composite \
          -channel A -negate      overlay_unchanged.png
[IM Output]
在這種情況下,輸入影像的順序無關緊要,除非設定了較大的 模糊因子。 請記住,顏色將來自目標影像,影像之間的差異定義了產生的形狀遮罩。 有關這些問題的更多資訊,請參見 背景移除。 結果的直接用途通常受到限制。 但是,它可以用於生成影像之間變化的點陣圖遮罩(因此得名)。
'ChangeMask' 合成方法已新增至 IM v6.3.4,為 優化 GIF 動畫的透明度 提供了一種方法。 沒有其他現有的合成方法可以在不組合 3 種或更多種合成方法的情況下提供所需的要求。 特別是透明度優化所需的布林值(或模糊因子閾值)要求。

但是,結果本身就非常有用,因此使用者可以直接使用它,因此定義了這種相當複雜的合成方法的名稱。

影像映射效果方法

還有一些特殊的方法嚴格來說不是合成方法。 源影像或重疊影像不是逐個像素地直接組合兩個影像,而是一個特殊的控制映射,用於產生一些更大的效果。 雖然它們所代表的方法相對簡單,但它們的使用非常複雜,因此有自己的範例章節。 影像映射效果。 這些特殊方法包括... 'Blur' 方法提供了一種逐個像素地以不同方式模糊影像的方法。 它可以產生範圍廣泛的 DIY 影像模糊效果。 有關詳細資訊,請參見 可變模糊映射 另一方面,'Displace' 方法提供了絕對和相對像素查找位移技術,該技術不僅可以產生特定的影像扭曲方法,還可以產生玻璃、鏡頭和波紋效果。 有關詳細資訊,請參見 扭曲和位移映射