ImageMagick 示例 --
合成图像

索引
ImageMagick 示例前言和索引
IM 中的图像合成
定位叠加图像
合成方法的原始表格 (单独页面)
Duff-Porter Alpha 合成方法
数学合成方法
照明合成方法(灯光、闪避、加深)
通道复制方法
将一个图像溶解到另一个图像上
将两个图像混合在一起
水印或调制图像
使用蒙版限制合成区域
使用图像图块合成
特殊合成方法
Mathematics,  Change Mask
图像映射合成方法
可变 Blur,   Displace 映射
图像合成是将具有或不具有透明度或 Alpha 通道的图像组合在一起的技术。这通常使用 IM 的“magick composite”命令执行。它也可以作为一系列操作的一部分或由其他图像操作符在内部执行。

IM 中的图像合成

图像合成是将两个(并且只有两个)图像以各种方式合并的过程。它与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” 中,会调整图像序列中最后一个图像的大小。 从技术上讲,这是 图像合成 的一个独立方面。 请参阅 几何形状调整大小使用合成叠加图像。 在 Alpha 合成中,只涉及两个图像,即“源”和“目标”(或“背景”),尽管也可以提供第三个 蒙版图像 来限制合成所影响的区域。

图层画布/页面偏移

叠加图像的合成采用截然不同的理念。 所有图像(数量不限)在给定的顺序中被平等对待。 它们都有一个“-page” 或 页面偏移,它相对于虚拟画布“原点”(默认偏移量)定位每个图像的左上角,但没有重力。 为了处理多个图像,会使用当前的“-background” 颜色生成一个新的背景图像,其大小取决于要执行的操作。 假设这是“目标”图像(画布)。 所有图像都以序列方式一次一个地合成到这个新画布上。 即使只给出两个图像,也会创建一个新图像,并应用两个单独的合成。 也就是说,它可能很慢。 所有图像都被视为“源”图像,它们列出的顺序决定了结果。 但是,“图层”偏移量不受重力影响。 由于每个图像都可以有单独的“画布偏移量”,因此多图像合成最好使用 图像图层运算符 以及 多图像序列合成 来应用动画。 这两种样式是截然不同的定位技术,您需要使用正确的样式来适应您计划使用的合成技术。

两种定位技术

只有一种合成技术,即多图像列表 图层合成 运算符,允许您同时使用两种定位方法。 首先,使用“-geometry” 和“-gravity” 对两个列表进行全局定位,这会应用于每个列表中第一个图像的虚拟画布大小。 然后,使用“-page” 从该全局位置偏移列表中的每个单独图像,以确定最终位置。 当然,如果叠加图像不适合提供的图像中特定目标图像,那么它将被该图像剪切。 因此,通常最好只对目标图像使用完全合并的图像,以达到所需的大小。 当然,之后可以再次修剪结果图像的大小。

Duff-Porter Alpha 合成方法

Duff-Porter 图像合成方法是一组传统的 12 种方法,定义非常明确。 它们被称为 Alpha 合成,因为图像根据图像透明度或“Alpha 通道”的某些方面进行合并。 您可以在 SVG Alpha 合成 文档中找到这些方法的数学定义。 这是一个经典表格,显示了这 12 种方法使用两个三角形图像的结果。
[IM Output]
另请参阅 合成方法的原始表格,其中包含使用不同图像形状和渐变显示更多合成方法的图表。 默认的合成方法(当完全未定义时)是“Over”,这是大多数人在合成图像时通常想要的。 为了理解和记住上述每种合成方法的作用,结果图像将与您所说的一样......
{Source} --{compose_method}--> {background}

也就是说,“ATop” 方法的结果图像相当于“叠加图像“ATop”在背景图像上”。 也就是说,背景图像会保留其“形状”,但源图像的颜色会“叠加”在背景图像上。 但是请记住,使用“magick -composite” 运算符时,图像顺序是相反的。 这 12 种方法不仅定义了结果中哪两个图像“可见”,而且还定义了它如何影响图像未覆盖的图像部分。 也就是说,原始“背景”是否保持原样或完全清除。 我故意将上面表格中的“目标”图像做得更大,以便您可以看到图像的其余部分是否被清除。 这些“清除”方法是:SrcInDst_InOutDst_ATopClear。 从 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 通道,并且可能会使未定义的不可见颜色变得可见。

Over(叠加图像在背景上)

这是默认的合成方法,是每个人在将一个图像叠加到另一个图像上时都会想到的方法。 叠加图像以与“动画单元格”或“顶部透明度”以相同的方式放置在背景图像“之上”,它们可以放置在背景场景或图像上。 它太常见了,我怀疑我真的不需要多说。 因此,让我们提供一个将单个字母图像叠加在背景图像上的示例。

  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]
需要注意的重要一点是,背景的大小会保留,而叠加的位置相对于背景,可以修改,并会被背景剪切。 这就是使此运算符如此重要和有用的原因。 “-tile” 设置的“magick composite” 也使得这种形式的“over”非常有用,因为它是一种在图像下方平铺的方式。 例如,将内置的棋盘图案平铺在我们刚刚创建的阴影字母下方。

  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”,而不是“调整大小”。 原始图像的元数据也保留下来。 也就是说,即使现在是等离子图像,图像元数据仍然表明它是“玫瑰”图像,并且来自“rose:” 图像源。
如果叠加图像小于背景图像,则用透明度替换背景图像的其余部分以填充它。 但是请注意,背景必须具有 alpha 通道,否则它将用黑色(“none”或“transparent”在没有 alpha 通道的情况下具有的颜色)填充额外的空间。

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

Copy(复制或替换图像)

此运算符不是 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”来关闭它。例如,以下等效于Copy 合成方法,但使用更传统的Src 合成方法

  magick rose: hand_point.gif -alpha set -gravity South \
          -define compose:outside-overlay=false \
          -compose Src -composite    compose_copy_src.gif
[IM Output]
有关使用此标志的示例,请参见PageCurl 角部覆盖

外部覆盖与 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 合成操作的一种手段。例如,我们使用Frame 运算符来为我们的玫瑰图像(具有透明背景)加框,但随后使用“-compose Dst”来防止将图像添加到框架中。换句话说,我们只使用玫瑰来设置结果的内部框架的大小。框架,而且只有框架,才是结果。

  magick rose:  -alpha set  -mattecolor Gold  -bordercolor none \
          -compose Dst   -frame 7x7+3+2   compose_frame_dst.gif
[IM Output]
特殊的Alpha Set 操作确保图像中存在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”合成完全相同。只有当背景包含透明度也会裁剪叠加时,它才有所不同。这样做的好处是,可以叠加仅限于目标对象(形状)的照明和阴影效果。
例如,假设我们有一个红色圆圈,并想添加一个高光,就好像它是一个三维球体一样。我们可以创建圆圈和高光,然后使用“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 徽标

Clear(清除背景。忽略覆盖图像)

这是一种不常见的合成方法,它本质上完全忽略覆盖图像,只是清除背景图像。这使其成为创建与背景图像大小相同的透明或黑色画布的理想方法,适用于复杂项目。由于覆盖图像未被使用,因此可以使用单个像素的“null:”图像作为覆盖。

  magick composite -compose Clear null:  rose: -alpha Set compose_clear.png
[IM Output]
当然,Alpha Set 操作(虽然在这种情况下不需要)可以确保目标具有在清除图像到透明度时可以使用的 alpha 通道。如果您明确地关闭 alpha 通道,则由于涉及的数学运算,运算符将清除图像到黑色。

  magick composite -compose Clear null:  rose: -alpha Off compose_black.png
[IM Output]
特殊的Define 设置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]
Source
 + [IM Output]
目标
=> [IM Output]
结果
基本上,如果您使用叠加(源)像素的垂直颜色值和背景(目标)像素的水平颜色值,您可以查找将通过使用这些值应用该运算符而产生的值。在上面的示例中,您将看到“”通常会使图像变暗,并且任何输入图像中的黑色值(0)都会产生黑色结果。这可能非常有用。 [IM Output]

乘  ( )   (使白色对图表/文本透明)

这是更实用的合成方法之一,但被低估了,它只是对两个图像的简单相乘。其公式当然为:  Src*Dest这意味着如果其中一张图像为纯白色,则结果将是另一张图像。另一方面,如果其中一张图像是黑色,则结果将是黑色。在这两个极端之间,一张图像会将目标图像的亮度降低给定量。请注意,“”只会使图像变暗,永远不会使图像变亮。也就是说,它会将图像“衰减”为黑色,这使得这种合成方法成为一种“燃烧”风格的合成。(参见下面的照明合成方法

  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”值的Gamma运算符,或具有“2.0”值的Evaluate PowerOf运算。例如,参见星形生成器,以产生更逼真的星体强度分布。或者它可以在将结果叠加在地理地图上之前用于卫星云图像。 [IM 输出]

屏幕(使黑色对图表/文本透明)

这几乎完全类似于“”,除了在合成之前两个输入图像都被取反,并且最终结果也被取反以将图像恢复正常。从技术上讲,这两种方法是彼此的“对偶”。这使其公式为:  1-(1-Src)*(1-Dest)这意味着如果其中一张图像为纯黑色,则结果将是另一张图像。另一方面,如果其中一张图像是白色,则结果将是白色。在这两个极端之间,一张图像会将目标图像的亮度提高给定量。请注意,“屏幕”合成只会使图像变亮,永远不会变暗。这是一种称为“闪避”的合成风格。(参见下面的照明合成方法)这种合成方法非常适合将白色文本叠加在黑色背景上,然后叠加到其他图像上...

  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 输出]

除、除_Dst、除_Src  ( )   (去除阴影效果)

两个图像相互除。哪个图像除以哪个取决于是否应用“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]
除法的结果是,背景颜色变为白色,而文本的细线仍然清晰,尽管稍微“更细”。如您所见,它比仅仅对其进行归一化要清晰得多,尽管一些抗锯齿也被去除了。可以对除数图像进行一些额外的调整,但它非常接近预期结果。使用更小的模糊可以产生一种生成艺术轮廓图像的替代方法,如给轮廓图像着色中所示。此运算符可以与背景渐变生成器(例如稀疏颜色渐变)结合使用,以生成比简单模糊整个图像更好的背景“除数”图像。
除运算符实际上类似于“颜色闪避”合成方法,但除数图像被取反,并用作源图像。这是 Photoshop 中通常使用的合成,但您可能需要交换取反图像。参见“颜色闪避”以了解等效性。
在 IM v6.6.8-5 之前,只提供了原始的“”方法(等效于更新的“除_Dst”)。
[IM Output]

加  ( )   (将颜色加在一起以形成混合)

将叠加的颜色添加到背景中。本质上是使两个图像均匀地混合在一起。其公式自然为:  Src + Dest 但是请注意,如果添加的颜色超过颜色限制,则颜色将被正常颜色范围限制剪裁。这就是为什么结果渐变图像中的一半图像为纯白色,因为这些值在其最大值处被剪裁。建议注意,以确保结果图像没有被剪裁,如果不想剪裁的话。该运算符具有许多主要用途。将包含单独通道颜色的图像合并在一起,但只有单个通道具有颜色。例如...

  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 标准,“绿色”不是真正的绿色(如 X11 颜色名称中的绿色),而是一种深绿色或半亮绿色。真正的 RGB 绿色可以使用颜色“lime”来指定,如我们在上面的示例中所做的那样。
它还用作数学运算符,将单独的渐变图像加在一起。例如,在计算“曼哈顿”差异图像渐变数学中。“”有时用于将白色文本添加到图像中。这不是正确的使用方法,可能会导致一些抗锯齿不一致。更好的方法是使用“屏幕”合成方法。这使用乘法而不是加法方法来增加亮度。线性闪避合成方法等效于“”,但使用更常见的“覆盖”alpha 混合。

加和加混合

使“”更重要的是,它几乎是唯一实现了不同于“覆盖”混合的混合函数的数学运算符。它不仅“添加”颜色,还“添加”alpha 通道值,并且默认情况下几乎是唯一执行此操作的运算符。这很重要,因为它允许正确地合并互补的蒙版图像。例如,参见Dst 内和外图像的合并。它还允许您使用透明度生成两个图像的加权平均值或混合。如果不是“”这种特殊的混合方法,这些特殊的透明度处理技术通常就不可能实现。
从 IM v6.6.1-6 版本开始,所有数学合成方法都增加了在 Alpha 通道上使用数学运算符的功能,只需从 "-channel" 设置中删除默认的 "Sync" 标志即可(只需指定要应用它的特定通道)。请参见下面的使用图像合成进行图像通道数学运算。这意味着 "Plus" 运算符是唯一不受此功能影响的数学合成方法 运算符,因为它默认情况下已应用。
[IM Output]

Minus、Minus_Dst、Minus_Src  ( )

结果是将一个图像从另一个图像中减去。哪个图像从另一个图像中减去取决于是否应用了 "Minus_Src" 或 "Minus_Dst"。具体来说,"Minus_Dst" 表示 "减去目标图像",或者在 "magick composite" 命令中应用时...... "Minus_Dst" 的公式是   Src - Dest  ,而 "Minus_Src" 的公式是   Dest - Src 由于图像在图像合成和 "magick composite" 命令中通常定义的顺序,原来的方法 "Minus" 意味着......
{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" 通道标志来修改。请参见下面的图像通道数学运算,了解详细信息。 "Linear Burn" 合成方法也可以用于颜色减法,但它通过用户对要减去的图像进行否定来实现。有关更多详细信息,请参见线性叠加合成方法
在 IM v6.6.8-5 版本之前,只提供了原来的 "Minus" 方法(等效于新的 "Minus_Dst")。
[IM Output]

ModulusAdd

"ModulusAdd" 与 "Plus" 很相似,只是当结果超过白色时,它会包裹(模运算)回黑色。例如,如果我们添加两个灰度渐变,最亮的颜色将包裹起来形成第二个渐变。

  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 输出]

ModulusSubtract

"ModulusSubtract" 运算符与 "Minus" 相同,只是它是模运算减法。从 "灰色" 中减去 "白色" 将导致原来的 "灰色",而不是黑色,因为值会环绕回来。模运算减法的一个副作用是,一些部分可能会变成白色而不是黑色,以看似不可控的方式。

  magick composite -compose subtract  compose_plus_RGB.png  compose_R.png \
            compose_subtract.png
[IM Output]
使用 "ModulusAdd" 与 反转图像 一起使用会产生相同的结果。 [IM 输出]

Difference(图像比较,和选择性反转)

生成的图像是在颜色值方面的绝对差值。它的公式是:   abs(Src - Dest) "黑色" 和 "白色" 的差值将产生一个最大的白色结果,而任何相同的颜色将产生黑色。基本上是图像比较的简单形式。这种合成方法最常见的用途是比较两个大小相同的图像,看看它们是如何不同的,甚至产生这些差异的百分比。此运算符通常用于生成 比较差异图像。此运算符也可以用于选择性地反转图像。覆盖黑色不会对背景有任何影响,而覆盖白色则会否定该位置图像中的颜色。换句话说,这个运算符(以及下一个运算符)提供了图像映射的 反转 运算符。
例如,让我们反转一半的玫瑰图像。

  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]

Exclusion(图像差值,排除灰色)

它的公式是:   Src + Dest - 2*Src*Dest 这是一种平均差值。白色与白色将产生黑色(无差异),黑色与黑色也是如此。但是,灰色与灰色将产生灰色结果。白色和黑色自然仍然产生白色(最大差异)。从另一个角度来看,这就像亮图像区域会导致相应另一层的反转。非常暗的区域不会改变任何东西。这样一来,Exclusion 方法就与 "Difference" 相同(见上文)。此运算符的一个用途是乘以 "偏差渐变",例如用于 位移图。这些是渐变,其中 50% 的灰色值被认为是 "零",更暗的颜色表示 "负值",更亮的颜色表示 "正值",值范围为 -1 到 +1。有关详细信息,请参见 乘以偏差渐变。Joe Fry 提交的这种合成方法的另一个用途是将多个差异图像合并在一起的方法。最终图像显示所有图像的变化,而不仅仅是两个图像之间的变化。也就是说,给定图像 A、B 和 C,首先生成 A、B 和 B、C 的差异图像,然后对这些结果使用排除法,这样你就可以得到一个显示所有三个图像变化的图像。这种方法也与 Xor 合成混合运算符处理 Alpha 透明度值的机制密切相关。 [IM 输出] [IM 输出]

Lighten 和 Darken(选择最大/最小值)

比较源图像和目标图像的颜色值,并取相应的较亮或较暗的值。
Lighten 的公式是:     如果 Src > Dest   那么   Src
  否则   Dest
对于较暗,只需反转比较。

"Lighten" 的一个用途是合成原始图像的模糊版本,以便原始图像中的 "高光" 出现柔和的光晕。


  magick flower_sm.jpg \( +clone -blur 0x3 \) \
          -compose Lighten -composite  flower_softglow.jpg
[IM Output] => [IM Output]
请参见 柔化模糊,了解使用 "混合模糊技术" 的更佳方法,以获得类似的结果。
这些运算符通过比较和选择各个 RGB 通道值来工作,因此这会导致一些颜色失真,尤其是在处理图像的主色时。例如,这里我创建了一个红色和蓝色渐变图像,然后使用 lighten 将它们合成在一起。

  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]
由于蓝色通道在红色渐变图像中为零,反之亦然,而 "Lighten" 合成通过颜色值来工作,因此结果只是红色和蓝色图像的简单合并,产生一个红色-蓝色渐变图像。也就是说,以上操作等同于简单的 通道复制合成。防止颜色失真的一种方法是将运算符限制为仅使用 HSL 色彩空间 调整图像的 "亮度" 通道。尽管这并不总是产生良好的结果。
注意,"Gimp"、"Photoshop"、"PhotoLine"、"Paint Shop Pro" 都直接比较通道,就像 IM 一样。

"Photo-Paint" 通过颜色强度比较图像,并使用该结果来决定从哪个图像中选择颜色,从而保留颜色完整性。请参见下面的 Lighten-Intensity 方法

另一方面,"Picture Publisher" 和 "PhotoImpact" 使用颜色亮度(由 HSL 色彩空间定义)进行比较。

有关各种色彩空间中灰度差异的比较,请参见示例 使用色彩空间进行灰度化

[IM Output] [IM Output]

Lighten-Intensity 和 Darken-Intensity(通过强度选择颜色)

从 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”合成方法生成两个集合的“异或”(布尔“异或”)。

  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]
请注意,当应用上述任何“集”或“布尔”合成方法时,可能需要使用“-clamp”来处理 ImageMagick 的 HDRI 版本,以防止生成超出范围的值。

数学合成和 Alpha 混合

您可以使用上述数学合成方法对图像执行数学运算。但是,这有一个主要的注意事项。对于包含透明度的图像,它可能无法按您的预期工作。默认情况下,几乎所有上述数学合成都遵循 SVG 规范定义的约定。 SVG 合成指南 (2009)。这意味着,如果您尝试对具有 alpha 通道(即某种形式的透明度)的图像使用数学合成,您可能无法获得真正的数学合成,而是获得“混合”形式的合成。例如,这里我创建了一些透明度的渐变图像,然后将它们“Multiply”在一起。

  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]
Source
 + [IM Output]
目标
=> [IM Output]
结果
请注意,图像中没有重叠的部分只是简单地包含在结果图像中,原样,无需修改。也就是说,图像被“混合在一起”。更糟糕的是,如果图像包含部分透明度,颜色值将根据 alpha 通道进行“加权”。这对 Plus Composition 有用,它提供“加权颜色相加”或 Blending Operation,但我还没有找到在图像中使用“加权颜色相乘”的任何用途。任何人?如果您正在进行图像数学运算,这种行为通常是不希望的。虽然在进行这种数学运算时,您通常也没有任何 alpha 通道,因此“alpha 混合”和“加权颜色”问题很少出现。
Plus Composition 是唯一一个不进行“超过 alpha 混合”的 Mathematical Compose Method。相反,根据 SVG 规范,它分别添加每个通道。但是,颜色通道在添加之前仍然根据 alpha 值进行加权,只是 alpha 值的处理方式(混合)不同。

这对于提供掩盖形状的正确“相加”至关重要,如 DstOut Composition 中所示。

使用图像合成进行图像通道数学运算

如果您正在使用的图像 Mathematical Compose Methods 只是完全不透明的灰度图像,那么您可以直接在这些图像上使用上述方法,没有任何问题。但是,默认情况下,合成方法将应用于所有颜色通道,并进行 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]
Source
 + [IM Output]
目标
=> [IM Output]
结果
请注意,“Black”与“Black”相乘为“Black”,因此在此示例中颜色不会改变。只有结果透明度会修改。但是,结果肯定不是图像 alpha 通道值的乘积,因为根据 SVG 定义,半透明度使用“over”方法进行混合。这在数学上等效于 alpha 通道的“Screen”合成,而不是乘法。

同步通道标志和数学合成

从 IM v6.6.1-6 开始,“Mathematical Compose Methods”被修改为遵守“-channel”设置的“Sync”标志。该标志实际上意味着“同步颜色和 alpha 通道操作”。默认的“-channel”设置为“RGBK,Sync”。因此,默认情况下,颜色和 Alpha 通道将根据 SVN 规范以“同步”的方式进行适当处理。但是,通过删除“Sync”标志,“Mathematical Compose Methods”将成为“通道运算符”,分别将数学函数应用于每个通道。

  magick alpha_grad_dst.png  alpha_grad_src.png \
          -channel RGBA  -compose Multiply -composite  alpha_grad_nosync.png
[IM Output]
这是一个 alpha 通道的正确乘法。
所有这些只适用于 Mathematical Compose Methods(如上所述)以及特殊的“Mathematics”合成方法(见下文)。它不适用于其他合成方法,例如 Lighting Composition Methods(见下文)。至少目前还没有。“Sync”标志也会影响 Lighten/Darken by Intensity Composition Method(不是 SVG 定义的合成方法)处理 alpha 通道的方式(如上所述)。有关使用图像数学运算的更多信息,请参阅 Mathematics on Gradients。更具体地说,这些示例研究了使用数学合成来生成偏差渐变图像,这更复杂一些。

灯光合成方法-- 光、闪避、加深

这些方法以非常复杂的方式修改图像的颜色,通常用于调整图像的阴影或强度,使某些区域更亮,而其他区域更暗。
灯光合成方法分为三个相关的运算符子类别。
加深”,通常使图像变暗。
闪避”,通常使图像变亮。
”,根据其中一个图像的暗度和亮度使图像同时变暗和变亮。
Multiply”(使颜色变暗)通常被认为是纯“加深”合成操作,而“Screen”(使颜色变亮)是“闪避”合成运算符。通常,其中一个图像将包含颜色图案或照片,而另一个图像将是灰度图像,用于适当的使图像变亮或变暗。哪个图像应该是颜色,哪个应该是灰度,这值得商榷,取决于该方法是如何实现的。在这方面没有标准,因此建议谨慎操作和进行试验。由于这些运算符缺乏标准,许多用户不理解或误用这些运算符。我还没有找到任何关于正确使用这些合成方法的指南,实际上是不存在的,所以我不得不尽力使用下面的例子。 [IM Output]

覆盖(将颜色添加到灰度对象)

这种合成方法非常不寻常,因为它被设计为同时“Multiply”(变暗)和“Screen”(变亮)图像。将哪种方法应用于特定像素由目标图像的值选择,目标图像可以被视为“灯光蒙版”。因此,目标通常是灰度图像,颜色将被添加到其中。
其公式为:     如果 Dest <= 0.5   那么   2*Src*Dest
  否则   1-2*(1-Src)*(1-Dest)
结果是一种特殊的合成方法,它保留了目标图像中存在的任何纯白色和黑色(高光),同时用覆盖图像中找到的颜色对该图像的中调灰色进行着色。也就是说,如果将灰度图像作为目标,该运算符将使用源图像对该背景进行着色,保留目标中存在的任何阴影和高光效果。

  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]
结果
正如您所看到的,渐变图像的中调灰色用图像提供的颜色进行了着色。这是这种合成方法的正常用法,将颜色添加到灰度灯光蒙版中。这种方法与“Multiply”或“Screen”不同,它不是可结合的。

  magick gradient_yell-blue.jpg  gradient_grey.jpg \
          -compose Overlay   -composite   compose_overlay_gradients2.jpg
[IM Output]
目标
 + [IM Output]
覆盖
=> [IM Output]
结果
这种将“颜色覆盖”到具有灰色高光的图像中,使这种方法非常适合将颜色添加到“-shade”运算符的输出中。但是,您需要非常小心地从该运算符中生成完美的中间调灰色,才能在没有高光的区域获得正确的着色。有关详细信息,请参阅 Shade Overlay Highlights。例如,给定一个圆形,我们可以对其进行阴影处理以产生 3 维效果,然后用原始图像对其结果进行着色以恢复原始颜色。

  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]
结果
有关使用“Overlay”方法的更实际的示例,请参阅 Background Generator Examples 页面上的“levels_3d”图像。这种合成方法最大的问题是,任何图像中的透明度都不会被保留。也就是说,在任何图像中可见的内容都会在结果中可见。通常,该运算符用于不包含透明度的图像,这意味着您可能需要做一些额外的步骤来恢复目标或背景图像的透明度。一种保留透明度的简单方法是简单地 关闭目标图像的 Alpha 通道,从而使其不可访问。当合成完成后,您可以 再次打开它。这在 Shaded Shape Images 中有一个示例。另一种方法是保存一个“蒙版”,或原始图像的副本,然后使用该蒙版或图像来恢复透明度。这在 Overlay Color Tinting 中有一些示例。或者在更复杂的示例 Better 3-D Logo Generation 中。
直到 IM 版本 6.1.6,“叠加”合成方法一直存在问题,它只会产生纯黑色或白色结果(很可能你只会得到纯黑色结果)。因此,大多数 IM 用户很难理解这个运算符。现在这个问题已经解决,用户现在可以很好地使用这个方法了。
[IM Output]

强光(为图像添加纹理或高光/阴影)

这与“叠加”相同,只是源图像和目标图像交换了。如果你比较这两个运算符的渐变图像,你会发现渐变是沿对角线转置的,这表明源和目标输入被交换了。
其公式为:     如果 Src <= 0.5   那么   2*Src*Dest
  否则   1-2*(1-Src)*(1-Dest)
因此,虽然“叠加”可以为灰度阴影物体添加颜色,但“强光”可以为图像添加灰度照明效果。你使用哪种方法取决于你对添加图像照明效果的思考方式。重要的区别是哪张图像是“目标”图像,以便保留图像元数据,或者甚至暂时 禁用 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 中实现的方法相同,基本上是对“线性光”方法的细微改进。它所做的是避免对极端情况进行阴影处理,以便使图像中的强主要颜色更加“鲜明”。
其公式为:     如果 Src <= 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 混合。有关详细信息,请参阅 加混合
线性闪避”合成方法已添加到 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 通道,而更 数学合成方法 可以。
线性加深”合成方法已添加到 IM 版本 6.5.4-3 中。
[IM Output]

颜色加深(Photoshop 除法)

这种合成方法使用源叠加图像作为蒙版,它在一定程度上保护了背景图像免受长时间的“光照”。暴露在较浅蒙版下的部分会变亮(或躲避),而黑色区域则不会发生变化。您可以将其想象成将一个物体长时间放在照片上面,导致暴露在光线下的部分随着时间的推移而慢慢变白,而被遮挡的部分则保持原样。纯黑色叠加不会改变图像,而纯白色叠加将使所有背景颜色变为白色,除了那些原本就是纯黑色的颜色。但是,与“Screen”(反向相乘)或“Linear_Dodge”(加法)躲避合成方法不同,纯黑色或全白色目标图像不会受到光照蒙版的影响。换句话说,只有包含灰色和非纯色的区域才会受到影响。其公式为:Dest / (1-Src) 此处需要示例和实际应用事实上,“ColorDodge”和两个“Divide”运算符可以产生相同的结果。“ColorDodge”但是,它需要将用作“除数”的图像取反并用作运算符的“源”图像。例如,所有这些对图像“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
参见“Divide”,了解如何将图像除法用于去除背景渐变。 [IM 输出]

Color_Burn

这是“Color_Dodge”的反向,相当于反转所有输入和输出图像。结果是背景图像被深色蒙版图像变暗,而白色则不会变暗。但是,与“Multiply”或“Linear_Burn”燃烧合成方法不同,纯黑色或全白色目标图像不会受到光照蒙版的影响。换句话说,只有包含灰色和非纯色的区域才会受到影响。其公式为:1 - ( (1-Dest) / Src) 此处需要示例和实际应用此命令等同于之前的一组公式来实现图像除法。注意命令中的最终否定。

  magick N -negate D   -compose ColorBurn -composite  -negate  R
Color_Burn”的一种用途是将深色渐变背景清理为纯黑色。就像“Color_Dodge”可以将背景除以白色一样。
在 IM v6.5.4-3 之前,“Color_Burn”被证明是实现不正确的。

通道复制方法

这些图像合成方法旨在将图像通道信息从一个图像传输到另一个图像。但是,它对从其复制“通道”的图像进行了一些假设。我建议您阅读 图像颜色空间颜色通道运算符 了解 IM 如何在内存中表示图像颜色通道,然后再使用它们。最有用的通道复制合成方法是“Copy_Opacity”(见下文)。它是使用单独的灰度蒙版图像完全替换(或添加)现有图像的 alpha 通道的最简单方法。

Copy_Opacity(从灰度蒙版设置透明度)

Copy_Opacity”运算符的最初目的是将源图像的透明度通道复制到目标图像中,以设置该图像的透明部分。这通常使用 Duff-Porter 运算符来完成,这些运算符专门设计用于合成具有 alpha 透明度的图像。例如,如果目标是完全不透明的,这在该运算符的典型使用中很常见,那么“Dst_In”甚至“Dst_ATop”运算符都将实现相同的结果。那么,当存在替代方案时,“Copy_Opacity”运算符为何如此重要?答案在于该运算符如何处理特殊情况。当叠加(源)图像没有 alpha 通道时,该运算符将将其视为简单的灰度图像蒙版。也就是说,它将用给定的灰度图像替换图像的任何现有 alpha 通道。总之,灰度图像中为黑色的任何部分都被认为是完全透明的,白色是完全不透明的。这非常重要,而且非常常用,我将把它作为经验法则…
使用该运算符的图像不应包含任何 alpha 通道。
您可以通过在使用“Copy_Opacity”合成设置进行合成之前,在两个输入图像上关闭 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”通道图像复制到目标图像的黑色通道(假设它存在)。

Hue(将 RGB 图像的色相复制到目标)

该运算符将源图像的色相 H 复制以替换目标图像的色相,同时保持背景的饱和度 S 和亮度 L(或者说是亮度 Y 吗?)不变。假设两个图像都处于 RGB 颜色空间图像中。我还没有在非 RGB 颜色空间图像中测试过它。

Saturate(将 RGB 图像的饱和度复制到目标)

将饱和度 S 从源复制到目标(假设图像为 RGB 颜色空间图像),保持颜色色相 H 和亮度 L(或者说是亮度 Y 吗?)不变。假设两个图像都处于 RGB 颜色空间图像中。我还没有在非 RGB 颜色空间图像中测试过它。

Luminize(将 RGB 图像的亮度复制到目标)

将亮度 L(或者说是亮度 Y 吗?)从源复制到目标,保持颜色色相 H 和饱和度 S 不变。假设两个图像都使用 RGB 颜色空间存储。我还没有在非 RGB 颜色空间图像中测试过它。

Colorize(将颜色色相和饱和度复制到目标)

将色相 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”将允许您以相同的方式缓慢地用一个图像替换另一个图像,而不会叠加。如果您将混合的结果叠加在一个黑色画布上(例如您的显示器的尺寸),您可以轻松地制作一个体面的幻灯片程序,其中一个图像缓慢地溶解成另一个图像。您还可以看到,由于图像加在一起(在内部使用“`Plus”合成运算符),您可以轻松地超载颜色通道最大值,从而产生一些伪像。特别是 100% 的白色将确保其他图像的任何内容都不可见,因为所有颜色通道都已达到其最大值。建议在大多数情况下,您只需要使用单参数版本的混合。
与“`-dissolve”一样,“`-blend”需要背景图像包含一个 alpha 通道才能正常工作,以便溶解背景图像。

因此,在应用“`Blend”合成之前,告诉 IM 在所有图像上 设置 Alpha 通道 可能是一个好主意。

以下是特定“`-blend”参数的特殊情况...
0x0 两个图像都被溶解成完全透明。
等效于“`Clear”合成方法。
0 仅背景图像保持不变。
等效于“`Dst”合成方法。
100 叠加图像在空白画布上。
等效于“`Src”合成方法。
100x100 仅将两个图像加在一起。
等效于“`Plus”合成方法。
50 两个图像的平均值。这等效于“`-evaluate-sequence mean”图像序列运算符,但有两个图像。(另见 图像平均

混合与溶解

虽然溶解和混合都会使图像半透明,但“`-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]
溶解
[IM Output]
混合
请注意,即使“龙”背景的非重叠部分在 混合 的图像中是半透明的,但星星区域在两者中都是完全不透明的,并且包含相同颜色的结果!也就是说,对于两个图像都完全不透明的区域,并且您允许 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]
溶解
[IM Output]
混合
如果您要比较这两个图像,您会发现它们完全相同。总之,溶解(仅叠加图像给定一定百分比的透明度)与混合(两个图像的加权加法,每个图像都有相应的百分比)对于任何完全不透明的图像都产生相同的结果。只有当一个或两个图像包含透明度时,两种方法才有所不同。

使用混合修改单个图像

混合基本上是一个“插值函数”或“加权平均值”,允许您以受控的线性方式组合两个完全不透明的图像。也就是说,源图像的 30% 加上背景的 70%,产生一个新的 100% 不透明的图像。但是,它不仅可以组合两个图像。它还可以用于使特定图像变亮、设置对比度、饱和度、着色甚至锐化。这种混合的使用方式将在 BugBear <[email protected]> 在 WWW 上找到的一份文档中进一步讨论,通过插值和外推进行图像处理,该文档是 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%
混合合成方法 的任何使用一样,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 合成时。有关详细信息,请参阅 合成蒙版错误


使用图像图块合成

-tile”设置在“magick composite”中与“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]
Source
 + [IM Output]
目标
=> [IM Output]
结果
类似地,通过查找或找出所需的公式,您可以生成其他合成方法,例如... Screen1-(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
Exclusion 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”方法提供了一种绝对和相对像素查找位移技术,它不仅可以生成特定的图像失真方法,还可以生成玻璃、透镜和波纹效果。有关详细信息,请参阅 失真和位移映射