| 
 | JavaTM Platform Standard Ed. 6 | |||||||||
| 上一个类 下一个类 | 框架 无框架 | |||||||||
| 摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 | |||||||||
java.lang.Objectjava.awt.AlphaComposite
public final class 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 值。
CLEARpublic static final AlphaComposite Src
AlphaComposite 对象,具有 1.0f 的 alpha 值。
SRCpublic static final AlphaComposite Dst
AlphaComposite 对象,具有 1.0f 的 alpha 值。
DSTpublic static final AlphaComposite SrcOver
AlphaComposite 对象,具有 1.0f 的 alpha 值。
SRC_OVERpublic static final AlphaComposite DstOver
AlphaComposite 对象,具有 1.0f 的 alpha 值。
DST_OVERpublic static final AlphaComposite SrcIn
AlphaComposite 对象,具有 1.0f 的 alpha 值。
SRC_INpublic static final AlphaComposite DstIn
AlphaComposite 对象,具有 1.0f 的 alpha 值。
DST_INpublic static final AlphaComposite SrcOut
AlphaComposite 对象,具有 1.0f 的 alpha 值。
SRC_OUTpublic static final AlphaComposite DstOut
AlphaComposite 对象,具有 1.0f 的 alpha 值。
DST_OUTpublic static final AlphaComposite SrcAtop
AlphaComposite 对象,具有 1.0f 的 alpha 值。
SRC_ATOPpublic static final AlphaComposite DstAtop
AlphaComposite 对象,具有 1.0f 的 alpha 值。
DST_ATOPpublic static final AlphaComposite Xor
AlphaComposite 对象,具有 1.0f 的 alpha 值。
XOR| 方法详细信息 | 
|---|
public static AlphaComposite getInstance(int rule)
AlphaComposite 对象。
rule - 合成规则
IllegalArgumentException - 如果 rule 不是以下规则之一:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP 或 XOR
public static AlphaComposite getInstance(int rule,
                                         float alpha)
AlphaComposite 对象,它具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。在将源色与目标色合成前,要将源色乘以指定的 alpha 值。
rule - 合成规则alpha - 将乘源色的 alpha 值的常量 alpha 值。alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字。
IllegalArgumentException - 如果 alpha 小于 0.0 或大于 1.0,或者 rule 是以下规则之一:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP 或 XOR
public CompositeContext createContext(ColorModel srcColorModel,
                                      ColorModel dstColorModel,
                                      RenderingHints hints)
Composite 中的 createContextsrcColorModel - 源色的 ColorModeldstColorModel - 目标色的 ColorModelhints - 上下文对象用于选择呈现方法的提示
CompositeContext 对象。public float getAlpha()
AlphaComposite 的 alpha 值。如果此 AlphaComposite 没有 alpha 值,则返回 1.0。
AlphaComposite 的 alpha 值。public int getRule()
AlphaComposite 的合成规则。
AlphaComposite 的合成规则。public AlphaComposite derive(int rule)
AlphaComposite 对象,该对象使用指定的复合规则。如果此对象已经使用指定的复合规则,则返回此对象。
rule - 复合规则
AlphaComposite 对象。
IllegalArgumentException - 如果 rule 不是以下规则之一: 
       CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP 或 XORpublic AlphaComposite derive(float alpha)
AlphaComposite 对象,该对象使用指定的 alpha 值。如果此对象已经具有指定的 alpha 值,则返回此对象。
alpha - 常量 alpha,将乘以源的 alpha 值。alpha 必须是闭区间 [0.0, 1.0] 中的一个浮点数字。
AlphaComposite 对象。
IllegalArgumentException - 如果 alpha 小于 0.0 或大于 1.0public int hashCode()
Object 中的 hashCodeObject.equals(java.lang.Object), 
Hashtablepublic boolean equals(Object obj)
AlphaComposite。
 
当且仅当参数不为 null,并且是一个与此对象具有相同组合规则和 alpha 值的 AlphaComposite 对象时,结果才为 true。
Object 中的 equalsobj - 要测试相等性的 Object
obj 等于此 AlphaComposite,则返回 true;否则返回 false。Object.hashCode(), 
Hashtable| 
 | JavaTM Platform Standard Ed. 6 | |||||||||
| 上一个类 下一个类 | 框架 无框架 | |||||||||
| 摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 | |||||||||
版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。