C# GDI+图形绘制.docx
《C# GDI+图形绘制.docx》由会员分享,可在线阅读,更多相关《C# GDI+图形绘制.docx(34页珍藏版)》请在冰豆网上搜索。
C#GDI+图形绘制
第8章 绘制图像
本章要求掌握用GDI+绘制直线、圆、长方形等图形,在第七章的基础上编写一个类似于“画图”图像图形处理程序
8.1 绘图所用到的常用控件及类
绘图用到的PictureBox,Image,Bitmap,OpenFileDialog,SaveFileDialog等控件或类在前一章已经进行了讲解。
现对所用的其它控件或类进行说明。
8.1.1 颜色
在绘制图形时需要指定使用的颜色,在GDI+中,颜色用System.Drawing.Color 结构来表示的。
1 红绿蓝(RGB)值
监视器可以显示的颜色总数非常大—— 超过160万。
其确切的数字是2的24次方,即16 777 216。
显然,我们需要对这些颜色进行索引,才能指定在给定的某个像素上要显示什么颜色。
给颜色进行索引的最常见方式是把它们分为红绿蓝成分,每种成份的光分为256种不同的强度,其值在0~255之间。
2 设置颜色的方法
● 可以调用静态函数Color.FromArgb()指定该颜色的红绿蓝值。
其格式为
publicstatic Color FromArgb(
intred,
intgreen,
intblue
)
例如:
Colorred=Color.FromArgb(255,0,0);
Colorgreen=Color.FromArgb(0,255,0);
Colorblue=Color.FromArgb(0,0,255);
● 获取系统定义的颜色
使用FromArgb()构造颜色是一种非常灵活的技巧,因为它表示我们可以指定人眼能辨识出的任何颜色。
但是,如果要得到一种简单、标准、众所周知的纯色,例如红色或蓝色,命名想要的颜色是比较简单的。
因此Microsoft还在Color中提供了许多静态属性,每个属性都返回一种命名的颜色。
在下面的示例中,把窗口的背景色设置为白色时,就使用了其中一种属性:
this.BackColor=Color.White;
// 与以下语句效果一样
//this.BackColor=Color.FromArgb(255,255,255);
8.1.2 画笔和钢笔
本节介绍Pen和Brush,在绘制图形时需要使用它们。
Pen用于告诉graphics实例如何绘制线条。
Brush如何填充区域。
例如,Pen用于绘制矩形和椭圆的边框。
如果需要把这些图形绘制为实心的,就要使用画笔指定如何填充它们。
1画笔
GDI+有几种不同类型的画笔。
每种画笔都由一个派生自抽象类System.Drawing.Brush的类实例来表示。
最简单的画笔为System.Drawing.SolidBrush。
它是单色画笔,用于填充图形形状,如矩形、椭圆、扇形、多边形和封闭路径。
ColorcustomColor=Color.FromArgb(192,192,192);
SolidBrushshadowBrush=newSolidBrush(customColor);
或者
SolidBrushshadowBrush=newSolidBrush(Color.Gray);
2与画笔不同,钢笔只用一个类System.Drawing.Pen来表示。
但钢笔比画笔复杂一些,因为它需要指定线条应有多宽(像素),对于一条比较宽的线段,还要确定如何填充该线条中的区域。
PensolidBluePen=newPen(Color.FromArgb(0,0,255));
PensolidWideBluePen=newPen(Color.Blue,4);
8.2 绘图所用到的结构
GDI+使用几个类似的结构来表示坐标或区域。
下面介绍几个结构,它们都是在System.Drawing命名空间中定义的,如表8.1所示。
表 8-1Point、Size及Rectangle结构
结 构
主要的公共属性
Point
X,Y
PointF
Size
Width,Height
SizeF
Rectangle
Left,Right,Top,Bottom,Width,Height,X,Y,Location,Size
RectangleF
8.2.1Point和PointF结构
表示图像的一点,从概念上讲,Point在这些结构中是最简单的,在数学上,它完全等价于一个二维矢量。
我们可以创建一个Point结构:
Pointb=newPoint(20,10);
X和Y都是读写属性,也可以在Point中设置这些值:
Pointa=newPoint();
a.X=20;
b.Y=10;
PointF与Point完全相同,但X和Y属性的类型是float,而不是int。
PointF用于坐标不是整数值的情况。
注意,可以把Point隐式转换为 PointF,但要把PointF转换为Point,必须显式地复制值,或使用下面的3个转换方法Round()、Truncate()和Ceiling()。
Pointb=newPoint();
b.X=(int)abFloat.X;
b.Y=(int)abFloat.Y;
//Point隐式转换为 PointF
PointFbFloat1=ab;
//PointF显式转换为 Point
Pointb1=Point.Round(bFloat);
Pointb2=Point.Truncate(bFloat);
Pointb3=Point.Ceiling(bFloat);
8.2.2Size和SizeF结构
与Point和PointF一样,Size也有两个属性。
Size结构用于int类型,SizeF用于float类型,除此之外,Size和 SizeF是完全相同的。
下面主要讨论Size结构。
在许多情况下,Size结构与Point结构是相同的,它也有两个整型属性,表示水平和垂直距离—— 主要区别是这两个属性的名称不是X和Y,而是Width 和 Height。
前面的图30-3可以表示为:
Sizeab=newSize(20,10);
严格地讲,Size在数学上与Point表示的含义相同;但在概念上它使用的方式略有不同。
Point用于说明实体在什么地方,而Size用于说明实体有多大。
8.2.3Rectangle和RectangleF结构
这两个结构表示一个矩形区域(通常在屏幕上)。
与Point 和 Size一样,这里只介绍Rectangle结构,RectangleF与Rectangle基本相同,但它的属性类型是float,而Rectangle的属性类型是int。
Rectangle可以看作由一个Point 和一个 Size组成,其中Point表示矩形的左上角,Size表示其大小。
它的一个构造函数把Point 和 Size作为其参数
PointtopLeft=newPoint(0,0);
SizehowBig=newSize(50,50);
RectanglerectangleArea=newRectangle(topLeft,howBig);
8.3绘制图形和线条
System.Drawing.Graphics 有很多方法,利用这些方法可以绘制各种线条、空心图形和实心图形。
表8.2所示的列表并不完整,但给出了主要的方法。
本书只讲解对直线、空实心矩形及椭圆进行绘制,其它图形的绘制感兴趣的同学可以查阅MSDN。
表 8.2 绘制图形的基本方法
方 法
常 见 参 数
绘制的图形
DrawLine
钢笔、起点和终点
一段直线
DrawRectangle
钢笔、位置和大小
空心矩形
DrawEllipse
钢笔、位置和大小
空心椭圆
FillRectangle
画笔、位置和大小
实心矩形
FillEllipse
画笔、位置和大小
实心椭圆
DrawLines
钢笔、点数组
一组线,把数组中的每个点按顺序连接起来
DrawBezier
钢笔、4个点
通过两个端点的一条光滑曲线,剩余的两个点用于控制曲线的形状
DrawCurve
钢笔、点数组
通过点的一条光滑曲线
DrawArc
钢笔、矩形、两个角
由角度定义的矩形中圆的一部分
DrawClosedCurve
钢笔、点数组
与DrawCurve一样,但还要绘制一条用以闭合曲线的直线
DrawPie
钢笔、矩形、两个角
矩形中的空心楔形
FillPie
画笔、矩形、两个角
矩形中的实心楔形
DrawPolygon
钢笔、点数组
与DrawLines 一样,但还要连接第一点和最后一点,以闭合绘制的图形
8.3.1 画直线
(1)绘制一条连接两个 Point 结构的线,
publicvoidDrawLine(
Pen pen,
Point start,
Point end
)
pen,它确定线条的颜色、宽度和样式。
start,Point 结构,它表示要连接的第一个点。
end ,Point 结构,它表示要连接的第二个点。
下面代码绘制如图8.1所示的直线,其颜色分别为黑、红、黄及指定的RGB值,宽度分别为3,5,7,9。
Graphicsg=this.CreateGraphics();
//创建不同颜色及精细的画笔
PenblackPen=newPen(Color.Black,3);
PenredPen=newPen(Color.Red,5);
PenyellowPen=newPen(Color.Yellow,7);
Penmypen=newPen(Color.FromArgb(167,234,89),9);
//绘制黑线
Pointstart1=newPoint(100,100);
Pointend1=newPoint(200,200);
g.DrawLine(blackPen,start1,end1);
//绘制红线
Pointstart2=newPoint(200,100);
Pointend2=newPoint(300,200);
g.DrawLine(redPen,start2,end2);
//绘制黄线
Pointstart3=newPoint(300,100);
Pointend3=newPoint(400,200);
g.DrawLine(yellowPen,start3,end3);
//绘制RGB为(167,234,89)的直线
Pointstart4=newPoint(400,100);
Pointend4=newPoint(500,200);
g.DrawLine(mypen,start4,end4);
图 8.1 直线
(2)虚线
Pen 的DashStyle属性,可以绘制虚线。
格式为
myPen.DashStlyle= DashStyle.类型
下面的示例绘制如图8.2所示的虚线,其虚线类型分别为:
Dash,Dot,DashDot,DashDotDot。
Graphicsg=this.CreateGraphics();
PenblackPen=newPen(Color.Black,3);
PenredPen=newPen(Color.Red,5);
PenyellowPen=newPen(Color.Yellow,7);
Penmypen=newPen(Color.FromArgb(167,234,89),9);
blackPen.DashStyle=DashStyle.Dash;
redPen.DashStyle=DashStyle.Dot;
yellowPen.DashStyle=DashStyle.DashDot;
mypen.DashStyle=DashStyle.DashDotDot;
//Createpointsthatdefineline.
Pointstart1=newPoint(100,100);
Pointend1=newPoint(200,200);
g.DrawLine(blackPen,start1,end1);
Pointstart2=newPoint(200,100);
Pointend2=newPoint(300,200);
g.DrawLine(redPen,start2,end2);
Pointstart3=newPoint(300,100);
Pointend3=newPoint(400,200);
g.DrawLine(yellowPen,start3,end3);
Pointstart4=newPoint(400,100);
Pointend4=newPoint(500,200);
g.DrawLine(mypen,start4,end4);
图 8.2 虚线
(3)直线端点
以使用 Pen 对象的属性为直线设置更多特性。
StartCap 属性和 EndCap 属性指定直线端点的外观;端点可以是平的、方形的、圆形的、三角形的或自定义的形状。
LineJoin 属性用于指定连接的线相互间是斜接的(联接时形成锐角)、斜切的、圆形的还是截断的。
下面的代码绘制如图8.3所示带端点的直线
Graphicsg=this.CreateGraphics();
PenblackPen=newPen(Color.Black,3);
PenredPen=newPen(Color.Red,5);
PenyellowPen=newPen(Color.Yellow,7);
Penmypen=newPen(Color.FromArgb(167,234,89),9);
blackPen.StartCap=LineCap.Flat;
blackPen.EndCap=LineCap.ArrowAnchor;
redPen.StartCap=LineCap.DiamondAnchor;
redPen.EndCap=LineCap.RoundAnchor;
yellowPen.EndCap=LineCap.SquareAnchor;
mypen.EndCap=LineCap.Triangle;
//Createpointsthatdefineline.
Pointstart1=newPoint(100,100);
Pointend1=newPoint(200,200);
g.DrawLine(blackPen,start1,end1);
Pointstart2=newPoint(200,100);
Pointend2=newPoint(300,200);
g.DrawLine(redPen,start2,end2);
Pointstart3=newPoint(300,100);
Pointend3=newPoint(400,200);
g.DrawLine(yellowPen,start3,end3);
Pointstart4=newPoint(400,100);
Pointend4=newPoint(500,200);
g.DrawLine(mypen,start4,end4);
图8.3 带端点的直线
8.3.2 画空心矩形
绘制由 Rectangle 结构指定的矩形
publicvoidDrawRectangle(
Pen pen,
Rectangle rect
)
pen ,Pen,它确定矩形的颜色、宽度和样式。
rect ,表示要绘制的矩形的 Rectangle 结构。
下面代码分别绘制如图8.4所示的矩形,
Graphicsg=this.CreateGraphics();
PenblackPen=newPen(Color.Black,3);
//blackPen.DashStyle=DashStyle.Dash;
// 建立矩形.
Rectanglerect=newRectangle(100,100,200,200);
// 绘制黑色矩形
g.DrawRectangle(blackPen,rect);
PenredPen=newPen(Color.Red,5);
//设置矩形虚线的类型
redPen.DashStyle=DashStyle.Dash;
// 建立矩形.
Rectanglerectred=newRectangle(320,100,200,200);
// 绘制红色矩形
g.DrawRectangle(redPen,rectred);
图8.4 矩形
8.3.3 画实心矩阵
填充 Rectangle 结构指定的矩形的内部
格式:
publicvoidFillRectangle(
Brush brush,
Rectangle rect
)
brush ,确定填充特性的 Brush。
rect ,Rectangle 结构,它表示要填充的矩形。
∙ 下面代码绘制如图8.5所示的实心矩形
Graphicsg=this.CreateGraphics();
//建立黑色画笔
SolidBrushblackBrush=newSolidBrush(Color.Black);
// 构建矩形对象.
Rectanglerect=newRectangle(100,100,200,200);
// 画黑实心矩形.
g.FillRectangle(blackBrush,rect);
//建立灰色画笔
SolidBrushgrayBrush=newSolidBrush(Color.Gray);
Rectanglerectgray=newRectangle(320,100,200,200);
g.FillRectangle(grayBrush,rectgray);
图 8.5 实形矩形
8.3.4 画空心椭圆
格式:
publicvoidDrawEllipse(
Pen pen,
Rectangle rect
)
下面代码绘制如图8.6所示的空心椭圆
Graphicsg=this.CreateGraphics();
PenblackPen=newPen(Color.Black,3);
//构建矩形对象.
Rectanglerect=newRectangle(100,100,200,100);
// 画空心空心椭圆.
g.DrawEllipse(blackPen,rect);
Rectanglerectgray=newRectangle(320,100,200,100);
//建立灰色画笔
PengrayPen=newPen(Color.Gray,5);
//指定虚线类型
grayPen.DashStyle=DashStyle.DashDotDot;
//绘制虚线椭圆
g.DrawEllipse(grayPen,rectgray);
图 8.6 空心椭圆
8.3.5 绘制弧线
弧线是椭圆的一部分。
若要绘制弧线,可调用 Graphics 类的 DrawArc 方法。
除了 DrawArc 需要有起始角度和仰角以外,DrawEllipse 方法的参数与 DrawArc 方法的参数相同。
publicvoidDrawArc(
Pen pen,
RectangleF rect,