




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、超全面的.NET GDI+图形图像编程教程GDI+绘图基础编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口)。从程序设计的角度看,GDI包括两部分:GDI对象和GDI函数。GDI对象定义了GDI函数使用的工具和环境变量;而GDI函数使用GDI对象绘制各种图形。在C#中,进行图形程序编写时用到的是GDI+(Graphics Device Interface Plus,图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便。1 GDI+概述GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管
2、代码的类来实现,这套类被称为GDI+的“托管类接口”。GDI+主要提供了一下三类服务:1.二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。2.图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和奥村BMP、JPG、GIF等图像格式。3.文字显示:GDI+支持使用各种字体、字号和样式来显示文本。我们要进行图形编程,就必须先讲解Graphics类,同时我们还必须掌握Pen、Brush和Rectangle这几种类。GDI+比
3、GDI优越主要表现在两个方面:1.GDI+通过提供新功能(例如:渐变画笔和Alpha混合)扩展了GDI的功能;2.修订了编程模型,是图形编程更加简易灵活。2 Graphics类Graphics类封装一个GDI+绘图图面,提供将对象绘制到现实设备的方法,Graphics与特定的设备上下文关联。画图方法都被包括在Graphics类中国,在画任何对象(例如:Circle Rectangle)时,我们首先要创建一个Graphics类实例,这个实例相当于建立了一块画布,有了画布才可以用各种画图方法进行绘图。绘图程序的设计过程一般分为两个步骤:1.创建Graphics;2.使用Graphics对象的方法绘
4、图、显示文本或处理图像。通常我们使用下述三种方法来创建一个Graphics对象:方法一:利用控件或窗体的Paint事件中的PaintEventArgs在窗体或控件的Paint事件中接受对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用的Graphics)的一部分,在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。例如:创建Graphics对象的两种方法1. /窗体的Paint事件的响应方法2. privatevoidFrm_Demo_Paint(objectsender,PaintEventArgse)3. 4. Graphics_G
5、raphics=e.Graphics;5. 6. 7. /也可以直接重载控件或窗体的OnPaint方法8. protectedoverridevoidOnPaint(PaintEventArgse)9. 10. Graphics_Graphics=e.Graphics;11. 12. 13. 创建Graphics对象的两种方法Paint事件在重绘控件时发生。方法二:调用某控件或窗体的CreateGraphics方法调用某控件或窗体的CreateGraphics方法以获取对Graphics对象的引用,该对象表示该控件或窗体的绘图图面。如果想在已存在的窗体或控件上绘图,通常会使用此方法,例如:1.
6、 1Graphics_Graphics=this.CreateGraphics();/在当前窗体上创建Graphics对象方法三:调用Graphics类的FromImage静态方法由从Image集成的任何对象创建Graphics对象。在需要更改已存在的图像时,通常会使用此方法。例如:使用Graphics.FromImage()方法 创建Graphics对象1. Imageimg=Image.FromFile(孤影.jpg);/建立Image对象2. Graphics_Graphics=Graphics.FromImage(img);/创建Graphics对象2.1 Graphics类的方法成员
7、有了一个Graphics的对象引用后,就可以利用该对象的成员进行各种各样图形的绘制,下面表格列出了Graphics类的常用方法成员:Graphics类常用方法成员名称说明名称说明DrawArc画弧DrawBezier画立体的贝尔塞曲线DrawBeziers画连续立体的贝尔塞曲线DrawClosedCurve画闭合曲线DrawCurve画曲线DrawEllipse画椭圆DrawImage画图像DrawLine画线DrawPath通过路径画线和曲线DrawPie画饼形DrawPolygon画多边形DrawRectangle画矩形DrawString绘制文字FillEllipse填充椭圆FillPa
8、th填充路径FillPie填充饼图FillPolygon填充多边形FillRectangle填充矩形FillRectangles填充矩形组FillRegion填充区域在.NET中,GDI+的所有绘图功能都包括在System、System.Drawimg、System.Drawimg.Imaging、System.Drawimg.Drawimg2D和System.Drawimg.Text等命名空间中,因此开始用GDI+类之前,需要先引用相应的命名空间。2.2 引用命名空间在C#应用程序中使用using命令引用给定的命名空间或类,下面是一个C#应用程序引用命名空间的例子:引用命名空间1. usin
9、gSystem;2. usingSystem.Collections.Generic;3. usingSystem.Data;4. usingSystem.ComponentModel;5. usingSystem.Drawing;6. usingSystem.Drawing.Drawing2D;7. usingSystem.Drawing.Imaging;8. 9. 引用命名空间3 常用画图对象在创建了Graphics对象后,就可以用它开始绘图了,可以画线、填充图形、显示文本等等,其中主要用到的对象还有:Pen:用来用patterns、colors或者bitmaps进行填充Color:用来画
10、线和多边形,包括矩形、圆和饼形Font:用来给文字设置字体格式Brush:用来描述颜色Rectangle:矩形结构通常用来在窗体上画矩形Point:描述一对有序的x,y两个坐标值3.1 Pen类Pen类用来绘制指定宽度和样式的直线。使用DashStyle属性绘制几种虚线,可以使用各种各样填充样式(包括纯色和纹理)来填充Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理。使用画笔时,需要先实例化一个画笔对象,主要有以下几种方法:实例化画笔对象1. /用指定的颜色实例化一只画笔2. publicPen(Color);3. 4. /用指定的画刷实例化一只画笔5. publicPen(Brush
11、);6. 7. /用指定的画刷和宽度实例化一只画笔8. publicPen(Brush,float);9. 10. /用指定的颜色和宽度实例化一只画笔11. publicPen(Color,float);12. 13. /实例化画笔格式如下:14. Penpen=newPen(Color.Blue);15. /或者:16. Penpen=newPen(Color.Blue,100);17. 18. 实例化画笔对象Pen常用的属性如下:Pen常用属性名称说明名称说明Alignment获得或者设置画笔的对齐方式Brush获得或者设置画笔的属性Color获得或者设置画笔的颜色Width获得或者设置画
12、笔的宽度3.2 Color结构在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成。在GDI+中,通过Color结构封装对颜色的定义,Color结构中,除了提供(A,R,G,B)以外,还提供许多系统定义的颜色,如Pink(粉色)。另外,还提供许多静态成员,用户对颜色进行操作。Color结构的基本属性如下表:颜色的基本属性名称说明A获取此Color结构的Alpha分量值,取值(0255)R获取此Color结构的红色分量值,取值(0255)G获取此Color结构的绿色分量值,取值(0255)B获取此Color结构的蓝色分量值,取值(0255)Name获取此Color结构的名称,这将返回用
13、户定义的颜色的名称或已知颜色的名称(如果该颜色是从某个名称创建的)。对于自定义的颜色,这将返回RGB值。Color结构的基本(静态)方法如下表:颜色的基本方法名称说明FromArgb从四个8位的ARGB分量(Alpha、红色、绿色和蓝色)值创建Color结构FromKnowColor从指定饿预定义颜色创建一个Color结构FromName从预定义颜色的指定名称创建一个Color结构。Color结构变量可以通过已有颜色构造,也可以通过RGB建立,例如:创建Color构造对象1. Colorcolor1=Color.FromArgb(96,06,25);2. Colorcolor2=Color.F
14、romKnownColor(KnownColor.Blue);/KnowColor为枚举类型3. Colorcolor3=Color.FromName(LightBlue);在图像处理中一般需要获取或设置像素的颜色值,获取一幅图像的某个像素颜色值得具体步骤如下:1.定义Bitmap1. Bitmapbitmap=newBitmap(D:孤影LonelyShadow.bmp);2.定义一个颜色变量,把在指定位置所取得的像素值存入颜色变量中1. Colorcolor=newColor();2. color=bitmap.GetPixel(10,10);/获取此Bitmap中指定像素的颜色3.将颜色
15、值分解出单色分量值1. intr,g,b;2. r=color.R;3. g=color.G;4. b=color.B;3.3 Font类Font类定义特定文本格式,包括字体、字号和字形属性。Font类的常用构造函数是:publicFont(string字体名,float字号, FontStyle 字形)其中字号和字体为可选项publicFont(string字体名,float字号)其中字体名为Font的FontFamily的字符串表示形式下面是定义一个F哦你团队相爱难过的示例代码:1. FontFamilyfontFamily=newFontFamily(Arial);2. Fontfont
16、=newFont(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel);字体常用属性如下表:字体的常用属性名称说明名称说明Bold是否为粗体FontFamily字体成员Height字体高Italic是否为斜体Name字体名称Size字体尺寸SizeInPoints获取此Font对象的字号,以磅为单位Strikeout是否有删除线Style字体类型UnderlineUnitUnit字体尺寸单位3.4 Brush类Brush类是一个抽象的基类,因此它不能被实例化,我们总是用它的派生类进行实例化一个画刷的对象,当我们对图形内部进行填充操作时就会用到画
17、刷,关于画刷在 1.5 中有详细的讲解。3.5 Rectangle结构存储一组整数,共四个,表示一个矩形的位置和大小。矩形结构通常用来在窗体上画矩形,除了利用它的构造函数矩形对象外,还可以利用Rectangle结构的属性成员,其属性成员如下表:Rectangle结构属性名称说明名称索命Bottom底端坐标Height矩形高IsEmpty测试矩形宽和高是否为0Left矩形左边坐标Location矩形的位置Right矩形右边坐标Size矩形尺寸Top矩形顶端坐标Width矩形宽X矩形左上角顶点X坐标Y矩形左上角顶点Y坐标Rectangle结构的构造函数有以下两个:Rectangle结构的构造函数1
18、. /用指定的位置和大小初始化Rectangle类的新实例2. publicRectangle(Point,Size);/Size结构存储一个有序整数对,通常为矩形的宽度和高度3. publicRectangle(int,int,int,int);1.3.6 Point结构用指定坐标初始化Point类的新实例,这个结构很像C+的Point结构,它描述了一对有序的x,y两个坐标值,其构造函数为:publicPoint(intx,inty);其中x为该点的水平位置;y为该点的垂直位置。下面是构造Point对象的示例代码:1. Pointpt1=newPoint(30,30);2. Pointpt2
19、=newPoint(110,110);4 基本图形绘制举例4.1 画一个矩形建一个C#.NET WinForms窗体应用程序,通过在窗体的OnPaint事件中绘制一个填充的渐变矩形:填充矩形方法FillRectangle()的语法帮助定义如下:填充矩形的方法FillRectangle() 语法定义1. /2. /摘要:3. /填充System.Drawing.Rectangle结构指定的矩形的内部。4. /5. /参数:6. /brush:7. /确定填充特性的System.Drawing.Brush。8. /9. /rect:10. /System.Drawing.Rectangle结构,它
20、表示要填充的矩形。11. /12. /异常:13. /System.ArgumentNullException:14. /brush为null。15. publicvoidFillRectangle(Brushbrush,Rectanglerect);16. /17. /摘要:18. /填充System.Drawing.RectangleF结构指定的矩形的内部。19. /20. /参数:21. /brush:22. /确定填充特性的System.Drawing.Brush。23. /24. /rect:25. /System.Drawing.RectangleF结构,它表示要填充的矩形。26.
21、 /27. /异常:28. /System.ArgumentNullException:29. /brush为null。30. publicvoidFillRectangle(Brushbrush,RectangleFrect);31. /32. /摘要:33. /填充由一对坐标、一个宽度和一个高度指定的矩形的内部。34. /35. /参数:36. /brush:37. /确定填充特性的System.Drawing.Brush。38. /39. /x:40. /要填充的矩形的左上角的x坐标。41. /42. /y:43. /要填充的矩形的左上角的y坐标。44. /45. /width:46.
22、/要填充的矩形的宽度。47. /48. /height:49. /要填充的矩形的高度。50. /51. /异常:52. /System.ArgumentNullException:53. /brush为null。54. publicvoidFillRectangle(Brushbrush,floatx,floaty,floatwidth,floatheight);55. /56. /摘要:57. /填充由一对坐标、一个宽度和一个高度指定的矩形的内部。58. /59. /参数:60. /brush:61. /确定填充特性的System.Drawing.Brush。62. /63. /x:64.
23、/要填充的矩形的左上角的x坐标。65. /66. /y:67. /要填充的矩形的左上角的y坐标。68. /69. /width:70. /要填充的矩形的宽度。71. /72. /height:73. /要填充的矩形的高度。74. /75. /异常:76. /System.ArgumentNullException:77. /brush为null。78. publicvoidFillRectangle(Brushbrush,intx,inty,intwidth,intheight);79. 80. 填充矩形的方法FillRectangle()语法定义我们在这里只使用第一种定义,演示填充矩形,示例
24、代码如下:画一个颜色渐变的矩形1. /2. /窗体的Paint事件的响应方法3. /4. /当前事件触发者(当前窗体)5. /附带的事件参数6. privatevoidFrm_Demo_Paint(objectsender,PaintEventArgse)7. 8. Graphicsg=e.Graphics;/创建当前窗体的Graphics对象9. Rectanglerect=newRectangle(50,30,100,100);/创建一个矩形(x,y,width,height)10. /创建线性渐变画刷(画刷界限,起始颜色,结束颜色,渐变角度)11. LinearGradientBrush
25、lBrush=newLinearGradientBrush(rect,Color.Purple,Color.LightBlue,LinearGradientMode.BackwardDiagonal);12. g.FillRectangle(lBrush,rect);/走起13. 14. 15. 画一个颜色渐变的矩形上述代码运行效果如下:4.2 画一个弧画弧线的语法定义如下:画弧线方法DrawArc()的定义1. /2. /摘要:3. /绘制一段弧线,它表示System.Drawing.Rectangle结构指定的椭圆的一部分。4. /5. /参数:6. /pen:7. /System.Dra
26、wing.Pen,它确定弧线的颜色、宽度和样式。8. /9. /rect:10. /System.Drawing.RectangleF结构,它定义椭圆的边界。11. /12. /startAngle:13. /从x轴到弧线的起始点沿顺时针方向度量的角(以度为单位)。14. /15. /sweepAngle:16. /从startAngle参数到弧线的结束点沿顺时针方向度量的角(以度为单位)。17. /18. /异常:19. /System.ArgumentNullException:20. /pen为null。21. publicvoidDrawArc(Penpen,Rectanglerect
27、,floatstartAngle,floatsweepAngle);22. 23. 画弧线方法DrawArc()的定义参照定义的帮助,可写出如下画弧线的代码:画弧线示例代码1. /2. /窗体的Paint事件的响应方法3. /4. /当前事件触发者(当前窗体)5. /附带的事件参数6. privatevoidFrm_Demo_Paint(objectsender,PaintEventArgse)7. 8. Graphicsgraphics=e.Graphics;9. Penpen=newPen(Color.Blue);10. Rectanglerect=newRectangle(50,50,2
28、00,100);11. graphics.DrawArc(pen,rect,12,84);12. 13. 14. 画弧线示例代码上述代码运行结果如下:4.3 画线画线DrawLine()方法的语法定义如下:DrawLine()语法定义1. /2. /摘要:3. /绘制一条连接两个System.Drawing.Point结构的线。4. /5. /参数:6. /pen:7. /System.Drawing.Pen,它确定线条的颜色、宽度和样式。8. /9. /pt1:10. /System.Drawing.Point结构,它表示要连接的第一个点。11. /12. /pt2:13. /System.
29、Drawing.Point结构,它表示要连接的第二个点。14. /15. /异常:16. /System.ArgumentNullException:17. /pen为null。18. publicvoidDrawLine(Penpen,Pointpt1,Pointpt2);19. /20. /摘要:21. /绘制一条连接两个System.Drawing.PointF结构的线。22. /23. /参数:24. /pen:25. /System.Drawing.Pen,它确定线条的颜色、宽度和样式。26. /27. /pt1:28. /System.Drawing.PointF结构,它表示要连接
30、的第一个点。29. /30. /pt2:31. /System.Drawing.PointF结构,它表示要连接的第二个点。32. /33. /异常:34. /System.ArgumentNullException:35. /pen为null。36. publicvoidDrawLine(Penpen,PointFpt1,PointFpt2);37. /38. /摘要:39. /绘制一条连接由坐标对指定的两个点的线条。40. /41. /参数:42. /pen:43. /System.Drawing.Pen,它确定线条的颜色、宽度和样式。44. /45. /x1:46. /第一个点的x坐标。4
31、7. /48. /y1:49. /第一个点的y坐标。50. /51. /x2:52. /第二个点的x坐标。53. /54. /y2:55. /第二个点的y坐标。56. /57. /异常:58. /System.ArgumentNullException:59. /pen为null。60. publicvoidDrawLine(Penpen,floatx1,floaty1,floatx2,floaty2);61. /62. /摘要:63. /绘制一条连接由坐标对指定的两个点的线条。64. /65. /参数:66. /pen:67. /System.Drawing.Pen,它确定线条的颜色、宽度和
32、样式。68. /69. /x1:70. /第一个点的x坐标。71. /72. /y1:73. /第一个点的y坐标。74. /75. /x2:76. /第二个点的x坐标。77. /78. /y2:79. /第二个点的y坐标。80. /81. /异常:82. /System.ArgumentNullException:83. /pen为null。84. publicvoidDrawLine(Penpen,intx1,inty1,intx2,inty2);85. 86. DrawLine()语法定义根据定义的帮助,我们以第一种语法 可以写出如下示例代码:画线DrawLine()函数示例代码1. /2
33、. /窗体的Paint事件的响应方法3. /4. /当前事件触发者(当前窗体)5. /附带的事件参数6. privatevoidFrm_Demo_Paint(objectsender,PaintEventArgse)7. 8. Graphicsgraphics=e.Graphics;/创建当前窗体的Graphics对象9. Penpen=newPen(Color.Blue);/创建蓝色画笔对象10. PointpointStart=newPoint(30,30);/创建起始点11. PointpointEnd=newPoint(150,150);/创建结束点12. graphics.DrawL
34、ine(pen,pointStart,pointEnd);/画线13. 14. 15. 画线DrawLine()函数示例代码上述代码运行效果图如下:4.4 画椭圆还是先看一下DrawEllipse()画椭圆的语法定义:画椭圆方法 DrawEllipse()语法定义1. /2. /摘要:3. /绘制边界System.Drawing.Rectangle结构指定的椭圆。4. /5. /参数:6. /pen:7. /System.Drawing.Pen,它确定曲线的颜色、宽度和样式。8. /9. /rect:10. /System.Drawing.Rectangle结构,它定义椭圆的边界。11. /1
35、2. /异常:13. /System.ArgumentNullException:14. /pen为null。15. publicvoidDrawEllipse(Penpen,Rectanglerect);16. /17. /摘要:18. /绘制边界System.Drawing.RectangleF定义的椭圆。19. /20. /参数:21. /pen:22. /System.Drawing.Pen,它确定曲线的颜色、宽度和样式。23. /24. /rect:25. /System.Drawing.RectangleF结构,它定义椭圆的边界。26. /27. /异常:28. /System.A
36、rgumentNullException:29. /pen为null。30. publicvoidDrawEllipse(Penpen,RectangleFrect);31. /32. /摘要:33. /绘制一个由边框(该边框由一对坐标、高度和宽度指定)定义的椭圆。34. /35. /参数:36. /pen:37. /System.Drawing.Pen,它确定曲线的颜色、宽度和样式。38. /39. /x:40. /定义椭圆的边框的左上角的X坐标。41. /42. /y:43. /定义椭圆的边框的左上角的Y坐标。44. /45. /width:46. /定义椭圆的边框的宽度。47. /48.
37、 /height:49. /定义椭圆的边框的高度。50. /51. /异常:52. /System.ArgumentNullException:53. /pen为null。54. publicvoidDrawEllipse(Penpen,floatx,floaty,floatwidth,floatheight);55. /56. /摘要:57. /绘制一个由边框定义的椭圆,该边框由矩形的左上角坐标、高度和宽度指定。58. /59. /参数:60. /pen:61. /System.Drawing.Pen,它确定曲线的颜色、宽度和样式。62. /63. /x:64. /定义椭圆的边框的左上角的X
38、坐标。65. /66. /y:67. /定义椭圆的边框的左上角的Y坐标。68. /69. /width:70. /定义椭圆的边框的宽度。71. /72. /height:73. /定义椭圆的边框的高度。74. /75. /异常:76. /System.ArgumentNullException:77. /pen为null。78. publicvoidDrawEllipse(Penpen,intx,inty,intwidth,intheight);79. 80. 画椭圆方法DrawEllipse()语法定义参照上面的语法定义,我们根据第一种语法,可以写出如下示例代码:画椭圆DrawEllipse
39、()函数示例代码1. /2. /窗体的Paint事件的响应方法3. /4. /当前事件触发者(当前窗体)5. /附带的事件参数6. privatevoidFrm_Demo_Paint(objectsender,PaintEventArgse)7. 8. Graphicsgraphics=e.Graphics;/创建当前窗体的Graphics对象9. Penpen=newPen(Color.Blue,100);/创建蓝色粗细为100的画笔对象10. Rectanglerect=newRectangle(50,50,200,100);/创建椭圆所在的矩形范围11. graphics.DrawEllipse(pen,rect);/在指定的范围内画椭圆12. 13. 14. 画椭圆DrawEll
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 违反纪律学生协议书6篇
- 续签租赁合同申请书的范文7篇
- 合同协议范文厂地出租合同2篇
- 生鲜家禽直销连锁店供货协议
- 日常保洁简易合同范本
- 中空设备出售合同范本
- 房租大小合同范本
- 短驳运输合同范本
- 房子买卖协议合同范本
- 商铺屋顶租赁合同范本
- 医学资料 容积-粘度吞咽测试(V-VST):吞咽障碍的临床检测方法 学习课件
- 应急广播系统维护管理制度
- 北京市海淀区2024-2025学年八年级上学期期末考试物理试卷
- 体检中心知识
- 开办药店申请书
- 甲状腺腔镜手术课件
- 高一 人教版 英语 必修一第四单元《Lesson 1 Listening and Speaking》课件
- 保险核保岗位招聘笔试题与参考答案(某世界500强集团)2025年
- 中建建筑工程竣工验收指南
- 新时代中小学教师职业行为十项准则
- 《品类管理》教材正文
评论
0/150
提交评论