public final class AlphaComposite extends Object implements Composite
AlphaComposite
类实现了基本的alpha合成规则,用于组合源和目标颜色,以实现图形和图像的混合和透明效果。
该类实施的具体规则是T.Porter和T.Duff(“Compositing Digital Images”,SIGGRAPH 84,253-259)中描述的12个规则的基本集合。
本文档的其余部分假定您熟悉该文章中概述的定义和概念。
该类扩展了由波特和达夫定义的标准方程,以包括一个附加因素。 AlphaComposite
类的一个实例可以包含一个alpha值,用于在混合方程中使用之前修改每个源像素的不透明度或覆盖率。
重要的是要注意,由波特和达夫纸定义的方程式都被定义为对由其对应的α分量预乘的颜色分量进行操作。 由于ColorModel
和Raster
类允许以预乘或非预乘形式存储像素数据,所以在应用方程之前,所有输入数据必须被归一化为预乘形式,并且所有结果可能需要调整回目标所需的形式在存储像素值之前。
还要注意,这个类只定义了纯粹数学意义上的颜色和alpha值的组合方程式。 其方程的准确应用取决于数据从其来源检索并存储在其目的地的方式。 见Implementation Caveats了解更多信息。
Porter和Duff论文中的混合方程的描述中使用了以下因素:
Factor Definition As the alpha component of the source pixel Cs a color component of the source pixel in premultiplied form Ad the alpha component of the destination pixel Cd a color component of the destination pixel in premultiplied form Fs the fraction of the source pixel that contributes to the output Fd the fraction of the destination pixel that contributes to the output Ar the alpha component of the result Cr a color component of the result in premultiplied form
使用这些因素,Porter和Duff定义了12种选择混合因子F s和F d以产生12种期望的视觉效果的方式。 用于确定F s和F d的方程式在指定视觉效果的12个静态场的描述中给出。 例如,SRC_OVER
的描述规定F s = 1和F d =(1- A s )。 一旦确定混合因子的一组方程是已知的,则可以使用以下一组方程将其应用于每个像素以产生结果:
Fs = f(Ad)
Fd = f(As)
Ar = As*Fs + Ad*Fd
Cr = Cs*Fs + Cd*Fd
以下因素将用于讨论我们在波特和达夫论文中对混合方程的扩展:
Factor Definition Csr one of the raw color components of the source pixel Cdr one of the raw color components of the destination pixel Aac the "extra" alpha component from the AlphaComposite instance Asr the raw alpha component of the source pixel Adr the raw alpha component of the destination pixel Adf the final alpha component stored in the destination Cdf the final raw color component stored in the destination
AlphaComposite
类定义了一个应用于源alpha的附加alpha值。 仿佛隐式SRC_IN规则的由两个原始源α和通过在所述α的原始源颜色乘以第一施加到源极的像素对的像素与所指示的阿尔法此值被应用于AlphaComposite
。 这导致了用于生成波特和Duff混合方程中使用的α的以下等式:
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)
调整后的A s , A d , C s和C d用于标准Porter和Duff方程中,以计算混合因子F s和F d ,然后计算得到的预乘积分量A r和C r 。
如果要将其存储回保存未预乘数据的目标缓冲区,则使用以下等式,才需要调整结果:
Adf = Ar
Cdf = Cr (if dest is premultiplied)
Cdf = Cr / Ar (if dest is not premultiplied)
请注意,由于如果所得到的alpha为零,则除法是未定义的,因此省略了这种情况下的划分,以避免“除以零”,并将颜色分量保留为全零。
由于性能的原因,优选的是Raster
传递给对象compose
一个的方法CompositeContext
由所创建的对象AlphaComposite
类已经预乘数据。 但是,如果源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)
请注意,始终处于预乘形式的中间值只允许整数红色分量为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)
所以他们都会相配。
Composite
, CompositeContext
Modifier and Type | Field and Description |
---|---|
static AlphaComposite |
Clear
AlphaComposite 对象实现不透明的CLEAR规则,其alpha为1.0f。
|
static int |
CLEAR
目的地的颜色和alpha都被清除(Porter-Duff Clear规则)。
|
static AlphaComposite |
Dst
AlphaComposite 对象实现不透明的DST规则,alpha为1.0f。
|
static int |
DST
目的地保持不变(Porter-Duff目的地规则)。
|
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
AlphaComposite 对象实现不透明的DST_ATOP规则,alpha为1.0f。
|
static AlphaComposite |
DstIn
AlphaComposite 对象实现不透明的DST_IN规则,其alpha为1.0f。
|
static AlphaComposite |
DstOut
AlphaComposite 对象实现不透明的DST_OUT规则,alpha为1.0f。
|
static AlphaComposite |
DstOver
AlphaComposite 对象实现不透明的DST_OVER规则,其alpha为1.0f。
|
static AlphaComposite |
Src
AlphaComposite 对象实现不透明的SRC规则,alpha为1.0f。
|
static int |
SRC
源被复制到目的地(Porter-Duff源规则)。
|
static int |
SRC_ATOP
位于目的地内部的源的部分被合成到目的地(Porter-Duff Source Atop Destination rule)上。
|
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
AlphaComposite 对象实现的alpha值为1.0f的不透明SRC_ATOP规则。
|
static AlphaComposite |
SrcIn
AlphaComposite 对象实现了alphaf为1.0f的不透明SRC_IN规则。
|
static AlphaComposite |
SrcOut
AlphaComposite 实现不透明的SRC_OUT规则,其alpha为1.0f。
|
static AlphaComposite |
SrcOver
AlphaComposite 对象实现的alpha值为1.0f的不透明SRC_OVER规则。
|
static AlphaComposite |
Xor
AlphaComposite 实现不透明XOR规则,对象的alpha为1.0f。
|
static int |
XOR
位于目的地外部的源的部分与位于源外的目标的部分(Porter-Duff Source Xor Destination rule)组合。
|
Modifier and Type | Method and Description |
---|---|
CompositeContext |
createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints)
创建合成操作的上下文。
|
AlphaComposite |
derive(float alpha)
返回一个类似的使用指定alpha值的
AlphaComposite 对象。
|
AlphaComposite |
derive(int rule)
返回使用指定的合成规则的类似的
AlphaComposite 对象。
|
boolean |
equals(Object obj)
确定指定的对象是否等于此
AlphaComposite 。
|
float |
getAlpha()
返回此值的alpha值
AlphaComposite 。
|
static AlphaComposite |
getInstance(int rule)
使用指定的规则创建一个
AlphaComposite 对象。
|
static AlphaComposite |
getInstance(int rule, float alpha)
使用指定的规则创建一个
AlphaComposite 对象,并将常量alpha与源的alpha进行乘法。
|
int |
getRule()
返回此的合成规则
AlphaComposite 。
|
int |
hashCode()
返回此复合的哈希码。
|
@Native public static final int CLEAR
F s = 0, F d = 0,因此:
Ar = 0
Cr = 0
@Native public static final int SRC
F s = 1, F d = 0,因此:
Ar = As
Cr = Cs
@Native public static final int DST
F s = 0且F d = 1,因此:
Ar = Ad
Cr = Cd
@Native public static final int SRC_OVER
F s = 1, F d =(1- A s ),因此:
Ar = As + Ad*(1-As)
Cr = Cs + Cd*(1-As)
@Native public static final int DST_OVER
F s =(1- A d )和F d = 1,因此:
Ar = As*(1-Ad) + Ad
Cr = Cs*(1-Ad) + Cd
@Native public static final int SRC_IN
F s = A d , F d = 0,因此:
Ar = As*Ad
Cr = Cs*Ad
@Native public static final int DST_IN
F s = 0, F d = A s ,因此:
Ar = Ad*As
Cr = Cd*As
@Native public static final int SRC_OUT
F s =(1- A d )且F d = 0,因此:
Ar = As*(1-Ad)
Cr = Cs*(1-Ad)
@Native public static final int DST_OUT
F s = 0, F d =(1- A s ),因此:
Ar = Ad*(1-As)
Cr = Cd*(1-As)
@Native public static final int SRC_ATOP
F s = A d和F d =(1- A s ),因此:
Ar = As*Ad + Ad*(1-As) = Ad
Cr = Cs*Ad + Cd*(1-As)
@Native public static final int DST_ATOP
F s =(1- A d ), F d = A s ,因此:
Ar = As*(1-Ad) + Ad*As = As
Cr = Cs*(1-Ad) + Cd*As
@Native public static final int XOR
F s =(1- A d )和F d =(1- A s ),因此:
Ar = As*(1-Ad) + Ad*(1-As)
Cr = Cs*(1-Ad) + Cd*(1-As)
public static final AlphaComposite Clear
AlphaComposite
对象实现不透明的CLEAR规则,其alpha为1.0f。
CLEAR
public static final AlphaComposite Src
AlphaComposite
对象实现的不透明的SRC规则的alpha为1.0f。
SRC
public static final AlphaComposite Dst
AlphaComposite
对象实现不透明的DST规则,alpha为1.0f。
DST
public static final AlphaComposite SrcOver
AlphaComposite
对象实现不透明的SRC_OVER规则,其alpha为1.0f。
SRC_OVER
public static final AlphaComposite DstOver
AlphaComposite
对象实现不透明的DST_OVER规则,其alpha为1.0f。
DST_OVER
public static final AlphaComposite SrcIn
AlphaComposite
对象实现了不透明的SRC_IN规则,其alpha为1.0f。
SRC_IN
public static final AlphaComposite DstIn
AlphaComposite
对象实现不透明的DST_IN规则,其alpha为1.0f。
DST_IN
public static final AlphaComposite SrcOut
AlphaComposite
对象实现的alpha值为1.0f的不透明SRC_OUT规则。
SRC_OUT
public static final AlphaComposite DstOut
AlphaComposite
对象实现不透明的DST_OUT规则,alpha为1.0f。
DST_OUT
public static final AlphaComposite SrcAtop
AlphaComposite
对象实现的alpha值为1.0f的不透明SRC_ATOP规则。
SRC_ATOP
public static final AlphaComposite DstAtop
AlphaComposite
对象实现不透明的DST_ATOP规则,其alpha值为1.0f。
DST_ATOP
public static final AlphaComposite Xor
AlphaComposite
实现不透明XOR规则的对象,其alpha为1.0f。
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)
createContext
在界面
Composite
srcColorModel
- 源的ColorModel
dstColorModel
-
ColorModel
的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
必须是包含范围[0.0,1.0]中的浮点数。
AlphaComposite
对象派生
AlphaComposite
对象使用指定的alpha值。
IllegalArgumentException
- 如果
alpha
小于0.0或大于1.0
public int hashCode()
hashCode
在类别
Object
Object.equals(java.lang.Object)
,
System.identityHashCode(java.lang.Object)
public boolean equals(Object obj)
AlphaComposite
。
当且仅当参数不是null
并且具有与AlphaComposite
对象具有相同合成规则和alpha值的AlphaComposite
对象时,结果为true
。
equals
在类别
Object
obj
-
Object
测试平等
true
如果obj
于此AlphaComposite
;
false
否则。
Object.hashCode()
, HashMap