Alpha混合

前面介绍Color类时曾经讲到了FromArgb方法。该方法一个最常用的重载为:

code.vb.net
Overloads Public Shared Function FromArgb(Integer,Integer, _
          Integer,Integer) As Color

它有4个参数,是当前要设置的颜色的ARGB分量G ipha、红色、绿色和蓝色)值,均为8位,共32位。其中的alpha值表示颜色的透明度,即前景色与背景色的混合程度,取值范围为0到255,取0时表示完全透明,取255时完全不透明。

对于给定的alpha值,前景色、背景色和当前色之间具有下面的关系式:

当前色=前景色Xalpha/255+背景色X(255-alpha)/255

下面的程序首先创建一个蓝紫色的矩形作为背景,然后创建两个位图,每个位图中有两个矩形。第1个位图中间的两个矩形具有透明效果,第2个位图中间的两个矩形则没有透明效果。有无透明效果是通过将该位图Graphics对象的CompositingMode属性设置为Composti No.Sourc op枚举值来实现的。设置为该枚举值以后,前景仓烙覆盖弯景色,而不是混合。

【VB.NET】

code.vb.net
Protected Overries Sub OnPaint(ByVal text-blue-400">e As System.Windows.Formns.PaintEventArgs)
     Dim g As Graphics = text-blue-400">e.Graphics
     '创建一个填充矩形
     Dim brush As New SolidBrush(Color.Blue Violet)
     g.FillRectangle(brush, 180, 70,200,150)
     '创建一个位图,其中的两个矩形之间有透明效果
     Dim bm1 As New Bitmap(200, 100)
     Dim bg1 As Graphics = Graphics.FromImage(bm1)
     Dim redBrush As New SolidBrush(Color.FromArgb(210,255,0,0)
     Dim greenBrush As New SolidBrush(Color.FromArgb(210,0,255,0)
     bg1.FillRectangle(redBrush, 0,0,150,70)
     bg1.FillRectangle(greenBrush, 30, 30, 150,70)
     g.DrawImage(bm1, 100,100)
     '创建第2个位图,其中两个矩形之间没有透明效果
     Dim bm2 As New Bitmap(200,100)
     Dim bg2 As Graphics = Graphics. Fromimage(bm2)
     bg2.CompositingMode = CompositingMode.SourceCopy
     bg2.FillRectangle(redBrush, 0,0,150,70)
     bg2.FillRectangle(greenBrush,30,30,150,70)
     g.CompositingQuality = CompositingQuality.GammaCorrected
     g.DrawImage(bm2,300,100)
End Sub"

【VC#.NET】

code.vc#.net
protected override void OnPaint(PaintEventArgs e)
{
     Graphics g= e.Graphics;
     //创建一个填充矩形
     SolidBrush brush=new SolidBrush(Color.BlueViolet);
     g.FillRectangle(brush, 180,70, 200, 150);
     //创建一个位图,其中的两个矩形之间有透明效果
     Bitmap bm1=new Bitmap(200, 100);
     Graphics bg1= Graphics.Fromlmage(bm1);
     SolidBrush redBrushnew olidBrush(Color.FromArgb(210,255,0,0));
     SolidBrush greenBrush=new SolidBrush(Color.FromArgb(210, 0,255,0));
     bg1.FillRectangle(redBrush, 0, 0,150,70);
     bg1.FillRectangle(greenBrush,30,30,150,70);
     g.DrawImage(bm1,100,100);
     //创建第2个位图,其中两个矩形之间没有透明效果
     Bitmap bm2=new Bitmap(200,100);
     Graphics bg2= Graphics. Fromlmage(bm2);
     bg2.CompositingMode = CompositingMode.SourceCopy;
     bg2.FillRectangle(redBrush, 0, 0, 150,70);
     bg2.FillRectangle(greenBrush,30, 30,150, 70);
     g.CompositingQuality = CompositingQuality.GammaCorrected;
     g.Drawlmage(bm2,300, 100);
}

程序运行结果如图3-14所示。

Document Image
\[\]

图3-14 Alpha混合示例