第 10 章 GDI+ 绘图

35
第 10 第 GDI+ 第第

description

第 10 章 GDI+ 绘图. 主要内容. GDI+ 中的颜色和坐标 GDI+ 中的绘图对象. 10.1 GDI+ 简介. GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有 Windows 程序的图形输出。 - PowerPoint PPT Presentation

Transcript of 第 10 章 GDI+ 绘图

Page 1: 第 10 章  GDI+ 绘图

第 10 章 GDI+ 绘图

Page 2: 第 10 章  GDI+ 绘图

主要内容

GDI+ 中的颜色和坐标GDI+ 中的绘图对象

Page 3: 第 10 章  GDI+ 绘图

10.1 GDI+ 简介 GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,

它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows 程序的图形输出。

GDI+ 技术是由 GDI 技术“进化”而来,出于兼容性考虑, Windows XP 仍然支持以前版本的 GDI ,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用 GDI+ ,因为 GDI+ 对以前的 Windows 版本中 GDI 进行了优化,并添加了许多新的功能。

GDI+ 是 Window XP 中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过 C++ 类实现的应用程序编程接口。作为图形设备接口的 GDI+ 使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节 , 他们只需调用 GDI+ 库输出的类的一些方法即可完成图形操作 , 真正的绘图工作由这些方法交给特定的设备驱动程序来完成 ,GDI+ 使得图形硬件和应用程序相互隔离 . 从而使开发人员编写设备无关的应用程序变得非常容易。

Page 4: 第 10 章  GDI+ 绘图

GDI+ 新增功能的介绍 1 .渐变的画刷 (Gradient Brushes)

GDI+ 允许用户创建一个沿路径或直线渐变的画刷 , 来填充外形(shapes), 路径 (paths), 区域 (regions), 渐变画刷同样也可以画直线、曲线、路径,当你用一个线形画刷填充一个外形 (shapes) 时,颜色就能够沿外形逐渐变化。

2 .基数样条函数( Cardinal Splines ) GDI +支持基数样条函数,而 GDI 不支持。基数样条是一组单

个曲线按照一定的顺序连接而成的一条较大曲线。样条由一系列点指定,并通过每一个指定的点。由于基数样条平滑地穿过组中的每一个点(不出现尖角),因而它比用直线连接创建的路径更精确。

Page 5: 第 10 章  GDI+ 绘图

GDI+ 新增功能的介绍 3 .持久路径对象( Persistent Path Objects )

在 GDI 中,路径属于设备描述表( DC ),画完后路径就会被破坏。在 GDI+ 中,绘图工作由 Graphics 对象来完成,你可以创建几个与 Graphics 分开的路径对象,绘图操作时路径对象不被破环,这样你就可以多次使用同一个路径对象画路径了。

4 .变形和矩阵对象( Transformations & Matrix Object ) GDI+ 提供了矩阵对象,一个非常强大的工具,使得编写图形

的旋转、平移、缩放代码变得非常容易。一个矩阵对象总是和一个图形变换对相联系起来,比方说,路径对象( PATH )有一个 Transform 方法,它的一个参数能够接受矩阵对象的地址,每次路径绘制时,它能够根据变换矩阵绘制。

Page 6: 第 10 章  GDI+ 绘图

GDI+ 新增功能的介绍

5 .可伸缩区域( Scalable Regions ) GDI+ 在区域( regions )方面对 GDI 进行了改进 ,

在 GDI 中, Regions存储在设备坐标中,对 Regions 惟一可进行图形变换的操作就是对区域进行平移。而 GDI+ 用世界坐标存储区域 (Regions), 允许对区域进行任何图形变换(譬如如图所示的缩放),图形变换以变换矩阵存储。

6 . Alpha Blending (混合)利用 alpha融合,你可以指定填充颜色的透明度,透明颜色与背景色相互融合,填充色越透明,背景色显示越清晰。

Page 7: 第 10 章  GDI+ 绘图

GDI+ 新增功能的介绍

7 .多种图像格式支持 图像在图形界面程序中占有举足轻重的地位, GDI

+除了支持 BMP等 GDI 支持的图形格式外,还支持JPEG ( Joint Photographic Experts Group )、 GIF ( Graphics Interchange Format )、 PNG ( Exchangeable Image File )、 TIFF ( Tag Image File Format )等图像格式,你可以直接在程序中使用这些图片文件,而无需考虑它们所用压缩算法。

8 .其他 GDI+还将支持其他技术,譬如重新着色、颜色校正、元数据、图形容器。

Page 8: 第 10 章  GDI+ 绘图

GDI+ 的工作机理

从本质上来看, GDI+ 为开发者提供了一组实现与各种设备(例如监视器,打印机及其他具有图形化能力但不及涉及这些图形细节的设备)进行交互的库函数。 GDI+ 的本质在于,它能够替代开发人员实现与显示器及其他外设的交互;而从开发者角度来看,要实现与这些设备的直接交互却是一项艰巨的任务。

Page 9: 第 10 章  GDI+ 绘图

下图展示了 GDI+ 在开发人员与上述设备之间起着重要的中介作用。其中, GDI+ 为我们“包办”了几乎一切——从把一个简单的字符串“ HelloWorld” 打印到控制台到绘制直线、矩形甚至是打印一个完整的表单等。

Page 10: 第 10 章  GDI+ 绘图

GDI+ 工作原理 GDI+ 是如何工作的呢?为了弄清这个问题,让我们来

分析一个示例—绘制一条线段。实质上,一条线段就是一个从一个开始位置 (X0 , Y0)到一个结束位置 (Xn ,Yn) 的一系列像素点的集合。为了画出这样的一条线段,设备 ( 在本例中指显示器 ) 需要知道相应的设备坐标或物理坐标。

然而,开发人员不是直接告诉该设备,而是调用 GDI+的 DrawLine() 方法,然后,由 GDI+ 在内存(即“视频内存”)中绘制一条从点 A到点 B 的直线。 GDI+读取点 A 和点 B 的位置,然后把它们转换成一个像素序列,并且指令监视器显示该像素序列。简言之, GDI+把设备独立的调用转换成了一个设备可理解的形式;或者实现相反方向的转换。

Page 11: 第 10 章  GDI+ 绘图

10.2 颜色与坐标

颜色与坐标是 GDI+ 中 2 个核心的东西;颜色用于表达所绘制图形的外观;坐标用于表达所绘制图形的位置;

Page 12: 第 10 章  GDI+ 绘图

GDI+ 的颜色设置

GDI+ 中,很多绘图操作都要涉及颜色的问题,举个简单的例子,我们要绘制一个矩形,就要指定其边框的颜色以及其内部的填充色,当然,我们可以使用 GDI+ 的默认颜色。

GDI+ 中,颜色都封装在 Color结构中。把红、绿、蓝色值传送给 Color结构的一个函数,就可以创建一种颜色。

Page 13: 第 10 章  GDI+ 绘图

设置颜色的几种方法

使用 Color 对象的方法来设置颜色 使用 ColorTranslator 对象的方法来设

置颜色 使用 Color 结构来设置颜色

Page 14: 第 10 章  GDI+ 绘图

使用 Color 对象的方法来设置颜色

Color 对象的方法有 FromArgb() 以及 FromKnownColor()

例 使用 Color 对象的方法设置颜色。 private void button1_Click(object sender, EventArgs e) { button1.ForeColor =Color.FromArgb(255, 0, 0);//Red button1.BackColor = Color.FromKnownColor(KnownColo

r.Blue); //Blue }

Page 15: 第 10 章  GDI+ 绘图

程序运行结果

Page 16: 第 10 章  GDI+ 绘图

程序运行结果解析

FromArgb ()方法中的( Red , Green , Blue )三个参数,分别代表红、绿、蓝颜色光的亮度,每个颜色值分别从 0至 255 分成 256 个亮度等级,数值越大,表示该颜色光越亮。例如:

RGB ( 255 , 0 , 0 )为红色, RGB ( 0 ,255 , 0 )为绿色, RGB ( 0 , 0 , 255 )为蓝色, RGB ( 255 , 0 , 255 )为紫色(红 +蓝)。所以,此程序运行的最终结果是 button1的前景色改为红色,背景色修改为蓝色,如上页 图所示。

Page 17: 第 10 章  GDI+ 绘图

使用 ColorTranslator 对象的方法来设置颜色

ColorTranslator 对象的方法主要有以下 3 种: 使用色彩值来设置颜色,其范围为 0~ (256)3-1 ,下面这行代码表示把 button1 的前景值设为红色:

button1.ForeColor =ColorTranslator.FromOle(255);

使用 Html 的十六进制字符串来设置颜色,下面这行代码表示把 button1 的前景值设为粉红色: button1.ForeColor = ColorTranslator.FromHtml("#FFCCFF");

使用 Windows 色彩值来设置颜色,加上 OX 表示为十六进制色彩数值。下面这行代码表示把 button1 的前景值设为粉红色: button1.ForeColor = ColorTranslator.FromWin32(OXFFCCFF);

Page 18: 第 10 章  GDI+ 绘图

使用 Color 结构来设置颜色

.NET Framework结构中本身就带有 Color结构,其中定义了许多常用的 Color 颜色名称,我们可以直接调用,就可以指定颜色了。下面这行代码表示把 button1 的前景值设为红色: button1.ForeColor = Color.Red;

Page 19: 第 10 章  GDI+ 绘图

GDI+ 中的坐标空间

GDI+ 为我们提供了三种坐标空间:世界坐标系页面坐标系设备坐标系。

Page 20: 第 10 章  GDI+ 绘图

世界坐标系

“世界坐标系”是应用程序用来进行图形输入输出所使用的一种与设备无关的笛卡尔坐标系。通常,我们可以根据自己的需要和方便定义一个自己的世界坐标系,这个坐标系称为用户坐标系,默认时使用像素为单位。

Page 21: 第 10 章  GDI+ 绘图

设备坐标系

“ 设备坐标系”是指显示设备或打印设备坐标系下的坐标,它的特点是以设备上的像素点为单位。对于窗口中的视图而言,设备坐标的原点在客户区的左上角, x 坐标从左向右递增, y 坐标自上而下递增。由于设备的分辨率不同,相同坐标值的物理位置可能不同。如对于边长为 100 的正方形,当显示器为 640 x 480 和 800 x 600 时的大小是不一样的。

Page 22: 第 10 章  GDI+ 绘图

页面坐标系

“页面坐标系”是指某种映射模式下的一种坐标系。所谓映射是指将世界坐标系通过某种方式进行的变换。默认时,设备坐标和页面坐标是一致的。

Page 23: 第 10 章  GDI+ 绘图

坐标的示意图 在实际的绘图中,我们所关注的一般都是指设备坐标系,此坐标系

以像素为单位,像素指的是屏幕上的亮点。每个像素都有一个坐标点与之对应,左上角的坐标设为( 0 , 0 ),向右为正,向下为正。一般情况下以( x , y )代表对象上某个像素的坐标点,其中水平以 X 坐标值表示,垂直以 Y 坐标值表示。下图显示的就是坐标的示意图。

A(0,0)

B(250,0)

D(350,300)

C(0,250)

0,767 (1023,767)

1023,0

Page 24: 第 10 章  GDI+ 绘图

坐标的 4 个相关属性

Left : 表示对象 X 坐标;Top : 表示对象 Y 坐标;Width :表示对象的宽度;Height:表示对象的高度;

Page 25: 第 10 章  GDI+ 绘图

坐标系中几种属性的示意图

A(0,0)

0,767 (1023,767)

1023,0

Left

Top

Height

Width

Page 26: 第 10 章  GDI+ 绘图

10.3 绘图对象的介绍

.NET Framework 提供了许多绘图对象,在这里我们主要讲解一下 Graphics 、 Pen 、 Brush 、 Font 、 Color等 GDI+ 的绘图对象,通过这些对象,我们可以轻松地进行形状、文字、线条、图像的处理。

Page 27: 第 10 章  GDI+ 绘图

Graphics 对象

Graphics 主要是用来建立画布对象的,有 3种基本类型的绘图界面:Windows 和屏幕上的控件要发送给打印机的页面内存中的位图和图像

Page 28: 第 10 章  GDI+ 绘图

在本章中,我们主要讨论的是 Windows 和屏幕上的控件作为绘图界面。 Graphics 对象的创建语法为: Graphics g=控件对象名称 .CreateGraphics();

比如说,分别以一个 Button控件和 Label控件作为绘图界面,那么创建 Graphics 对象的语句为: Graphics g1=this.button1.CreateGraphics(); Graphics g2=this.label1.CreateGraphics();

Page 29: 第 10 章  GDI+ 绘图

Pen 对象 Pen 对象是钢笔对象,主要功能是在 Graphics 对象上绘制图形。

使用的语法为: Pen p = new Pen(Color.Blue, 2);

Pen 对象的构造函数可建立画笔的颜色以及线条的宽度,如上面这行代码 ,就是定义一个蓝颜色的钢笔,且粗度为 2 个像素宽。

当然,在定义好 Pen 对象以后,在后面的程序使用中,我们还可以对其进行修改,如: p.Color = Color.Red; p.Width = 3;

此外, System.Drawing.Pens 类中储备好了很多预先设好的钢笔,我们可以直接调用,这样更加便捷,缺点是这些钢笔的宽度都是 1个像素,且颜色都是 Internet 有名的颜色。我们就可以直接这样简单地构造一个钢笔对象: Pen p1 = Pens.Yellow;

Page 30: 第 10 章  GDI+ 绘图

Brush 对象

Brush 对象是画笔对象,用来绘制实心、渐层的图形,使得图案显得比较有质感。每种画笔都由一个派生于 System.Drawing.Brush 的类的实例来表示,由于这个类是个抽象类,所以不能实例化派生类的对象。最简单的画笔仅指定了区域用纯色来填充。这种画笔由 System.Drawing.Brush 类的实例表示,该实例可以如下构造: Brush b = SolidBrush(Color.Orange);

Page 31: 第 10 章  GDI+ 绘图

复杂的画笔

比较复杂的画笔对象有好多种,主要有 : HatchBrush LinearGradientBrush PathGradientBrush SolidBrush

这些画笔包含在 System.Drawing.Drawing2D命名空间中,所以要在程序的开头添加对 System.Drawing.Drawing2D 的引用,才可以比较便捷地建立 Brush 类。

Page 32: 第 10 章  GDI+ 绘图

HatchBrush

HatchBrush 对象是影像画笔,它通过绘制一种模式来填充区域,其基本语法为:HatchBrush hb = new HatchBrush(HatchStyle, ForeColor, Back

Color); HatchStyle 指的是在画布上绘制的图案, Fore

Color 指的是绘图的前景色, BackColor 指的是绘图的背景色,所以当我们需要绘制一个前景色为橙色、背景色为蓝色,图案花纹为交叉的水平线和垂直线时,就可以这样定义画笔: HatchBrush hb = new HatchBrush(HatchStyle.Cross, Color.Orange,Col

or.Blue);

Page 33: 第 10 章  GDI+ 绘图

LinearGradientBrush 对象是一种用在屏幕上可变的颜色填充区域的画笔,其基本语法为:

LinearGradientBrush lgb= new LinearGradientBrush(x1,y1,x2,y2,Co1or1,Color2,angle);

( x1 , y1 )、( x2 , y2 )为所操作的矩形区域的左上角和右下角坐标, Color1 与 Color 代表渐层颜色的起始和终止颜色, angle 指的是渐层的倾斜程度。当然,我们也可以把上述代码改写如下:

Rectangle r = new Rectangle(10,10,50,50);LinearGradientBrush lgb = new LinearGradientBrush(r, Co1or1, Color2, angle);

程序所实现的功能与下面的代码LinearGradientBrush lgb=new LinearGradientBrush(10,10,50,50,Co1or1,Color2,angle);是一样的。

Page 34: 第 10 章  GDI+ 绘图

小结 本章主要介绍了 System.Drawing 名称空间中的一些类,讨论了颜

色的设置以及 GDI+ 中的坐标的分类,还讨论 GDI+ 中的几种绘图对象,详细介绍了绘图机制,在窗口需要重新绘制时,就应调用 OnPaint ()事件。

GDI+ 是 Window XP 中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过 C++ 类实现的应用程序编程接口。

Pen 对象是钢笔对象,主要功能是在 Graphics 对象上绘制图形。Pen 对象的构造函数可建立画笔的颜色以及线条的宽度。

Brush 对象是画笔对象,用来绘制实心、渐层的图形,使得图案显得比较有质感。每种画笔都由一个派生于 System.Drawing.Brush的类的实例来表示,由于这个类是个抽象类,所以不能实例化派生类的对象。最简单的画笔仅指定了区域用纯色来填充。

Page 35: 第 10 章  GDI+ 绘图

谢谢!