java.lang.Object java.awt.AlphaComposite
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 种令人满意的可视效果。在对 12 个指定可视效果的静态字段的描述中,给出了具有确定 Fs 和 Fd 值的方程。例如,对 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 值。应用此值就好像首先将隐式的 SRC_IN 规则应用于源像素(通过将原始源 alpha 和原始源色乘以 AlphaComposite
中的 alpha 值获得),而不是应用于具有指定 alpha 值的像素。这产生了以下方程,该方程生成 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 为零时除法是不明确的,所以在这种情况下会忽略除法以避免“除以零”的情况,此时颜色分量都将为零。
出于性能方面的原因,传递给 CompositeContext
对象(由 AlphaComposite
类创建) compose
方法的 Raster
对象最好有预乘数据。不过,如果源 Raster
或目标 Raster
没有被预乘,那么可以在合成操作之前或之后执行适当的转换。
BufferedImage
类中列出的一些不透明图像类型,没有为它们的像素存储 alpha 值。这类源图像为它们所有的像素提供了值为 1.0 的 alpha 值。
BufferedImage.TYPE_BYTE_INDEXED
用作混合操作的目标,因为需要从限定的调色板选择像素,以匹配混合方程的结果,所以每个操作都可能引入大量错误。
通常,整数值与浮点值存在某种相关性:整数 0 等于浮点值 0.0,整数 2^n-1(其中 n 是表示形式中的位数)等于 1.0。对于 8 位的表示形式,这意味着 0x00 表示 0.0,0xff 表示 1.0。
(A, R, G, B) = (0x01, 0xb0, 0x00, 0x00)
如果正在使用整数运算,并且此值在 SRC
模式下没有与任何 alpha 值合成,则该运算将指示此运算的结果为(整数格式):
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
注意中间的值,它总是以已预乘的形式出现,并且只允许整数 red 分量为 0x00 或 0x01。当试图将此结果存储回未预乘的目标中时,用 alpha 值相除之后,对于未预乘的 red 值,可进行的选择很少。在这种情况下,在整数空间内执行运算(没有快捷方式)的实现最后可能提供以下最终像素值:
(A, R, G, B) = (0x01, 0xff, 0x00, 0x00)
(注意,0x01 除以 0x01 得到的是 1.0,等于 8 位存储格式的值 0xff。)
另一方面,使用浮点运算的实现可以生成更精确的结果,并以返回原始像素值结束,该值有可能带有少量的舍入误差。或者,使用整数运算的实现可能决定是否可以将未涉及的像素传输给目标,完全避免所有运算。因为如果在浮点空间内执行运算,方程可简单归结为颜色值上的一个虚拟 NOP。
这些实现都试图遵守相同的方程,但使用经过权衡的不同整数和浮点运算,并使用部分的或全部的方程。为了说明这些不同之处,可能最好只期望获得已预乘形式的结果,以在实现和图像格式之间进行匹配。在这种情况下,以预乘形式表示的两种答案将等同于:
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
并且它们将是完全匹配的。
Composite
,
CompositeContext
字段摘要 | |
---|---|
static AlphaComposite |
Clear 实现不透明 CLEAR 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static int |
CLEAR 目标色和目标 alpha 值都被清除(Porter-Duff Clear 规则)。 |
static AlphaComposite |
Dst 实现不透明 DST 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static int |
DST 目标色不变(Porter-Duff Destination 规则)。 |
static int |
DST_ATOP 在源色之上合成源色中的目标色部分,并将替换目标色(Porter-Duff Destination Atop Source 规则)。 |
static int |
DST_IN 源色中的目标色部分将替换目标色(Porter-Duff Destination In Source 规则)。 |
static int |
DST_OUT 源色以外的目标色部分将替换目标色(Porter-Duff Destination Held Out By Source 规则)。 |
static int |
DST_OVER 在源色之上合成目标色,产生的结果将替代目标色(Porter-Duff Destination Over Source 规则)。 |
static AlphaComposite |
DstAtop 实现不透明 DST_ATOP 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
DstIn 实现不透明 DST_IN 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
DstOut 实现不透明 DST_OUT 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
DstOver 实现不透明 DST_OVER 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
Src 实现不透明 SRC 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static int |
SRC 将源色复制到目标色(Porter-Duff Source 规则)。 |
static int |
SRC_ATOP 目标色中的源色部分将被合成到目标色中(Porter-Duff Source Atop Destination 规则)。 |
static int |
SRC_IN 目标色中的源色部分将替换目标色(Porter-Duff Source In Destination 规则)。 |
static int |
SRC_OUT 目标色以外的源色部分将替换目标色(Porter-Duff Source Held Out By Destination 规则)。 |
static int |
SRC_OVER 在目标色之上合成源色(Porter-Duff Source Over Destination 规则)。 |
static AlphaComposite |
SrcAtop 实现不透明 SRC_ATOP 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
SrcIn 实现不透明 SRC_IN 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
SrcOut 实现不透明 SRC_OUT 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
SrcOver 实现不透明 SRC_OVER 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
Xor 实现不透明 XOR 规则的 AlphaComposite 对象,具有 1.0f 的 alpha 值。 |
static int |
XOR 将目标色之外的源色部分与源色之外的目标色部分结合到一起(Porter-Duff Source Xor Destination 规则)。 |
方法摘要 | |
---|---|
CompositeContext |
createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) 为合成操作创建一个上下文。 |
AlphaComposite |
derive(float alpha) 返回一个类似的 AlphaComposite 对象,该对象使用指定的 alpha 值。 |
AlphaComposite |
derive(int rule) 返回一个类似的 AlphaComposite 对象,该对象使用指定的复合规则。 |
boolean |
equals(Object obj) 确定指定的对象是否等于此 AlphaComposite 。 |
float |
getAlpha() 返回此 AlphaComposite 的 alpha 值。 |
static AlphaComposite |
getInstance(int rule) 创建一个具有指定规则的 AlphaComposite 对象。 |
static AlphaComposite |
getInstance(int rule, float alpha) 创建一个 AlphaComposite 对象,它具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。 |
int |
getRule() 返回此 AlphaComposite 的合成规则。 |
int |
hashCode() 返回此合成的哈希码。 |
从类 java.lang.Object 继承的方法 |
---|
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait |
字段详细信息 |
---|
public static final int CLEAR
Fs = 0 和 Fd = 0,因此:
Ar = 0 Cr = 0
public static final int SRC
Fs = 1 和 Fd = 0,因此:
Ar = As Cr = Cs
public static final int DST
Fs = 0 和 Fd = 1,因此:
Ar = Ad Cr = Cd
public static final int SRC_OVER
Fs = 1 和 Fd = (1-As),因此:
Ar = As + Ad*(1-As) Cr = Cs + Cd*(1-As)
public static final int DST_OVER
Fs = (1-Ad) 和 Fd = 1,因此:
Ar = As*(1-Ad) + Ad Cr = Cs*(1-Ad) + Cd
public static final int SRC_IN
Fs = Ad 和 Fd = 0,因此:
Ar = As*Ad Cr = Cs*Ad
public static final int DST_IN
Fs = 0 和 Fd = As,因此:
Ar = Ad*As Cr = Cd*As
public static final int SRC_OUT
Fs = (1-Ad) 和 Fd = 0,因此:
Ar = As*(1-Ad) Cr = Cs*(1-Ad)
public static final int DST_OUT
Fs = 0 和 Fd = (1-As),因此:
Ar = Ad*(1-As) Cr = Cd*(1-As)
public static final int SRC_ATOP
Fs = Ad 和 Fd = (1-As),因此:
Ar = As*Ad + Ad*(1-As) = Ad Cr = Cs*Ad + Cd*(1-As)
public static final int DST_ATOP
Fs = (1-Ad) 和 Fd = As,因此:
Ar = As*(1-Ad) + Ad*As = As Cr = Cs*(1-Ad) + Cd*As
public static final int XOR
Fs = (1-Ad) 和 Fd = (1-As),因此:
Ar = As*(1-Ad) + Ad*(1-As) Cr = Cs*(1-Ad) + Cd*(1-As)
public static final AlphaComposite Clear
AlphaComposite
对象,具有 1.0f 的 alpha 值。
CLEAR
public static final AlphaComposite Src
AlphaComposite
对象,具有 1.0f 的 alpha 值。
SRC
public static final AlphaComposite Dst
AlphaComposite
对象,具有 1.0f 的 alpha 值。
DST
public static final AlphaComposite SrcOver
AlphaComposite
对象,具有 1.0f 的 alpha 值。
SRC_OVER
public static final AlphaComposite DstOver
AlphaComposite
对象,具有 1.0f 的 alpha 值。
DST_OVER
public static final AlphaComposite SrcIn
AlphaComposite
对象,具有 1.0f 的 alpha 值。
SRC_IN
public static final AlphaComposite DstIn
AlphaComposite
对象,具有 1.0f 的 alpha 值。
DST_IN
public static final AlphaComposite SrcOut
AlphaComposite
对象,具有 1.0f 的 alpha 值。
SRC_OUT
public static final AlphaComposite DstOut
AlphaComposite
对象,具有 1.0f 的 alpha 值。
DST_OUT
public static final AlphaComposite SrcAtop
AlphaComposite
对象,具有 1.0f 的 alpha 值。
SRC_ATOP
public static final AlphaComposite DstAtop
AlphaComposite
对象,具有 1.0f 的 alpha 值。
DST_ATOP
public static final AlphaComposite Xor
AlphaComposite
对象,具有 1.0f 的 alpha 值。
XOR
方法详细信息 |
---|
public static AlphaComposite getInstance(int rule)
AlphaComposite
对象。
public static AlphaComposite getInstance(int rule, float alpha)
AlphaComposite
对象,它具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。在将源色与目标色合成前,要将源色乘以指定的 alpha 值。
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints)
Composite
中的
createContext
srcColorModel
- 源色的
ColorModel
dstColorModel
- 目标色的
ColorModel
hints
- 上下文对象用于选择呈现方法的提示
CompositeContext
对象。
public float getAlpha()
AlphaComposite
的 alpha 值。如果此
AlphaComposite
没有 alpha 值,则返回 1.0。
AlphaComposite
的 alpha 值。
public int getRule()
AlphaComposite
的合成规则。
AlphaComposite
的合成规则。
public AlphaComposite derive(int rule)
AlphaComposite
对象,该对象使用指定的复合规则。如果此对象已经使用指定的复合规则,则返回此对象。
public AlphaComposite derive(float alpha)
AlphaComposite
对象,该对象使用指定的 alpha 值。如果此对象已经具有指定的 alpha 值,则返回此对象。
alpha
- 常量 alpha,将乘以源的 alpha 值。
alpha
必须是闭区间 [0.0, 1.0] 中的一个浮点数字。
AlphaComposite
对象。
IllegalArgumentException
- 如果
alpha
小于 0.0 或大于 1.0
public int hashCode()
Object.equals(java.lang.Object)
,
Hashtable
public boolean equals(Object obj)
AlphaComposite
。
当且仅当参数不为 null
,并且是一个与此对象具有相同组合规则和 alpha 值的 AlphaComposite
对象时,结果才为 true
。
obj
- 要测试相等性的
Object
obj
等于此
AlphaComposite
,则返回
true
;否则返回
false
。
Object.hashCode()
,
Hashtable