- 所有已实现的接口:
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 值。通过将原始源 alpha 和原始源颜色乘以 AlphaComposite 中的 alpha,此值的应用就好像隐式 SRC_IN 规则首先应用于具有指示 alpha 的像素的源像素。这导致以下等式用于生成 Porter 和 Duff 混合等式中使用的 alpha:
As = Asr * Aac所有原始源颜色组件都需要乘以
AlphaComposite 实例中的 alpha。此外,如果源不是预乘形式,则颜色组件也需要与源 alpha 相乘。因此,为 Porter 和 Duff 方程生成源颜色组件的方程取决于源像素是否预乘:
Cs = Csr * Asr * Aac (if source is not premultiplied) Cs = Csr * Aac (if source is premultiplied)无需对目标 alpha 进行调整:
Ad = Adr
仅当目标颜色组件不是预乘形式时才需要调整它们:
Cd = Cdr * Ad (if destination is not premultiplied) Cd = Cdr (if destination is premultiplied)
应用混合方程
调整后的 As 、 Ad 、 Cs 和 Cd 用于标准波特和达夫方程中以计算混合因子 Fs 和 Fd ,然后得到预乘组件 Ar 和 Cr 。
准备结果
如果要将结果存储回包含未预乘数据的目标缓冲区,则只需要使用以下等式调整结果:
Adf = Ar Cdf = Cr (if dest is premultiplied) Cdf = Cr / Ar (if dest is not premultiplied)请注意,如果生成的 alpha 为零,则除法是未定义的,因此省略这种情况下的除法以避免“被零除”,并且颜色组件保留为全零。
性能注意事项
出于性能原因,传递给由 AlphaComposite 类创建的 CompositeContext 对象的 compose 方法的 Raster 对象最好具有预乘数据。但是,如果源 Raster 或目标 Raster 未预乘,则在合成操作之前和之后执行适当的转换。
实现注意事项
- 许多来源,例如
BufferedImage类中列出的一些不透明图像类型,不存储其像素的 alpha 值。这些源为其所有像素提供 1.0 的 alpha。 - 许多目的地也没有地方存储由此类执行的混合计算产生的 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。
- 内部实现可以近似一些方程式,也可以去掉一些步骤,避免不必要的操作。例如,考虑一个具有非预乘 alpha 值的离散整数图像,每个组件使用 8 位进行存储。几乎透明的暗红色的存储值可能是:
(A, R, G, B) = (0x01, 0xb0, 0x00, 0x00)
如果正在使用整数数学并且这个值在
SRC模式下合成而没有额外的 alpha,那么数学将表明结果是(整数格式):(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)
因此它们都会匹配。
- 由于简化计算效率方程式的技术,当在非预乘目标上遇到 0.0 的结果 alpha 值时,某些实现可能会执行不同的操作。请注意,如果分母 (alpha) 为 0,则在 SRC 规则的情况下,删除除以 alpha 的简化在技术上是无效的。但是,由于只有在以预乘形式查看结果时才应预期结果是准确的,因此结果0 的 alpha 本质上使生成的颜色组件变得无关紧要,因此不应预期在这种情况下会出现确切的行为。
- 参见:
-
字段摘要
字段修饰符和类型Field描述static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 CLEAR 规则。static final int目标的颜色和 alpha 都被清除(Porter-Duff Clear 规则)。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST 规则。static final int目的地保持不变(Porter-Duff 目的地规则)。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 AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_ATOP 规则。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_IN 规则。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_OUT 规则。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_OVER 规则。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 SRC 规则。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 AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 SRC_ATOP 规则。static final AlphaCompositeAlphaComposite对象实现了 alpha 为 1.0f 的不透明 SRC_IN 规则。static final AlphaCompositeAlphaComposite对象实现了 alpha 为 1.0f 的不透明 SRC_OUT 规则。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 SRC_OVER 规则。static final AlphaCompositeAlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 XOR 规则。static final int位于目标之外的源部分与位于源之外的目标部分组合(Porter-Duff Source Xor Destination 规则)。 -
方法总结
修饰符和类型方法描述createContext(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 的AlphaComposite对象以与源的 alpha 相乘。intgetRule()返回此AlphaComposite的合成规则。inthashCode()返回此组合的哈希码。
-
字段详细信息
-
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 目的地规则)。Fs = 0 和 Fd = 1,因此:
Ar = Ad Cr = Cd
- 自从:
- 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
- 参见:
-
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
- 参见:
-
XOR
位于目标之外的源部分与位于源之外的目标部分组合(Porter-Duff Source Xor Destination 规则)。Fs = (1-Ad) 和 Fd = (1-As),因此:
Ar = As *(1-Ad ) + Ad *(1-As ) Cr = Cs *(1-Ad ) + Cd *(1-As )
- 自从:
- 1.4
- 参见:
-
Clear
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 CLEAR 规则。- 参见:
-
Src
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 SRC 规则。- 参见:
-
Dst
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST 规则。- 自从:
- 1.4
- 参见:
-
SrcOver
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 SRC_OVER 规则。- 参见:
-
DstOver
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_OVER 规则。- 参见:
-
SrcIn
AlphaComposite对象实现了 alpha 为 1.0f 的不透明 SRC_IN 规则。- 参见:
-
DstIn
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_IN 规则。- 参见:
-
SrcOut
AlphaComposite对象实现了 alpha 为 1.0f 的不透明 SRC_OUT 规则。- 参见:
-
DstOut
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_OUT 规则。- 参见:
-
SrcAtop
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 SRC_ATOP 规则。- 自从:
- 1.4
- 参见:
-
DstAtop
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 DST_ATOP 规则。- 自从:
- 1.4
- 参见:
-
Xor
AlphaComposite对象,它实现了 alpha 为 1.0f 的不透明 XOR 规则。- 自从:
- 1.4
- 参见:
-
-
方法详情
-
getInstance
创建具有指定规则的AlphaComposite对象。 -
getInstance
创建一个具有指定规则和常量 alpha 的AlphaComposite对象以与源的 alpha 相乘。在与目标合成之前,源与指定的 alpha 相乘。 -
createContext
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) 为合成操作创建上下文。上下文包含用于执行合成操作的状态。- 指定者:
createContext在接口Composite中- 参数:
srcColorModel- 源的ColorModeldstColorModel- 目的地的ColorModelhints- 上下文对象用于在渲染选项之间进行选择的提示- 返回:
-
用于执行合成操作的
CompositeContext对象。
-
getAlpha
public float getAlpha()返回此AlphaComposite的 alpha 值。如果此AlphaComposite没有 alpha 值,则返回 1.0。- 返回:
-
这个
AlphaComposite的 alpha 值。
-
getRule
public int getRule()返回此AlphaComposite的合成规则。- 返回:
-
这个
AlphaComposite的合成规则。
-
derive
返回一个使用指定合成规则的类似AlphaComposite对象。如果此对象已使用指定的合成规则,则返回此对象。 -
derive
返回一个使用指定 alpha 值的类似AlphaComposite对象。如果此对象已经具有指定的 alpha 值,则返回此对象。- 参数:
alpha- 要与源的 alpha 相乘的常量 alpha。alpha必须是 [0.0, 1.0] 范围内的浮点数。- 返回:
-
派生自该对象的
AlphaComposite对象,它使用指定的 alpha 值。 - 抛出:
IllegalArgumentException- 如果alpha小于 0.0 或大于 1.0- 自从:
- 1.6
-
hashCode
public int hashCode()返回此组合的哈希码。 -
equals
确定指定对象是否等于此AlphaComposite。结果为
true当且仅当参数不是null并且是一个AlphaComposite对象,该对象具有与该对象相同的合成规则和 alpha 值。
-