- 所有已实现的接口:
-
Composite
AlphaComposite类实现了基本的alpha混合规则,用于将源颜色和目标颜色组合以实现图形和图像的混合和透明效果。该类实现的具体规则是T. Porter和T. Duff在"Compositing Digital Images"(SIGGRAPH 84,253-259)中描述的基本12个规则集。本文档的其余部分假定读者对该论文中概述的定义和概念有一定了解。
该类扩展了由Porter和Duff定义的标准方程,以包括一个额外因子。 AlphaComposite类的实例可以包含一个alpha值,用于修改每个源像素的不透明度或覆盖度,然后再将其用于混合方程中。
需要注意的是,Porter和Duff论文中定义的方程都是针对其对应alpha分量进行预乘的颜色分量操作的。由于ColorModel和Raster类允许以预乘或非预乘形式存储像素数据,因此在应用方程之前,所有输入数据必须被规范化为预乘形式,并且所有结果可能需要在存储像素值之前调整为目标所需的形式。
还要注意,该类仅在纯数学意义上定义了组合颜色和alpha值的方程。其方程的准确应用取决于从源检索数据和存储在目标中的方式。有关更多信息,请参阅实现注意事项。
Porter和Duff论文中用于描述混合方程的以下因素:
| 因素 | 定义 |
|---|---|
| As | 源像素的alpha分量 |
| Cs | 源像素的颜色分量(预乘形式) |
| Ad | 目标像素的alpha分量 |
| Cd | 目标像素的颜色分量(预乘形式) |
| Fs | 贡献到输出的源像素的分数 |
| Fd | 贡献到输出的目标像素的分数 |
| Ar | 结果的alpha分量 |
| Cr | 结果的颜色分量(预乘形式) |
使用这些因素,Porter和Duff定义了12种选择混合因子 Fs 和 Fd 以产生12种理想视觉效果的方式。确定 Fs 和 Fd 的方程在指定视觉效果的12个静态字段的描述中给出。例如,SRC_OVER的描述指定 Fs = 1 和 Fd = (1-As)。一旦确定了用于确定混合因子的方程集,就可以将它们应用于每个像素以使用以下一组方程产生结果:
Fs = f(Ad)
Fd = f(As)
Ar = As*Fs + Ad*Fd
Cr = Cs*Fs + Cd*Fd
以下因素将用于讨论我们对Porter和Duff论文中混合方程的扩展:
| 因素 | 定义 |
|---|---|
| Csr | 源像素的原始颜色分量之一 |
| Cdr | 目标像素的原始颜色分量之一 |
| Aac | 来自AlphaComposite实例的“额外”alpha分量 |
| Asr | 源像素的原始alpha分量 |
| Adr | 目标像素的原始alpha分量 |
| Adf | 存储在目标中的最终alpha分量 |
| Cdf | 存储在目标中的最终原始颜色分量 |
准备输入
AlphaComposite类定义了一个应用于源alpha的额外alpha值。这个值被应用,就好像首先将源像素根据AlphaComposite中的alpha与指定alpha的像素进行隐式SRC_IN规则的乘法运算,这导致产生用于Porter和Duff混合方程的alpha的以下方程:
As = Asr * Aac所有原始源颜色分量都需要乘以
AlphaComposite实例中的alpha。此外,如果源不是预乘形式,则颜色分量也需要乘以源alpha。因此,用于生成Porter和Duff方程的源颜色分量的方程取决于源像素是否为预乘形式:
Cs = Csr * Asr * Aac (如果源不是预乘形式)
Cs = Csr * Aac (如果源是预乘形式) 目标alpha无需进行调整:
Ad = Adr
只有目标颜色分量需要进行调整,如果它们不是预乘形式:
Cd = Cdr * Ad (如果目标不是预乘形式)
Cd = Cdr (如果目标是预乘形式)
应用混合方程
调整后的 As、Ad、Cs 和 Cd 被用于标准的Porter和Duff方程来计算混合因子 Fs 和 Fd,然后得到结果的预乘分量 Ar 和 Cr。
准备结果
只有当结果需要存储回一个不是预乘形式的目标缓冲区时才需要进行调整,使用以下方程:
Adf = Ar
Cdf = Cr (如果目标是预乘形式)
Cdf = Cr / Ar (如果目标不是预乘形式) 请注意,如果结果的alpha为零,则除法是未定义的,因此在这种情况下省略除法以避免“除以零”,并且颜色分量保持全为零。
性能注意事项
出于性能原因,最好将传递给AlphaComposite类创建的CompositeContext对象的compose方法的Raster对象具有预乘数据。但是,如果源Raster或目标Raster不是预乘的,则在混合操作之前和之后执行适当的转换。
实现注意事项
- 许多来源,例如
BufferedImage类中列出的一些不透明图像类型,不存储其像素的alpha值。这些来源为它们的所有像素提供了alpha值为1.0。 - 许多目标也没有地方存储由该类执行的混合计算产生的alpha值。因此,这些目标隐式丢弃该类产生的结果alpha值。建议这些目标应将它们存储的颜色值视为非预乘,并在存储颜色值并丢弃alpha值之前,将结果颜色值除以结果alpha值。
- 结果的准确性取决于目标中像素存储的方式。提供每种颜色和alpha分量至少8位存储的图像格式至少适用于用作少量到十几个混合操作序列的目标。每个分量存储少于8位的图像格式在支配结果之前仅适用于一个或两个混合操作。不单独存储颜色分量的图像格式不适合任何类型的半透明混合。例如,不应将
BufferedImage.TYPE_BYTE_INDEXED用作混合操作的目标,因为每个操作都可能引入大误差,这是由于需要选择与混合方程结果匹配的有限调色板中的像素。 - 几乎所有格式都将像素存储为离散整数,而不是参考方程中使用的浮点值。实现可以将整数像素值缩放为范围在0.0到1.0的浮点值,也可以使用在整数域中完全运行的略微修改的方程版本,但产生类似于参考方程的结果。
通常,整数值与浮点值相关联,其中整数0等于浮点值0.0,整数2^n-1(其中n是表示中的位数)等于1.0。对于8位表示,这意味着0x00表示0.0,0xff表示1.0。
- 内部实现可以近似一些方程,并且还可以消除一些步骤以避免不必要的操作。例如,考虑一个使用每个分量存储8位的非预乘alpha值的离散整数图像。几乎透明变暗的红色的存储值可能是:
(A, R, G, B) = (0x01, 0xb0, 0x00, 0x00)
如果正在使用整数数学,并且该值在没有额外alpha的情况下以
SRC模式进行合成,则数学指示结果为(以整数格式):(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
请注意,中间值始终以预乘形式存在,这只允许整数红色分量为0x00或0x01。当我们尝试将此结果存储回一个非预乘的目标时,除以alpha将为非预乘的红色值提供非常少的选择。在这种情况下,如果在整数空间中执行数学运算的实现不使用快捷方式,则最终像素值可能为:
(A, R, G, B) = (0x01, 0xff, 0x00, 0x00)
(请注意,0x01除以0x01会得到1.0,这相当于8位存储格式中的值0xff。)
或者,使用浮点数学的实现可能会产生更准确的结果,并最终以很少或没有舍入误差返回到原始像素值。或者,使用整数数学的实现可能会决定,由于方程在浮点空间中执行时归结为对颜色值的虚拟NOP,因此可以将像素不受影响地传输到目标并完全避免所有数学运算。
这些实现都试图遵守相同的方程,但使用整数和浮点数学以及简化或完整方程的不同权衡。为了考虑这种差异,最好只期望结果的预乘形式在实现和图像格式之间匹配。在这种情况下,以预乘形式表达的两个答案将等同于:
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
因此它们将全部匹配。
- 由于简化方程以提高计算效率的技术,一些实现在遇到非预乘目标上的结果alpha值为0.0时可能会表现不同。请注意,在SRC规则的情况下删除除以alpha的简化在技术上是无效的,如果分母(alpha)为0。但是,由于只有在预乘形式下查看时才应期望结果准确,因此结果alpha为0基本上使结果颜色分量无关紧要,因此在这种情况下不应期望确切的行为。
- 参见:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final AlphaComposite实现不透明CLEAR规则且alpha为1.0f的AlphaComposite对象。static final int目标的颜色和alpha都被清除(Porter-Duff Clear规则)。static final AlphaComposite实现不透明DST规则且alpha为1.0f的AlphaComposite对象。static final int目标保持不变(Porter-Duff Destination规则)。static final int目标中位于源内部的部分与源进行合成,并替换目标(Porter-Duff Destination Atop Source规则)。static final int目标中位于源内部的部分替换目标(Porter-Duff Destination In Source规则)。static final int源外部的部分替换目标(Porter-Duff Destination Held Out By Source规则)。static final int目标覆盖源并将结果替换目标(Porter-Duff Destination Over Source规则)。static final AlphaComposite实现不透明DST_ATOP规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明DST_IN规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明DST_OUT规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明DST_OVER规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明SRC规则且alpha为1.0f的AlphaComposite对象。static final int源被复制到目标(Porter-Duff Source规则)。static final int源内部位于目标内部的部分被合成到目标上(Porter-Duff Source Atop Destination规则)。static final int源内部位于目标内部的部分替换目标(Porter-Duff Source In Destination规则)。static final int源外部的部分替换目标(Porter-Duff Source Held Out By Destination规则)。static final int源覆盖目标(Porter-Duff Source Over Destination规则)。static final AlphaComposite实现不透明SRC_ATOP规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明SRC_IN规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明SRC_OUT规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明SRC_OVER规则且alpha为1.0f的AlphaComposite对象。static final AlphaComposite实现不透明XOR规则且alpha为1.0f的AlphaComposite对象。static final int源中位于目标外部的部分与目标中位于源外部的部分组合(Porter-Duff Source Xor Destination规则)。 -
Method Summary
Modifier and TypeMethodDescriptioncreateContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) 为合成操作创建上下文。derive(float alpha) 返回使用指定alpha值的类似AlphaComposite对象。derive(int rule) 返回使用指定合成规则的类似AlphaComposite对象。boolean确定指定对象是否等于此AlphaComposite。floatgetAlpha()返回此AlphaComposite的alpha值。static AlphaCompositegetInstance(int rule) 使用指定规则创建一个AlphaComposite对象。static AlphaCompositegetInstance(int rule, float alpha) 使用指定规则和要乘以源alpha的常量alpha创建一个AlphaComposite对象。intgetRule()返回此AlphaComposite的合成规则。inthashCode()返回此合成的哈希码。
-
Field Details
-
CLEAR
目标的颜色和alpha都被清除(Porter-Duff Clear规则)。 源和目标都不作为输入。Fs = 0 且 Fd = 0,因此:
Ar = 0 Cr = 0
- 参见:
-
SRC
源被复制到目标(Porter-Duff Source规则)。 目标不作为输入。Fs = 1 且 Fd = 0,因此:
Ar = As Cr = Cs
- 参见:
-
DST
目标保持不变(Porter-Duff Destination规则)。Fs = 0 且 Fd = 1,因此:
Ar = Ad Cr = Cd
- 自1.4起:
- 1.4
- 参见:
-
SRC_OVER
源覆盖目标(Porter-Duff Source Over Destination规则)。Fs = 1 且 Fd = (1-As),因此:
Ar = As + Ad*(1-As) Cr = Cs + Cd*(1-As)
- 参见:
-
DST_OVER
目标覆盖源并将结果替换目标(Porter-Duff Destination Over Source规则)。Fs = (1-Ad) 且 Fd = 1,因此:
Ar = As*(1-Ad) + Ad Cr = Cs*(1-Ad) + Cd
- 参见:
-
SRC_IN
源内部位于目标内部的部分替换目标(Porter-Duff Source In Destination规则)。Fs = Ad 且 Fd = 0,因此:
Ar = As*Ad Cr = Cs*Ad
- 参见:
-
DST_IN
目标内部位于源内部的部分替换目标(Porter-Duff Destination In Source规则)。Fs = 0 且 Fd = As,因此:
Ar = Ad*As Cr = Cd*As
- 参见:
-
SRC_OUT
源外部的部分替换目标(Porter-Duff Source Held Out By Destination规则)。Fs = (1-Ad) 且 Fd = 0,因此:
Ar = As*(1-Ad) Cr = Cs*(1-Ad)
- 参见:
-
DST_OUT
目标外部的部分替换目标(Porter-Duff Destination Held Out By Source规则)。Fs = 0 且 Fd = (1-As),因此:
Ar = Ad*(1-As) Cr = Cd*(1-As)
- 参见:
-
SRC_ATOP
源内部位于目标内部的部分被合成到目标上(Porter-Duff Source Atop Destination规则)。Fs = Ad 且 Fd = (1-As),因此:
Ar = As*Ad + Ad*(1-As) = Ad Cr = Cs*Ad + Cd*(1-As)
- 自1.4起:
- 1.4
- 参见:
-
DST_ATOP
目标内部位于源内部的部分被合成到源上并替换目标(Porter-Duff Destination Atop Source规则)。Fs = (1-Ad) 且 Fd = As,因此:
Ar = As*(1-Ad) + Ad*As = As Cr = Cs*(1-Ad) + Cd*As
- 自1.4起:
- 1.4
- 参见:
-
XOR
源的部分与目标之外的部分结合,与目标的部分与源之外的部分结合(Porter-Duff源异或目标规则)。Fs = (1-Ad) 和 Fd = (1-As),因此:
Ar = As*(1-Ad) + Ad*(1-As) Cr = Cs*(1-Ad) + Cd*(1-As)
- 由于:
- 1.4
- 另请参见:
-
Clear
实现不透明CLEAR规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
Src
实现不透明SRC规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
Dst
实现不透明DST规则且alpha为1.0f的AlphaComposite对象。- 由于:
- 1.4
- 另请参见:
-
SrcOver
实现不透明SRC_OVER规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
DstOver
实现不透明DST_OVER规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
SrcIn
实现不透明SRC_IN规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
DstIn
实现不透明DST_IN规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
SrcOut
实现不透明SRC_OUT规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
DstOut
实现不透明DST_OUT规则且alpha为1.0f的AlphaComposite对象。- 另请参见:
-
SrcAtop
实现不透明SRC_ATOP规则且alpha为1.0f的AlphaComposite对象。- 由于:
- 1.4
- 另请参见:
-
DstAtop
实现不透明DST_ATOP规则且alpha为1.0f的AlphaComposite对象。- 由于:
- 1.4
- 另请参见:
-
Xor
实现不透明XOR规则且alpha为1.0f的AlphaComposite对象。- 由于:
- 1.4
- 另请参见:
-
-
Method Details
-
getInstance
使用指定规则创建一个AlphaComposite对象。 -
getInstance
使用指定规则和常量alpha值创建一个AlphaComposite对象。在与目标合成之前,源将与指定的alpha值相乘。 -
createContext
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) 创建一个合成操作的上下文。上下文包含在执行合成操作中使用的状态。- 由以下指定:
-
createContext在接口Composite - 参数:
-
srcColorModel- 源的ColorModel -
dstColorModel- 目标的ColorModel -
hints- 上下文对象用于在渲染替代方案之间进行选择的提示 - 返回:
-
用于执行合成操作的
CompositeContext对象。
-
getAlpha
public float getAlpha()返回此AlphaComposite的alpha值。如果此AlphaComposite没有alpha值,则返回1.0。- 返回:
-
此
AlphaComposite的alpha值。
-
getRule
public int getRule()返回此AlphaComposite的合成规则。- 返回:
-
此
AlphaComposite的合成规则。
-
derive
返回一个类似的AlphaComposite对象,该对象使用指定的合成规则。如果此对象已经使用指定的合成规则,则返回此对象。 -
derive
返回一个类似的AlphaComposite对象,该对象使用指定的alpha值。如果此对象已经具有指定的alpha值,则返回此对象。- 参数:
-
alpha- 与源的alpha相乘的常量alpha值。alpha必须是闭区间[0.0,1.0]内的浮点数。 - 返回:
-
从此对象派生的使用指定alpha值的
AlphaComposite对象。 - 抛出:
-
IllegalArgumentException- 如果alpha小于0.0或大于1.0 - 由于:
- 1.6
-
hashCode
public int hashCode()返回此合成的哈希码。 -
equals
确定指定对象是否等于此AlphaComposite。结果为
true当且仅当参数不为null且为具有与此对象相同的合成规则和alpha值的AlphaComposite对象。
-