新手初学java GUI swing ,边学边记录所练习的程序,给自己一个动力,希望得高手指点
合成是客户端程序员非常重要的工具。可以把合成看作是决定如何把一个制图基元的颜色存储或组合到目标的规则,例如,规定只能把制图基元的蓝色分量复制到图形区域。合成也被认为像Photoshop这样的图形编辑应用程序中的混合模式,在这些应用程序中它们通常用于创建复杂的灯光效果。在java中,Composite是java.awt.Composite接口的一个实例,可以通过调用setComposite()把它设置到一个Graphics2D上。
java只有一个名为java.awt.AlphaComposite的Composite的实现。这个独特的合成实现了基本的透明合成规则以获得半透明的效果。AlphaComposite实现了12个规则。所有的规则基于一些数学等式:定义特定源(正在绘制的基元)和目的地(图形区域)的最终像素的alpha分量和颜色的值。这个java实现引入了一个额外的参数,一个用于在混合之前修改修改源的不透明性的alpa值。
要决定什么时候使用使用什么规则,理解java.awt.AlphaComposite文档中提到的porterDuff等式很重要,就最有用也是java默认的规则之一的“Source Over(源覆盖)”来说,它在目标图像之上合成源,源好像是覆盖在目标图像上的一片玻璃上的一个半透明图画。这个规则的描述等式如下:
Ar=As+Ad*(1-As)
Cr=Cs+Cd*(1-As)
因子A代表这个像素的alpha通道,C代表这个像素的每个颜色分量,下标r、s、d分别代表这个像素的结果(result)、源(sorce)和目的地(destination)。放在一起意味着As代表源的alpha通道,Ad代表已经在图形区域上的像素的alpha通道上,这两个值用于计算最终的alpha通道Ar。这个等式中的所有的值都是在0.0和1.0之间的浮点数,计算结果也位于这个范围。
下面来看各个规划的等式和效果图:
1.CLear
Ar=0
Cr=0
目的地的颜色和alpha都被清除掉。无论用什么颜色或形状来绘制,被源覆盖的每个目的地的像素都会消失。
如图1所示:
图1 CLear规的演示
2.Dst
Ar=Ad
Cr=Cd
目的地保持不变。在目的地上绘制的任何东西都会被丢弃,如图2所示
图2 Dst规则的演示
3.DstAtop
Ar=As*(1-Ad)+Ad*As=As
Cr=Cs*(1-Ad)+Cd*As
位于源内部的那部分目的地与源组合并取代目的地。这导致目的地似乎绘制在源之上如图3所示:
后面几种就不一一介绍了,有兴趣的看看代码就可以了。不说了,上源码!
图3 用DstAtop规则的演示