Color Modes

Alpha 合成

此页面描述了用于定义如何在各种图像操作中将两个图像合并在一起的图像合成方法。对于命令行 API,它通常使用 -compose 设置选项来设置。

合成描述使用抽象术语,以便使描述更精确,同时避免特定于特定构建配置的常量值。每个图像像素由红色、绿色和蓝色级别表示(对于灰色像素,这些级别是相等的)。构建相关的 QuantumRange 值是每个像素在图像的红色、绿色或蓝色通道中可以存储的最大整数值。每个图像像素还可以选择性地(如果启用了图像蒙版通道)具有关联的不透明度级别,范围从 opaquetransparent,这可以用来确定合成像素与另一个图像像素时像素颜色的影响。如果禁用了图像蒙版通道,则图像中的所有像素都被视为不透明。不透明像素的颜色完全可见,而透明像素的颜色完全不存在(像素颜色被忽略)。

根据定义,光栅图像具有矩形形状。所有图像行都具有相同的长度,所有图像列也一样。通过将 alpha 通道视为视觉“蒙版”,可以通过将 alpha 通道视为图像的切饼器来赋予矩形图像“形状”。这是通过将形状内的像素设置为不透明,并将形状外的像素设置为透明来完成的。形状边界上的像素可能介于不透明和透明之间,以提供抗锯齿(视觉上平滑的边缘)。合成运算符的描述使用了这种图像“形状”的概念,以便更容易理解运算符的描述。虽然用“形状”来描述运算符很方便,但它们绝不限于蒙版样式的操作,因为它们基于连续浮点数学而不是简单的布尔运算。

以下 alpha 混合(Duff-Porter)合成方法可用

方法 描述
clear 目标的颜色和 alpha 都被清除。源和目标都不使用(除了始终保留的目标大小和其他元数据)。
src 源被复制到目标。目标不用作输入,但会被清除。
dst 目标保持不变。源图像完全被忽略。
src-over 源合成在目标之上。这是默认的 alpha 混合合成方法,当未设置合成设置或未在图像元数据中设置时。
dst-over 目标合成在源之上,结果替换目标。
src-in 位于目标内部的源部分替换目标。
dst-in 位于源内部的目标部分替换目标。未覆盖的区域将被清除。
src-out 位于目标外部的源部分替换目标。
dst-out 位于源外部的目标部分替换目标。
src-atop 位于目标内部的源部分合成到目标上。
dst-atop 位于源内部的目标部分合成在源之上并替换目标。未覆盖的区域将被清除。
xor 位于目标外部的源部分与位于源外部的目标部分组合。源或目标,但不能同时是两者。

任何“Src-*”方法也可以在没有“Src-”部分的情况下指定。例如,默认的合成方法可以指定为“Over”。

许多这些合成方法将清除源图像未覆盖的目标图像。这在特定合成方法定义的一部分中是预期的。您可以通过设置特殊的 -define 'compose:outside-overlay' 为 'false' 来禁用此功能,这将关闭此行为。

除了以上 12 种 Duff-Porter Alpha 合成方法外,还提供了一种特殊的相关方法“Copy”。这相当于使用“Src”和特殊的 -define 选项“compose:outside-overlay”设置为“false”,以便仅修改覆盖区域,而无需清除覆盖区域之外的图像的其余部分。

以下数学合成方法也可用。

方法 描述
multiply 源乘以目标并替换目标。结果颜色始终至少与两个组成颜色一样暗。任何颜色与黑色相乘都会产生黑色。任何颜色与白色相乘都会使原始颜色保持不变。
screen 源和目标取反,然后相乘,然后替换目标。结果颜色始终至少与两个组成颜色一样亮。任何颜色与白色进行屏幕混合都会产生白色。任何颜色与黑色进行屏幕混合都会使原始颜色保持不变。
plus 源添加到目标并替换目标。此运算符对于平均或两个图像的受控合并很有用,而不是直接叠加。
add 与“plus”相同,但透明度数据被视为蒙版值。因此,任一图像中的任何透明区域都将保持透明。
minus 从目标图像中减去源图像中的颜色。当涉及透明度时,不透明区域将从任何目标不透明区域中减去。
subtract 从目标图像中减去源图像中的颜色。当涉及透明度时,透明区域将被减去,因此只有源中的不透明区域在目标图像中保持不透明。
difference 从较亮的两个组成颜色中减去较暗的颜色。用白色绘制会反转目标颜色。用黑色绘制不会产生任何变化。
exclusion 产生类似于“difference”的效果,但对比度较低。用白色绘制会反转目标颜色。用黑色绘制不会产生任何变化。
darken 选择目标和源颜色中较暗的颜色。当源颜色较暗时,目标将替换为源颜色,否则保持不变。
lighten 选择目标和源颜色中较亮的颜色。当源颜色较亮时,目标将替换为源颜色,否则保持不变。
negate “difference”模式的“相反”。请注意,它不是反转的“difference”模式,因为黑色和白色返回相同的结果,但介于两者之间的颜色会变得更亮而不是更暗。
reflect 此模式在将发光物体或光区添加到图像时很有用。公式类似于颜色闪避,但在大多数情况下结果并不那么亮。结果看起来有点像柔光。
freeze 反射模式的另一种变体(基本颜色和混合颜色反转,结果再次反转)。
stamp 此模式在某种程度上类似于平均模式。它有助于将浮雕或凸起纹理应用于图像。
interpolate 此模式在某种程度上结合了乘法和屏幕模式(对于非常暗或非常亮的颜色的外观非常相似)。

通常,当也涉及透明度时,这些使用默认的“Over”alpha 混合,除了“Plus”使用“plus”alpha 混合。这意味着两个图像的 alpha 通道将仅用于确保任何可见的输入即使在未覆盖的部分也保持可见。这也意味着任何值都将根据输入和输出图像的 alpha 通道进行加权。此“Over”alpha 混合也应用于下面的照明合成方法。

数学合成根据 -channel 定义的单个通道基础应用。这包括 alpha 通道。此特殊用法允许您执行图像通道的真正数学运算,而不会涉及 alpha 合成效果。

使用 -define compose:sync=false,上述数学合成将不再与其操作与 alpha 通道同步。而是根据 -channel 定义的单个通道基础应用数学合成。这包括 alpha 通道。此特殊用法允许您执行图像通道的真正数学运算,而不会涉及 alpha 合成效果。

即使这些方法与数学合成方法密切相关,此定义也不会应用于照明合成方法(见下文)。

以下照明合成方法也可用。

方法 描述
linear-dodge 这等效于“Plus”,因为颜色通道只是简单地相加,但它不会“Plus”alpha 通道,而是使用正常的“Over”alpha 混合,其中涉及透明度。产生一种类似于加法乘法的结果。
linear-burn 与“Linear-Dodge”相同,但也会从结果中减去 1。图像的某种加法“Screen”。
color-dodge 使目标颜色变亮以反映源颜色。用黑色绘制不会产生任何变化。
color-burn 使目标颜色变暗以反映源颜色。用白色绘制不会产生任何变化。
overlay 根据目标颜色乘以或屏幕颜色。源颜色覆盖目标,同时保留其高光和阴影。目标颜色不会被替换,而是与源颜色混合以反映目标的亮度或暗度。
hard-light 根据源颜色值乘以或屏幕颜色。如果源颜色亮于 0.5,则目标将变亮,就像它被屏幕化一样。如果源颜色暗于 0.5,则目标将变暗,就像它被乘以一样。变亮或变暗的程度与源颜色与 0.5 之间的差异成正比。如果它等于 0.5,则目标保持不变。用纯黑或白色绘制会产生黑色或白色。
linear-light 像“Hard-Light”一样,但使用线性闪避和线性加深代替。稍微提高对比度,对前景的色调值产生影响。
soft-burn 颜色加深和反向颜色闪避模式的组合,但比两者都平滑得多。基本图像稍微变亮,但非常暗的混合颜色会被“加深”。
soft-dodge 颜色闪避和反向颜色加深模式的组合,但比两者都平滑得多。基本图像稍微变暗,但非常亮的混合颜色会被“闪避”。
soft-light 根据源颜色值使颜色变暗或变亮。如果源颜色亮于 0.5,则目标将变亮。如果源颜色暗于 0.5,则目标将变暗,就像它被加深一样。变暗或变亮的程度与源颜色与 0.5 之间的差异成正比。如果它等于 0.5,则目标保持不变。用纯黑或白色绘制会产生明显更暗或更亮的区域,但不会产生纯黑或白色。
pegtop-light 几乎等效于“Soft-Light”,但使用连续数学公式而不是两个条件选择的公式。
vivid-light

一种经过修改的“线性光”组合模式,旨在保留图像中非常强烈的原色和次色。
针孔光 类似于“强光”,但使用锐利的线性阴影,以模拟强“针孔”光源的效果。

还包括以下特殊用途的合成方法

方法 描述
复制 这等效于 Duff-Porter 合成方法“Src,”,但不会清除未覆盖的目标图像部分。
复制-* 将源图像中指定的通道(红色、绿色、蓝色、青色、洋红色、黄色、黑色或不透明度)复制到目标图像中的同一通道。如果源图像中不存在指定的通道(这只能发生在“copy-opacity”或“copy-black”方法中),则假定源图像是要复制的值的特殊灰度通道图像。
更改蒙版 用透明度替换任何与源图像像素类似的目标像素(由当前的-fuzz因子定义)。
立体 创建立体视差图像

在这些合成方法之上,还有一些特殊的合成方法,不仅需要合并或叠加的两个图像,还需要一些额外的数值参数,这些参数在下表中列出。

在“composite”命令中,这些合成方法使用带有所需参数的特殊选项进行选择。它们通常(但不总是)与它们使用的合成“方法”名称相同,并替换“composite”命令中-compose设置的正常使用方式。例如……

composite ... -blend 50x50 ...  

magick”命令可以接受其-composite操作符的这些额外参数,使用compose:args的特殊-define属性。这意味着您现在可以使用这些特殊的增强型-compose方法,但参数和方法都需要分别设置。例如……

magick ... -compose blend  -define compose:args=50,50 -composite ...  

以下是这些特殊“带参数”合成方法的表格,以及它们功能的简要概述。有关更多详细信息,请参阅等效的“composite”命令选项名称。

方法 描述
溶解 参数:src_percent[xdst_percent]
等效于“composite-dissolve。在覆盖“目标”图像之前,按给定的百分比溶解“源”图像。如果src_percent大于 100,则它开始溶解主图像,因此它将在200的值处变得透明。如果给出两个百分比,则每个图像都将溶解到给定的百分比。
混合 参数:src_percent[xdst_percent]
等效于“composite-blend。根据给定的百分比和每个像素的透明度将图像平均在一起(“加”)。如果只给出一个百分比值,则它设置合成或“源”图像的权重,而背景图像的权重则为完全相反的量。也就是说,-blend 30 将 30% 的“源”图像与 70% 的“目标”图像合并。因此,它等效于-blend 30x70
数学 参数:A, B, C, D
目前在“composite”中不可用。根据以下公式合并源图像和目标图像
    A*Sc*Dc + B*Sc + C*Dc + D
可用于生成自定义合成方法,否则需要使用缓慢的-fx DIY 图像操作符来实现。
调制 参数:brightness[xsaturation]
等效于“composite-watermark。获取灰度图像(带有 Alpha 蒙版),并根据水印图像的灰度值和brightness百分比修改目标图像的亮度。目标的颜色饱和度属性只是由saturation百分比直接修改,默认为 100%(无颜色变化)。
置换 参数:X-scale[xY-scale][!][%]
等效于“composite-displace。使用此选项,'叠加'图像以及可选的'蒙版'图像用作相对位移图,用于置换叠加区域每个点处目标图像的哪些部分可见的查找。就像位移图是扭曲其后面的原始“背景”图像的“透镜”。

X 比例由叠加图像的“红色”通道调制,而 Y 比例由绿色通道调制(如果给出蒙版图像,则将其卷入叠加图像的绿色通道中)。这种分离允许您分别调制 X 和 Y 查找位移,从而允许您进行二维位移,而不是一维矢量位移(使用灰度图像)。

如果叠加图像包含透明度,则将其用作结果图像的蒙版以去除“无效”像素。

“%”标志使位移比例相对于叠加图像的大小(100% = 图像宽度/高度的一半)。使用“!”将百分比参数切换为改为引用目标图像大小。

扭曲 参数:X-scale[xY-scale[+X-center+Y-center]][!][%]
目前在“composite”中不可用。完全按照“置换”(上文)的方式,但使用绝对坐标,相对于叠加的中心(或给定的中心)。基本上允许您生成绝对扭曲图,其中“黑色”将查找左/上边缘,“白色”将根据给定的比例查找目标图像的底部/右边缘。

“!”标志不仅切换百分比缩放以使用目标图像,还切换查找的图像中心偏移。这意味着叠加可以查找目标图像的完全不同区域。

模糊 参数:Width[xHeight[+Angle][+Angle2]]
等效于“composite-blur。一种可变模糊映射合成方法,其中叠加区域中的每个像素都替换为椭圆加权平均值 (EWA),该平均值具有给定 sigma 大小的椭圆(通常为圆形),并根据叠加(源图像)灰度映射进行缩放。

与“置换”和“扭曲”一样,红色通道将调制椭圆的宽度,而绿色通道将调制椭圆的高度。如果在参数中给出一个角度值,则椭圆将按指定角度旋转。

通常,映射叠加图像的蓝色通道会被忽略。但是,如果给出了第二个椭圆角度,则假定蓝色通道定义了从第一个给定角度到第二个给定角度的椭圆的可变角度。这允许生成径向模糊或旋转模糊的粗略近似值。或者两者的任意组合。

无缝混合 参数:max-iterationsxdistortion

将叠加图像无缝插入背景图像中。此运算符需要蒙版。在将前景对象无缝混合到背景图像时,设置最大迭代次数和失真。失真是在每次迭代之间的 RMSE,一个好的起点可能是 300x0.0001。请注意,当启用 HDRI 功能时,无缝混合效果最佳。

显著性混合 参数:max-iterationsxdistortion

将叠加图像与背景图像合并,使得在给定像素处最显著(具有最多细节)的图像将显示在结果中。此运算符需要蒙版。在将前景对象无缝混合到背景图像时,设置最大迭代次数和失真。失真是在每次迭代之间的 RMSE,一个好的起点可能是 300x0.0001。请注意,当启用 HDRI 功能时,无缝混合效果最佳。显著性混合比无缝混合速度稍慢。

要打印所有可用合成运算符的完整列表,请使用-list compose