10. Graphics的几个属性。
今天我来讲讲Graphics在DrawImage里的几个的属性。
Graphics是GDI+里面的大拿,可以用来画线,画矩形,甚至可以用来画各种各样的材质。 通过不同的Pen,Brush来实现。具体的使用方法是所有想用GDI+的同学的基础,我就不详细讲 了,具体可以参考MSDN:http://msdn.microsoft.com/en-us/library/haxsc50a(VS.80).aspx 。我主要来讲2个大家不太注意的属性。
a.Graphics.CompositingMode
这是一个枚举属性,可以取的值有2种,一种是SourceOver, 另外一种是SourceCopy。这 定义了Graphics如何将当前颜色和背景合成。如果是SourceCopy,那么颜色不和当前背景合 成。如果是SourceOver,那么背景颜色会和当前的颜色混合,算法如下:
显示颜色 = 源颜色 × alpha / 255 + 背景颜色 × (255 - alpha) / 255
新颜色的透明分量是255,也就是不透明。我们来看看下面的代码:
private int CompositeColor(int color, int alpha, int backgroudColor)
{
//显示颜色 = 源颜色 × alpha / 255 + 背景颜 色 × (255 - alpha) / 255
return color * alpha / 255 + backgroudColor * (255 - alpha) / 255;
}
private void Draw(object sender, EventArgs e)
{
this.BackColor = Color.FromArgb(255, 255, 255);
Graphics g = this.CreateGraphics();
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255, 0, 0)), new Rectangle(0, 0, 200, 200));
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255, 0, 0)), new Rectangle(200, 0, 200, 200));
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(new SolidBrush(Color.FromArgb(
255,
CompositeColor(255, 127, 255),
CompositeColor(0, 127, 255),
CompositeColor(0, 127, 255))
), new Rectangle(0, 200, 200, 200));
g.Dispose();
}
第1个色块和第2个色块分别是混合和不混合的,如果我们用不混合的方式希望得到混合的 效果,那么应该用第三个色块的写法。从下面的图像中我们可以很清楚地看到结果。