模块 java.desktop
 java.awt

类 AlphaComposite

java.lang.Object
java.awt.AlphaComposite
所有已实现的接口:
Composite

public final class AlphaComposite extends Object implements Composite
AlphaComposite 类实现了基本的 alpha 合成规则,用于组合源颜色和目标颜色,以实现图形和图像的混合和透明效果。此类实现的具体规则是 T. Porter 和 T. Duff, "Compositing Digital Images", SIGGRAPH 84, 253-259 中描述的 12 条基本规则集。本文档的其余部分假定您对该文件中概述的定义和概念有一定的了解。

此类扩展了 Porter 和 Duff 定义的标准方程,以包含一个附加因子。 AlphaComposite 类的实例可以包含一个 alpha 值,该值用于在将每个源像素用于混合方程之前修改其不透明度或覆盖范围。

重要的是要注意,Porter 和 Duff 论文定义的方程式都被定义为对颜色组件进行操作,这些颜色组件预乘了相应的 alpha 组件。由于 ColorModelRaster 类允许以预乘或非预乘形式存储像素数据,因此在应用方程之前必须将所有输入数据标准化为预乘形式,并且所有结果可能需要调整回目标所需的形式在存储像素值之前。

另请注意,此类仅定义了在纯数学意义上组合颜色和 alpha 值的方程式。其方程式的准确应用取决于数据从其来源检索并存储在其目的地的方式。有关详细信息,请参阅 实现注意事项

Porter 和 Duff 论文中混合方程的描述中使用了以下因素:

因素
因素 定义
As 源像素的 alpha 组件
Cs 预乘形式的源像素的颜色组件
Ad 目标像素的 alpha 组件
Cd 预乘形式的目标像素的颜色组件
Fs 对输出有贡献的源像素部分
Fd 对输出有贡献的目标像素的分数
Ar 结果的 alpha 组件
Cr 预乘形式的结果的颜色组件

使用这些因素,Porter 和 Duff 定义了 12 种选择混合因素 FsFd 的方法,以产生 12 种理想的视觉效果。用于确定 FsFd 的方程式在指定视觉效果的 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) 

应用混合方程

调整后的 AsAdCsCd 用于标准波特和达夫方程中以计算混合因子 FsFd ,然后得到预乘组件 ArCr

准备结果

如果要将结果存储回包含未预乘数据的目标缓冲区,则只需要使用以下等式调整结果:

   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 AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 CLEAR 规则。
    static final int
    目标的颜色和 alpha 都被清除(Porter-Duff Clear 规则)。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 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 AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_ATOP 规则。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_IN 规则。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_OUT 规则。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_OVER 规则。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 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 AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 SRC_ATOP 规则。
    static final AlphaComposite
    AlphaComposite 对象实现了 alpha 为 1.0f 的不透明 SRC_IN 规则。
    static final AlphaComposite
    AlphaComposite 对象实现了 alpha 为 1.0f 的不透明 SRC_OUT 规则。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 SRC_OVER 规则。
    static final AlphaComposite
    AlphaComposite 对象,它实现了 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
    equals(Object obj)
    确定指定对象是否等于此 AlphaComposite
    float
    返回此 AlphaComposite 的 alpha 值。
    getInstance(int rule)
    创建具有指定规则的 AlphaComposite 对象。
    getInstance(int rule, float alpha)
    创建一个具有指定规则和常量 alpha 的 AlphaComposite 对象以与源的 alpha 相乘。
    int
    返回此 AlphaComposite 的合成规则。
    int
    返回此组合的哈希码。

    在类 java.lang.Object 中声明的方法

    clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
  • 字段详细信息

    • CLEAR

      @Native public static final int CLEAR
      目标的颜色和 alpha 都被清除(Porter-Duff Clear 规则)。源和目标都不用作输入。

      Fs = 0 和 Fd = 0,因此:

       Ar = 0
       Cr = 0
      
      参见:
    • SRC

      @Native public static final int SRC
      源被复制到目的地(Porter-Duff Source 规则)。目的地不用作输入。

      Fs = 1 和 Fd = 0,因此:

       Ar = As 
       Cr = Cs 
      
      参见:
    • DST

      @Native public static final int DST
      目的地保持不变(Porter-Duff 目的地规则)。

      Fs = 0 和 Fd = 1,因此:

       Ar = Ad 
       Cr = Cd 
      
      自从:
      1.4
      参见:
    • SRC_OVER

      @Native public static final int SRC_OVER
      源在目标之上合成(Porter-Duff Source Over Destination 规则)。

      Fs = 1 和 Fd = (1-As ),因此:

       Ar = As + Ad *(1-As )
       Cr = Cs + Cd *(1-As )
      
      参见:
    • DST_OVER

      @Native public static final int DST_OVER
      目标在源上合成,结果替换目标(Porter-Duff Destination Over Source 规则)。

      Fs = (1-Ad ) 和 Fd = 1,因此:

       Ar = As *(1-Ad ) + Ad 
       Cr = Cs *(1-Ad ) + Cd 
      
      参见:
    • SRC_IN

      @Native public static final int SRC_IN
      位于目标内部的源部分替换目标(Porter-Duff Source In Destination 规则)。

      Fs = AdFd = 0,因此:

       Ar = As *Ad 
       Cr = Cs *Ad 
      
      参见:
    • DST_IN

      @Native public static final int DST_IN
      位于源内部的目标部分替换目标(Porter-Duff Destination In Source 规则)。

      Fs = 0 和 Fd = As ,因此:

       Ar = Ad *As 
       Cr = Cd *As 
      
      参见:
    • SRC_OUT

      @Native public static final int SRC_OUT
      位于目标之外的源部分替换目标(Porter-Duff Source Held Out By Destination 规则)。

      Fs = (1-Ad ) 和 Fd = 0,因此:

       Ar = As *(1-Ad )
       Cr = Cs *(1-Ad )
      
      参见:
    • DST_OUT

      @Native public static final int DST_OUT
      位于源之外的目标部分替换目标(Porter-Duff Destination Held Out By Source 规则)。

      Fs = 0 和 Fd = (1-As ),因此:

       Ar = Ad *(1-As )
       Cr = Cd *(1-As )
      
      参见:
    • SRC_ATOP

      @Native public static final int SRC_ATOP
      位于目标内部的源部分被合成到目标上(Porter-Duff Source Atop Destination 规则)。

      Fs = AdFd = (1-As ),因此:

       Ar = As *Ad + Ad *(1-As ) = Ad 
       Cr = Cs *Ad + Cd *(1-As )
      
      自从:
      1.4
      参见:
    • DST_ATOP

      @Native public static final int 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

      @Native public static final int 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

      public static final AlphaComposite  Clear
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 CLEAR 规则。
      参见:
    • Src

      public static final AlphaComposite  Src
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 SRC 规则。
      参见:
    • Dst

      public static final AlphaComposite  Dst
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST 规则。
      自从:
      1.4
      参见:
    • SrcOver

      public static final AlphaComposite  SrcOver
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 SRC_OVER 规则。
      参见:
    • DstOver

      public static final AlphaComposite  DstOver
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_OVER 规则。
      参见:
    • SrcIn

      public static final AlphaComposite  SrcIn
      AlphaComposite 对象实现了 alpha 为 1.0f 的不透明 SRC_IN 规则。
      参见:
    • DstIn

      public static final AlphaComposite  DstIn
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_IN 规则。
      参见:
    • SrcOut

      public static final AlphaComposite  SrcOut
      AlphaComposite 对象实现了 alpha 为 1.0f 的不透明 SRC_OUT 规则。
      参见:
    • DstOut

      public static final AlphaComposite  DstOut
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_OUT 规则。
      参见:
    • SrcAtop

      public static final AlphaComposite  SrcAtop
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 SRC_ATOP 规则。
      自从:
      1.4
      参见:
    • DstAtop

      public static final AlphaComposite  DstAtop
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 DST_ATOP 规则。
      自从:
      1.4
      参见:
    • Xor

      public static final AlphaComposite  Xor
      AlphaComposite 对象,它实现了 alpha 为 1.0f 的不透明 XOR 规则。
      自从:
      1.4
      参见:
  • 方法详情

    • getInstance

      public static AlphaComposite  getInstance(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 XOR
    • getInstance

      public static AlphaComposite  getInstance(int rule, float alpha)
      创建一个具有指定规则和常量 alpha 的 AlphaComposite 对象以与源的 alpha 相乘。在与目标合成之前,源与指定的 alpha 相乘。
      参数:
      rule - 合成规则
      alpha - 要与源的 alpha 相乘的常量 alpha。 alpha 必须是 [0.0, 1.0] 范围内的浮点数。
      返回:
      创建的AlphaComposite对象
      抛出:
      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
    • 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

      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 XOR
      自从:
      1.6
    • derive

      public AlphaComposite  derive(float alpha)
      返回一个使用指定 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()
      返回此组合的哈希码。
      重写:
      hashCode 在类 Object
      返回:
      此组合的哈希码。
      参见:
    • equals

      public boolean equals(Object  obj)
      确定指定对象是否等于此 AlphaComposite

      结果为 true 当且仅当参数不是 null 并且是一个 AlphaComposite 对象,该对象具有与该对象相同的合成规则和 alpha 值。

      重写:
      equals 在类 Object
      参数:
      obj - Object 来测试是否相等
      返回:
      true 如果 obj 等于这个 AlphaCompositefalse否则。
      参见: