logo资料库

C#之GDI+编程开发文档.doc

第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
资料共38页,剩余部分请下载后查看
第7章 C#图形图像编程基础
7.1 GDI+绘图基础
7.1.1 GDI+概述
7.1.2 Graphics类
7.1.3 常用画图对象
7.1.4 基本图形绘制举例
7.1.5 画刷和画刷类型
7.2 C#图像处理基础
7.2.1 C#图像处理概述
7.2.2 图像的输入和保存
7.2.3 图像的拷贝和粘贴
7.2.4 彩色图像处理
本章小结
思考与练习(习题)
C#图形图像编程基础 第 7 章 C#图形图像编程基础 本章主要介绍使用 C#进行图形图像编程基础,其中包括 GDI+绘图基础、C#图像处理基 础以及简单的图像处理技术。 7.1 GDI+绘图基础 编写图形程序时需要使用 GDI(Graphics Device Interface,图形设备接口),从 程序设计的角度看,GDI 包括两部分:一部分是 GDI 对象,另一部分是 GDI 函数。GDI 对象定义了 GDI 函数使用的工具和环境变量,而 GDI 函数使用 GDI 对象绘制各种图形, 在 C#中,进行图形程序编写时用到的是 GDI+(Graphics Device Interface Plus 图形 设备接口)版本,GDI+是 GDI 的进一步扩展,它使我们编程更加方便。 7.1.1 GDI+概述 GDI+是微软在 Windows 2000 以后操作系统中提供的新的图形设备接口,其通过一 套部署为托管代码的类来展现,这套类被称为 GDI+的“托管类接口”,GDI+主要提供了 以下三类服务: (1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形 基元绘制方式信息的类以及实际进行绘制的类。 (2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图 形方式进行处理。因此,GDI+为我们提供了 Bitmap、Image 等类,它们可用于显示、操 作和保存 BMP、JPG、GIF 等图像格式。 (3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。 我们要进行图形编程,就必须先讲解 Graphics 类,同时我们还必须掌握 Pen、Brush 和 Rectangle 这几种类。 GDI+比 GDI 优越主要表现在两个方面:第(一)GDI+通过提供新功能(例如:渐变 画笔和 alpha 混合)扩展了 GDI 的功能;第(二)修订了编程模型,使图形编程更加简 易灵活。 7.1.2 Graphics 类 Graphics 类封装一个 GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics 与特定的设备上下文关联。画图方法都被包括在 Graphics 类中,在画任何对象(例如: Circle, Rectangle)时,我们首先要创建一个 Graphics 类实例,这个实例相当于建立 了一块画布,有了画布才可以用各种画图方法进行绘图。
C#图形图像编程基础 绘图程序的设计过程一般分为两个步骤:(一)创建 Graphics 对象;(二)使用 Graphics 对象的方法绘图、显示文本或处理图像。 通常我们使用下述三种方法来创建一个 Graphics 对象。 方法一、利用控件或窗体的 Paint 事件中的 PainEventArgs 在窗体或控件的 Paint 事件中接收对图形对象的引用,作为 PaintEventArgs (PaintEventArgs 指定绘制控件所用的 Graphics)的一部分,在为控件创建绘制代码 时,通常会使用此方法来获取对图形对象的引用。 例如: //窗体的 Paint 事件的响应方法 private void form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; } 也可以直接重载控件或窗体的 OnPaint 方法,具体代码如下所示: protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; } Paint 事件在重绘控件时发生。 方法二、调用某控件或窗体的 CreateGraphics 方法 调用某控件或窗体的 CreateGraphics 方法以获取对 Graphics 对象的引用,该对象表示 该控件或窗体的绘图图面。如果想在已存在的窗体或控件上绘图,通常会使用此方法。 例如: Graphics g = this.CreateGraphics(); 方法三、调用 Graphics 类的 FromImage 静态方法 由从 Image 继承的任何对象创建 Graphics 对象。在需要更改已存在的图像时,通常会 使用此方法。 例如: //名为“g1.jpg”的图片位于当前路径下 Image img = Image.FromFile("g1.jpg");//建立 Image 对象 Graphics g = Graphics.FromImage(img);//创建 Graphics 对象 1.Graphics 类的方法成员 有了一个 Graphics 的对象引用后,就可以利用该对象的成员进行各种各样图形的 绘制,表 7.1 列出了 Graphics 类的常用方法成员。 表 7.1 Graphics 类常用方法 名称 DrawArc DrawBezier 说明 画弧。 画立体的贝尔塞曲线。
C#图形图像编程基础 DrawBeziers DrawClosedCurve 画连续立体的贝尔塞曲线。 画闭合曲线。 DrawCurve DrawEllipse DrawImage DrawLine DrawPath DrawPie DrawPolygon DrawRectangle DrawString FillEllipse FillPath FillPie FillPolygon FillRectangle FillRectangles FillRegion 画曲线。 画椭圆。 画图像。 画线。 通过路径画线和曲线。 画饼形。 画多边形。 画矩形。 绘制文字。 填充椭圆。 填充路径。 填充饼图。 填充多边形。 填充矩形。 填充矩形组。 填充区域。 在 .NET 中 , GDI+ 的 所 有 绘 图 功 能 都 包 括 在 System 、 System.Drawing 、 System.Drawing.Imaging、System.Drawing.Darwing2D 和 System.Drawing.Text 等命名 空间中,因此在开始用 GDI+类之前,需要先引用相应的命名空间。 2.引用命名空间 在 C#应用程序中使用 using 命令已用给定的命名空间或类,下面是一个 C#应用程 序引用命名空间的例子: using System; using System.Collections.Generic; using System.Data; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; 7.1.3 常用画图对象 在创建了 Graphics 对象后,就可以用它开始绘图了,可以画线、填充图形、显示 文本等等,其中主要用到的对象还有:  Pen:用来用 patterns、colors 或者 bitmaps 进行填充。
C#图形图像编程基础  Color:用来画线和多边形,包括矩形、圆和饼形。  Font:用来给文字设置字体格式。  Brush:用来描述颜色。  Rectangle:矩形结构通常用来在窗体上画矩形。  Point:描述一对有序的 x,y 两个坐标值。 1.Pen 类 Pen 用来绘制指定宽度和样式的直线。使用 DashStyle 属性绘制几种虚线,可以使用各 种填充样式(包括纯色和纹理)来填充 Pen 绘制的直线,填充模式取决于画笔或用作填充对 象的纹理。 使用画笔时,需要先实例化一个画笔对象,主要有以下几种方法。 用指定的颜色实例化一只画笔的方法如下: public Pen(Color); 用指定的画刷实例化一只画笔的方法如下: public Pen(Brush); 用指定的画刷和宽度实例化一只画笔的方法如下: public Pen(Brush, float); 用指定的颜色和宽度实例化一只画笔的方法如下: public Pen(Color, float); 实例化画笔的语句格式如下: Pen pn=new Pen(Color.Blue); 或者 Pen pn=new Pen(Color.Blue,100); Pen 常用的属性有以下几个,如表 7.2 所示: 表 7.2 Pen 常用属性 名称 说明 Alignment 获得或者设置画笔的对齐方式。 Brush Color Width 获得或者设置画笔的属性。 获得或者设置画笔的颜色。 获得或者设置画笔的宽度。 2.Color 结构 在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成。在 GDI+中,通过 Color 结构封装对颜色的定义,Color 结构中,除了提供(A,R,G,B)以外,还提供许多 系统定义的颜色,如 Pink(粉颜色),另外,还提供许多静态成员,用于对颜色进行操 作。Color 结构的基本属性如表 7.3 所示。 名称 A B 表 7.3 颜色的基本属性 说明 获取此 Color 结构的 alpha 分量值,取值(0~255)。 获取此 Color 结构的蓝色分量值,取值(0~255)。
C#图形图像编程基础 G R Name 获取此 Color 结构的绿色分量值,取值(0~255)。 获取此 Color 结构的红色分量值,取值(0~255)。 获取此 Color 结构的名称,这将返回用户定义的颜色的名称 或已知颜色的名称(如果该颜色是从某个名称创建的),对于 自定义的颜色,将返回 RGB 值。 Color 结构的基本(静态)方法如表 7.4 所示 名称 FromArgb 表 7.4 颜色的基本方法 说明 从四个 8 位 ARGB 分量(alpha、红色、绿色和蓝色)值创建 Color 结构。 FromKnowColor 从指定的预定义颜色创建一个 Color 结构。 FromName 从预定义颜色的指定名称创建一个 Color 结构。 Color 结构变量可以通过已有颜色构造,也可以通过 RGB 建立,例如: Color clr1 = Color.FromArgb(122,25,255); Color clr2 = Color.FromKnowColor(KnowColor.Brown);//KnownColor 为枚举类型 Color clr3 = Color.FromName("SlateBlue"); 在图像处理中一般需要获取或设置像素的颜色值,获取一幅图像的某个像素颜色值 的具体步骤如下: (1)定义 Bitmap Bitmap myBitmap = new Bitmap("c:\\MyImages\\TestImage.bmp"); (2)定义一个颜色变量把在指定位置所取得的像素值存入颜色变量中 Color c = new Color(); c = myBitmap.GetPixel(10,10);//获取此 Bitmap 中指定像素的颜色。 (3)将颜色值分解出单色分量值 int r,g,b; r= c.R; g=c.G; b=c.B; 3.Font 类 Font 类定义特定文本格式,包括字体、字号和字形属性。Font 类的常用构造函数 是 public Font(string 字体名,float 字号,FontStyle 字形),其中字号和字体 为可选项和 public Font(string 字体名,float 字号),其中“字体名”为 Font 的 FontFamily 的字符串表示形式。下面是定义一个 Font 对象的例子代码: FontFamily fontFamily = new FontFamily("Arial"); Font font = new Font(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel); 字体常用属性如表 7.5 所示。 表 7.5 字体的常用属性
C#图形图像编程基础 名称 Bold 说明 是否为粗体。 FontFamily 字体成员。 Height Italic Name Size 字体高。 是否为斜体。 字体名称。 字体尺寸。 SizeInPoints 获取此 Font 对象的字号,以磅为单位。 Strikeout 是否有删除线。 Style Underline Unit 字体类型。 是否有下划线。 字体尺寸单位。 4.Brush 类 Brush 类是一个抽象的基类,因此它不能被实例化,我们总是用它的派生类进行实 例化一个画刷对象,当我们对图形内部进行填充操作时就会用到画刷,关于画刷在 7.1.5 中有详细讲解。 5.Rectangle 结构 存储一组整数,共四个,表示一个矩形的位置和大小。矩形结构通常用来在窗体上 画矩形,除了利用它的构造函数构造矩形对象外,还可以使用 Rectangle 结构的属性成 员,其属性成员如表 7.6 所示。 名称 Bottom Height IsEmpty Left Location Right Size Top Width X Y 表 7.6 Rectangle 结构属性 说明 底端坐标 矩形高 测试矩形宽和高是否为 0 矩形左边坐标 矩形的位置 矩形右边坐标 矩形尺寸. 矩形顶端坐标 矩形宽 矩形左上角顶点 X 坐标 矩形左上角顶点 Y 坐标 Retangle 结构的构造函数有以下两个: //用指定的位置和大小初始化 Rectangle 类的新实例。 public Retangle(Point,Size);//Size 结构存储一个有序整数对,通常为矩形的宽度和高度。 和
C#图形图像编程基础 public Rectangle(int,int,int,int); 6.Point 结构 用指定坐标初始化 Point 类的新实例。这个结构很像 C++中的 Point 结构,它描述了 一对有序的 x,y 两个坐标值,其构造函数为:public Point(int x,int y);其中 x 为该点的水 平位置;y 为该点的水垂直位置。下面是构造 Point 对象的例子代码: Point pt1=new Point(30,30); Point pt2=new Point(110,100); 7.1.4 基本图形绘制举例 1.画一个矩形 【例 7.1】建立一个项目,在窗体上画一个矩形,通过直接在 Form1 类中重载 OnPaint 函数的方法来实现。 图 7.1 画一个矩形 protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics ; Rectangle rect = new Rectangle(50, 30, 100, 100); LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red,Color.Yellow,LinearGradientMode.BackwardDiagonal); g.FillRectangle(lBrush, rect); }
C#图形图像编程基础 运行结果如图 7.1 所示。 2.画一个弧 【例 7.2】画一个弧形。 弧形函数格式如下: public void DrawArc(Pen pen,Rectangle rect,Float startArgle,Float sweepAngle); 直接在 Form1 类中重载 OnPaint 函数 protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics ; Pen pn = new Pen( Color.Blue); Rectangle rect = new Rectangle(50, 50, 200,100); g.DrawArc(pn,rect,12,84); } 运行结果如图 7.2 所示。 图 7.2 画一个弧 3.画线 【例 7.3】画一条线。 protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics ; Pen pn = new Pen(Color.Blue); Point pt1 = new Point(30,30);
分享到:
收藏