用Brush对象填充
GDI+的Brush类本身是抽象类,不能直接实例化,所以GDI+API 提供了一下五个类,来扩展Brush,并提供了具体的实现,如下:
下面简单实现一些例子。
1.SolidBrush类
SolidBrush用纯色来填充图像。
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
SolidBrush b = new SolidBrush(Color.Crimson); //实例化该笔刷
g.FillRectangle(b, 20, 20, 40, 40);
b.Dispose();
效果图:
2.TextureBrush类
TextBrush对象用基于光栅的图像来填充图形。图像可以是来自.bmp、.jpg或.png的图像。使用Bitmap类可以从文件中获取图像。
//TextureBrush的基本平铺效果
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle); //可以不要
Bitmap bmp = new Bitmap("C:\\Users\\ZQNB\\Desktop\\abc.png");//获取图片路径有多种方式
TextureBrush tb = new TextureBrush(bmp); //实例化TextureBrush对象
g.FillRectangle(tb, 20, 20, 250,100); //使用tb对象填充矩形
bmp.Dispose();
tb.Dispose();
效果图:
注意:矩形的左上角像素是(20,20),矩形的左上角只有abc.png图像的一部分。原因是,TextureBrush对象在填充矩形时,把图像用作一个平铺图片,默认从像素(0,0)开始平铺图片,所以在矩形中只看到部分的平铺图片。后面会讲如何修改平铺起点像素。
在g.FillRectangle(tb, 20, 20, 250, 100);后面添加一行代码:
g.FillRectangle(tb, 45, 45, 150, 200);
自己看看效果
下面说一些效果,不贴图了,自己可以试试:
TextureBrush tb = new TextureBrush(bmp, new Rectangle(0, 0, 40, 40));//截取图像左上角的一个小矩形作为平铺图片,使用重载构造函数。
使用TextureBrush对象的WrapMode属性可以改变图片的平铺方式。GDI+提供了WrapMode枚举,包含:Tile、Clamp、TileFlipX、TileFlipY和TileFlipXY。默认使用Tile。
Graphics g = e.Graphics;
Bitmap bmp = new Bitmap("C:\\Users\\ZQNB\\Desktop\\abc.png");
TextureBrush tb = new TextureBrush(bmp);
tb.WrapMode = WrapMode.TileFlipX; //使用WrapMode的枚举值
g.FillRectangle(tb, this.ClientRectangle);
bmp.Dispose();
tb.Dispose();
如图:相邻的两个图片会翻转。
3.LinearGradientBrush类
LinearGradientBrush对象用颜色线性渐变填充图形。实际上可以多色渐变,这里只说两色的,有不同的方式描述渐变线:可以指定两个点、或一个矩形和一个角度。
使用两个点的方式:
首先提供两个点,作为渐变起止点,两种颜色,作为起止颜色,实例化LinearGradientBrush对象,关键代码如下:
Graphics g = e.Graphics;
LinearGradientBrush lgb = new LinearGradientBrush(
new Point(0, 0),
new Point(50, 10),
Color.White,
Color.Black);
g.FillRectangle(lgb, this.ClientRectangle);
lgb.Dispose();
效果如图:
使用矩形描述渐变:
需要指定一个矩形、一个角度和两种颜色,如:
LinearGradientBrush lgb = new LinearGradientBrush(
new Rectangle(0, 0, 50, 50),
Color.White,
Color.Black,
75f);
效果如下:
如果要尝试多色渐变,可以使用LinearGradientBrush类的SetInterpolationColors方法,它需要一个渐变颜色的数组、一个表示位置的数字数组和一个整数,表示该序列中设置的颜色总数。
4.PathGradientBrush类
PathGradientBrush对象提供了一个用颜色渐变填充图形的笔刷。
示例代码:
Graphics g = e.Graphics;
GraphicsPath gp = new GraphicsPath();
//创建一个多边形对象
gp.AddLine(10, 10, 110, 15);
gp.AddLine(110, 15, 100, 96);
gp.AddLine(100, 96, 15, 110);
gp.CloseFigure(); //封闭多边形
g.FillRectangle(Brushes.White, this.ClientRectangle);
g.SmoothingMode = SmoothingMode.AntiAlias; //反锯齿效果
PathGradientBrush pgb = new PathGradientBrush(gp); //从GraphicsPath对象创建PathGradientBrush对象
pgb.CenterColor = Color.White;
pgb.SurroundColors = new Color[]{
Color.Blue,
Color.Red,
Color.Green,
Color.Yellow
};
g.FillPath(pgb, gp);
g.DrawPath(Pens.Black, gp);
pgb.Dispose();
gp.Dispose();
g.Dispose();
效果图:
5.HatchBrush类
HatchBrush类提供的笔刷可以用各种图案填充图形。影线笔刷的填充图案总是16像素*16像素的双色图案。通过HatchStyle枚举可以设置影线样式。如下将HatchStyle设置为Cross图案,然后填充客户区域:
Graphics g = e.Graphics;
HatchBrush hb = new HatchBrush(
HatchStyle.Cross,
Color.White,
Color.Black);
g.FillRectangle(hb, this.ClientRectangle);
hb.Dispose();
效果图:
创建影线笔刷时只能设置3个选项:前景色、背景色和影线样式。共有56中影线样式。
Brush的5个实现类到这结束。
从笔刷中创建钢笔:使用笔刷类型的效果执行钢笔类型的操作。
下面是先创建了一个影线笔刷,然后从该笔刷中创建一个钢笔,笔宽度为8个像素,确保钢笔能绘制出影线笔刷的图案了。
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
HatchBrush hb = new HatchBrush(
HatchStyle.WideUpwardDiagonal,
Color.White,
Color.Black);
Pen hp = new Pen(hb, 8);
g.DrawRectangle(hp, 15, 15, 70, 70);
hb.Dispose();
hp.Dispose();
g.Dispose();
效果图:
钢笔和笔刷就到这里。