86
1 第9第 第第第第第第第第 9.1 GDI+ 第第 9.2 第第第第第第 9.3 第第第第

第 9 章 二维图形图像处理

  • Upload
    hong

  • View
    173

  • Download
    5

Embed Size (px)

DESCRIPTION

第 9 章 二维图形图像处理. 9.1 GDI+ 概述 9.2 绘制基本图形 9.3 图像处理. 9.1 GDI+ 概述.  GDI+ : Graphics Device Interface ( 图形设备接口 ) ,它提供了高级图形图像处理功能  在 C# 中,通过一套部署为托管代码的类来展现提供的图 形图像处理功能,这套类被称为 GDI+ 的托管类。利用 GDI+ 可以轻松实现颜色渐变、透明处理、纹理处理、拉伸和缩放等多种高级功能。 . GDI+ 主要提供了三类服务: 1. 二维矢量图形 2. 图像处理 3. 文字显示. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 9 章    二维图形图像处理

1

第 9 章 二维图形图像处理

9.1 GDI+概述 9.2 绘制基本图形 9.3 图像处理

Page 2: 第 9 章    二维图形图像处理

2

9.1 GDI+ 概述

GDI+ : Graphics Device Interface ( 图形设备接口 ) ,它提供了高级图形图像处理功能

在 C# 中,通过一套部署为托管代码的类来展现提供的图 形图像处理功能,这套类被称为 GDI+ 的托管类。利用 GDI+ 可以轻松实现颜色渐变、透明处理、纹理处理、拉伸和缩放等多种高级功能。

Page 3: 第 9 章    二维图形图像处理

3

GDI+ 主要提供了三类服务: 1. 二维矢量图形 2. 图像处理 3. 文字显示

Page 4: 第 9 章    二维图形图像处理

4

在 C# 中,所有图形图像处理功能都包含在以下名称空间下: 1.System.Drawing 名称空间 提供了对 GDI+ 基本图形功能的访问,主要有

Graphics 类、 Bitmap 类、从 Brush 类继承的类、 Font 类、 Icon 类、 Image 类、 Pen 类、Color 类等。

9.1 GDI+ 概述(续)

Page 5: 第 9 章    二维图形图像处理

5

2.System.Drawing.Drawing2D 名称空间 提供了高级的二维和矢量图形功能。主要有:

梯度型画刷、 Matrix 类(用于定义几何变换)和 GraphicsPath 类等。

Page 6: 第 9 章    二维图形图像处理

6

3.System.Drawing.Imaging 名称空间 提供了高级 图像处理功能。

4.System.Drawing.Text 名称空间 提供了高级 字体和文本排版功能

Page 7: 第 9 章    二维图形图像处理

7

9.1 .1 GDI+ 使用的坐标系1. GDI+ 坐标系中的基本结构Point 表示某个特定位置相对于原点的水平和垂直距离。例

如: Point p = new Point (1,1);

Size 也有两个整型属性来表示水平和垂直距离—— Width和 Height 。例如:

Size s = new Size (5,5);

Rectangle 是用来指定矩形的坐标的,它由一个 Point 和一个 Size 组成,其中 Point 表示矩形左上角, Size 表示矩形大小。

Page 8: 第 9 章    二维图形图像处理

8

9.1 .1 GDI+ 使用的坐标系 ( 续 )例如:

1) 在构造函数中分别指定 x 坐标、 y 坐标、宽度和高度。

Rectangle r1 = new Rectangle (1,2,5,6);

2) 在构造函数中指定 Point 位置和 Size 结构。 Point p = new Point (1,2);

Size s = new Size (5,6);

Rectangle r2 = new Rectangle (p, s);

Page 9: 第 9 章    二维图形图像处理

9

9.1 .1 GDI+ 使用的坐标系 ( 续 )2.GDI+ 中坐标系的分类 世界坐标系 设备坐标系 页面坐标系

Page 10: 第 9 章    二维图形图像处理

10

9.1 .1 GDI+ 使用的坐标系(续)【例】不同坐标系之间的转换示例 private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics myGraphics = e.Graphics;

myGraphics.TranslateTransform(0.5F, 0.5F);

myGraphics.PageUnit = GraphicsUnit.Inch;

Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX);

myGraphics.DrawLine(myPen, 0, 0, 2, 2);

}

Page 11: 第 9 章    二维图形图像处理

11

9.1.2 Graphics 类

Graphics 类包含在 System.Drawing 名称空间下,它提供了简单的图形图像处理功能。在绘制图形图像前,首先必须创建Graphics 对象,然后利用这个对象绘制直线、曲线、椭圆等图形图像。

Page 12: 第 9 章    二维图形图像处理

12

有三种常见的创建 Graphics 对象的方法。 1. 在窗体或控件的 Paint 事件中获取 Graphics

对象。例如: private void Form1_Paint(object sender, System.Window

s.Forms.PaintEventArgs e)

{

Graphics g = e.Graphics;

}

Page 13: 第 9 章    二维图形图像处理

13

2. 通过当前窗体的 CreateGraphics 方法,把当前窗体的画笔、字体、颜色作为默认值,获取对 Graphics 对象的引用。

例如: Graphics g;

g = this.CreateGraphics(); ……

9.1.2 Graphics 类(续)

Page 14: 第 9 章    二维图形图像处理

14

3. 从继承自图像的任何对象创建 Graphics 对象,例如: Bitmap myBitmap = new Bitmap(@"C:\mytest1\P

ics\myPic.bmp");

Graphics g = Graphics.FromImage(myBitmap);

Page 15: 第 9 章    二维图形图像处理

15

9.1.3 颜色 颜色是进行图形操作的基本要素,它封装在System.Drawing.Color 结构中。人眼可以分辨的任何颜色都是由一定的红、绿、蓝三色光组成。任何一种颜色都可以有四个分量,分别是: R 、 G 、 B 、 A 。其中:

– R :红色,取值范围 0~255 , 0 表示没有红色成分, 255 为饱和红色;

– G :绿色,取值范围 0~255 , 0 表示没有绿色成分, 255 为饱和绿色;

– B :蓝色,取值范围 0~255 , 0 表示没有蓝色成分, 255 为饱和蓝色;

– A : Alpha 值,即透明度,取值范围 0~255 , 0 表示完全透明, 255 表示完全不透明。

Page 16: 第 9 章    二维图形图像处理

16

在代码中声明颜色的方式常用有两种: 1.调用静态方法 Color.FromArgb() 指定任意颜色 ,

这种方法有两种常用形式。 第一种形式为直接指定三种颜色,方法原型为:

Public static Color FromArgb (int red,int green,int blue); 三个参数分别表示 R 、 G 、 B 三色, Alpha 值使用默认值

255 ,即完全不透明。例如: Color red = Color.FromArgb(255, 0, 0);

第二种形式为四个参数,方法原型为: Public static Color FromArgb (int alpha,int red,int green, int blue);

四个参数分别表示透明度、 R 、 G 、 B 三色值。

9.1.3 颜色(续)

Page 17: 第 9 章    二维图形图像处理

17

2. 系统预定义颜色 System.Drawing.Color 结构中提供了许多静态性,每个属性返回一个命名颜色,在 Color 结构中已经预定义了 141 种颜色,可以直接使用。例如: this.BackColor = Color.White;

9.1.3 颜色(续)

Page 18: 第 9 章    二维图形图像处理

18

9.1.4 画笔和画刷

在 GDI+ 中,可以使用画笔和画刷绘制或填充图形、文本和图像。笔是 Pen 类的实例,用于绘制各种直线、空心图形和实心图形等。画刷是从 Brush 类派生的任何类的实例,用于填充形状或绘制文本。

Page 19: 第 9 章    二维图形图像处理

19

1. 画笔( Pen )

画笔可用于绘制绘制具有指定宽度和样式的直线、曲线或轮廓形状。

下面的示例说明如何创建一支基本的蓝色画笔: Pen myPen = new Pen(Color.Blue) ; Pen myPen = new Pen(Color.Blue, 10.5f);

也可以从画刷对象创建画笔对象,例如: SolidBrush myBrush = new SolidBrush(Color.Red) ; Pen myPen = new Pen(myBrush); Pen myPen = new Pen(myBrush, 5);

Page 20: 第 9 章    二维图形图像处理

20

【例】画笔( Pen )的用法演示示例。 添加名称空间引用: using System.Drawing.Drawing2D ,并用如下代码添加 Form1_Paint 事件。 Graphics g = e.Graphics; // 创建 Graphics 对象 Pen blackpen = new Pen(Color.Black, 10.0f); // 创建一支黑色的画笔 // 绘制字符串 g.DrawString("黑色 , 宽度为 10.0", this.Font, Brushes.Black, 5, 5); // 绘制宽度为 10.0f 的黑色直线 g.DrawLine(blackpen, new Point(110, 12), new Point(400, 12)); // 创建一支红色的画笔 Pen redpen = new Pen(Color.Red, 5.0f); // 绘制字符串 g.DrawString(" 红色 , 宽度为 5", this.Font, Brushes.Black, 5, 25); // 绘制宽度为 5 的红色直线 g.DrawLine(redpen, new Point(110, 30), new Point(400, 30));

9.1.4 画笔和画刷(续)

Page 21: 第 9 章    二维图形图像处理

21

// 创建一支蓝色的笔Pen bluepen = new Pen(Color.Blue,6);// 定义直线的样式bluepen.StartCap = LineCap.Flat;bluepen.EndCap = LineCap.ArrowAnchor;// 绘制字符串g.DrawString(“ 蓝色箭头线” , this.Font, Brushes.Black, 5, 45);// 绘制宽度为 6 的蓝色箭头线g.DrawLine(bluepen, new Point(110, 50), new Point(400, 50));//再创建一支黑色的画笔Pen iblackpen = new Pen(Color.Black, 2.0f)// 定义直线的样式iblackpen.DashStyle = DashStyle.Custom;iblackpen.DashPattern = new float[] { 4, 4 };iblackpen.EndCap = LineCap.NoAnchor;// 绘制字符串g.DrawString(" 自定义虚线 ", this.Font, Brushes.Black, 5, 65);

9.1.4 画笔和画刷(续)

Page 22: 第 9 章    二维图形图像处理

22

// 绘制宽度为 2 的自定义虚线g.DrawLine(iblackpen, new Point(110, 70), new Point(400, 70));//再创建一支红色的笔Pen iredpen = new Pen(Color.Red, 2.0f);// 定义直线的样式iredpen.DashStyle = DashStyle.Dot;// 绘制字符串g.DrawString(" 点划线 ", this.Font, Brushes.Black, 5, 85);// 绘制宽度为 2 的点划线g.DrawLine(iredpen, new Point(110, 90), new Point(400, 90));

9.1.4 画笔和画刷(续)

Page 23: 第 9 章    二维图形图像处理

23

9.1.4 画笔和画刷(续) 2. 画刷( Brush )

画刷是可以与 Graphics 对象一起使用来创建实心形状和呈现文本的对象。可以用来填充各种图形形状,如矩形、椭圆、饼型图和多边形等。

类 说明SolidBrush 用纯色填充图形TextureBrush 用基于光栅的图像 ( 位图、 JPG

等 )

填充图形LinearBradientBrush 用颜色渐变填充图形PathGradientBrush 用渐变效果填充图形HatchBrush 用各种图案填充图形

Page 24: 第 9 章    二维图形图像处理

24

1) 使用 SolidBrush 类定义单色画刷 SolidBrush 类用于定义单色画刷。该类可以填充图形,比如矩形、椭圆、多边形和路径。 【例】单色画刷演示示例。 添加名称空间引用: using System.Drawing.Drawing2D; 并用如下代码添加 Form1_Paint 事件。

Graphics g = e.Graphics;SolidBrush mySolidBrush = new SolidBrush(Color.Red);g.FillEllipse(mySolidBrush, 30,30, 130, 100);

9.1.4 画笔和画刷(续)

Page 25: 第 9 章    二维图形图像处理

25

2) 使用 HatchBrush 类填充简单图案 HatchBrush 类提供的画刷可以用各种图案填充图形。通过Hatch 类型可以设置影线样式。在创建影线的画刷时,能设定前景色、背景色和影线样式。有 56 种不同的影线样式枚举。【例】填充简单图案示例。 添加名称空间引用: using System.Drawing.Drawing2D;并用如下代码添加 Form1_paint 事件。

Graphics g = e.Graphics;

HatchBrush myHatchBrush =new HatchBrush(

HatchStyle.Cross, Color.White ,Color.Red );

g.FillEllipse(myHatchBrush, this.ClientRectangle);

9.1.4 画笔和画刷(续)

Page 26: 第 9 章    二维图形图像处理

26

3) 使用 TextureBrush 类填充复杂图像 TextureBrush 类使用图像作为填充的样式,它

可以使用例如 .bmp 、 .jpg 、 .png 等格式的图像。初始化一个新的 TextureBrush 对象需要指定填充的图像。

9.1.4 画笔和画刷(续)

Page 27: 第 9 章    二维图形图像处理

27

【例】创建 TextureBrush 示例。

将所用图像添加到项目中,并修改图片的【复制到输出目录】属性为“总是复制”,用如下代码添加 Form1_Paint 事

件。// 创建 Graphics 对象Graphics g = e.Graphics;//根据文件名创建原始大小的 Bitmap 对象Bitmap bitmap = new Bitmap("xue.jpg");//将其缩放到当前窗体大小bitmap = new Bitmap(bitmap, this.ClientRectangle.Size);TextureBrush myBrush = new TextureBrush(bitmap);g.FillEllipse(myBrush, this.ClientRectangle);

9.1.4 画笔和画刷(续)

Page 28: 第 9 章    二维图形图像处理

28

4) 使用 LinearGradientBrush 类定义线性渐变

Page 29: 第 9 章    二维图形图像处理

29

LinearGradientBrush 对象用颜色线性渐变填充图形。提供了以下三种构造函数:

(1) 提供两个点和两种颜色。 Public LinearGradientBrush ( Point point1, Point point2, Color color1, Color color2)

(2) 提供一个矩形和一个角度。 Public LinearGradientBrush (Rectangle rect ,Color color1, Color color2,float angle)

(3) 指定渐变的模式。 Public LinearGradientBrush (Rectangle rect ,Color color1, Color color2, LinearGradientMode linearGradientMode)

9.1.4 画笔和画刷(续)

Page 30: 第 9 章    二维图形图像处理

30

【例】使用点描述线性渐变。 添加名称空间引用: using System.Drawing.Drawing2

D;

并用如下代码添加 Form1_Paint 事件。 Graphics g = e.Graphics;

LinearGradientBrush myBrush = new LinearGradientBrush(

new Point(0, 0),new Point(30, 30),

Color.White,Color.Blue);

g.FillRectangle(myBrush, this.ClientRectangle);

myBrush.Dispose();

9.1.4 画笔和画刷(续)

Page 31: 第 9 章    二维图形图像处理

31

【例】使用矩形描述线性渐变。 添加名称空间引用: using System.Drawing.D

rawing2D;

并用如下代码添加 Form1_Paint 事件。 Graphics myGraphics = e.Graphics;

LinearGradientBrush lgb2 = new LinearGradientBrush(

new Rectangle(0, 0, 70, 70), Color.White,Color.Black,30f);

e.Graphics.FillRectangle(lgb2, this.ClientRectangle);

lgb2.Dispose();

9.1.4 画笔和画刷(续)

Page 32: 第 9 章    二维图形图像处理

32

5) 使用 PathGradientBrush 类实现彩色渐变 在 GDI+ 中,把一个或多个图形组成的形体称为路径。可以使用 GraphicsPath 类定义路径,使用 PathGradientBrush

类定义路径内部的渐变色画刷。渐变色从路径的内部中心点逐渐过渡到路径的外边界边缘。 PathGradientBrush 类提供了三种重载的构造函数,其中常用的是通过指定路径实现彩色渐变。常用形式如下: Public PathGradientBrush ( GraphicsPath path)

【例】路径和路径画刷的使用示例。

9.1.4 画笔和画刷(续)

Page 33: 第 9 章    二维图形图像处理

33

Graphics g = e.Graphics; Point centerPoint = new Point(80, 80); int R = 60; GraphicsPath path = new GraphicsPath(); path.AddEllipse(centerPoint.X - R, centerPoint.Y - R, 2 * R, 2 * R); PathGradientBrush brush = new PathGradientBrush(path); // 指定路径中心点 brush.CenterPoint = centerPoint; // 指定路径中心点的颜色 brush.CenterColor = Color.White; //Color 类型的数组指定与路径上每个顶点对应的颜色 brush.SurroundColors = new Color[] { Color.Red}; g.FillEllipse(brush, centerPoint.X - R, centerPoint.Y - R, 2 * R, 2 * R); centerPoint = new Point(220, 80); R = 20; path = new GraphicsPath(); path.AddEllipse(centerPoint.X - R, centerPoint.Y - R, 2 * R, 2 * R);

9.1.4 画笔和画刷(续)

Page 34: 第 9 章    二维图形图像处理

34

path.AddEllipse(centerPoint.X - 2 * R, centerPoint.Y - 2 * R, 4 * R, 4 * R);

path.AddEllipse(centerPoint.X - 3 * R, centerPoint.Y - 3 * R, 6 * R, 6 * R);

brush = new PathGradientBrush(path);

brush.CenterPoint = centerPoint;

brush.CenterColor = Color.White ;

brush.SurroundColors = new Color[]{ Color.Black,Color.Blue,Color.Green };

g.FillPath(brush, path);

9.1.4 画笔和画刷(续)

Page 35: 第 9 章    二维图形图像处理

35

9.2 绘制基本图形 所有绘制图形的方法都位于 Graphics 中。

9.2.1 直线 在 GDI+ 中绘制直线首先需要创建一个 Graphics 对象和一个Pen 对象。 Graphics 对象提供了绘图的方法,只有创建了Graphics 对象才能进行绘图操作; Pen 对象可以指定所绘制直线的一些属性,例如:线的颜色、宽度和类型等。 绘制直线用到Graphics 对象中的两种方法: DrawLine 方法和 DrawLines 方法。 DrawLine 用于绘制一条直线, DrawLines 用于绘制多条直线。

Page 36: 第 9 章    二维图形图像处理

36

1.DrawLine 方法常用形式 1) 绘制一条连接指定两个 Point 结构的线。

public void DrawLine (Pen pen,Point pt1, Point pt2)

其中, Pen 对象确定线条的颜色、宽度和样式;Point 结构确定起点和终点。

2) 绘制一条由坐标对指定的两个点的线。 public void DrawLine (Pen pen,int x1, int y1,int x2,int y2)

其中, Pen 对象确定线条的颜色、宽度和样式;x1,y1 为起点坐标, x2,y2 为终点坐标。

9.2.1 直线(续)

Page 37: 第 9 章    二维图形图像处理

37

9.2.1 直线(续)2.DrawLines 方法常用形式

绘制一系列点组成的线。 public void DrawLines (Pen pen,Point[] points)

其中, Pen 对象确定线条的颜色、宽度和样式;数组中的第一个点指定起始点,后面的每个点都以相临的前一个点为起始点组成线段。

Page 38: 第 9 章    二维图形图像处理

38

【例】使用 DrawLine 方法和 DrawLines 方法绘制直线。 用如下代码添加 Fror1_Paint 事件。

Graphics g = e.Graphics; // 创建 Graphics 对象Pen blackPen = new Pen(Color.Black, 3); // 创建一支黑色的画笔Point point1 = new Point(200,50); // 定义直线的两个点Point point2 = new Point(400,50);

g.DrawLine(blackPen, point1, point2); // 绘制直线Pen redPen = new Pen(Color.Red, 3); // 创建一支红色的画笔int x1 = 200; // 定义起点和终点坐标int y1 = 100;

int x2 = 400;

int y2 = 130;

g.DrawLine(redPen, x1, y1, x2, y2); // 绘制直线

9.2.1 直线(续)

Page 39: 第 9 章    二维图形图像处理

39

Pen pen = new Pen(Color.Blue , 3); // 创建一支蓝色的画笔Point[] points =

{

new Point(200,180),

new Point(200,200),

new Point(400,200),

new Point(400,180)

}; // 定义一系列点// 绘制直线g.DrawLines(pen, points);

9.2.1 直线(续)

Page 40: 第 9 章    二维图形图像处理

40

9.2.2 矩形1. 使用 DrawRectangle 方法绘制矩形常用形式

1) 指定绘制矩形的结构 public void DrawRectangle (Pen pen, Rectangle rect)

其中 rect 表示要绘制的矩形的结构。 2) 指定矩形左上角的坐标及宽和高

public void DrawRectangle (Pen pen, int x, int y, int width, int height)

其中 x,y 为矩形左上角的坐标值。2. 使用 DrawRectangles 方法绘制多个矩形常用形式

public void DrawRectangles (Pen pen, Rectangle[] rects)

其中 rects 表示要绘制的多个矩形的结构。

Page 41: 第 9 章    二维图形图像处理

41

9.2.2 矩形(续)3. 使用 FillRectangle 方法填充矩形常用形式

1) 指定填充画刷和矩形的结构 public void FillRectangle ( Brush brush, Rectangle

rect)

其中 brush 指定填充矩形的画刷, rect 表示要绘制的矩形的结构。

2) 指定填充画刷和矩形左上角的坐标及宽和高 public void FillRectangle (Brush brush, int x,int y,i

nt width,int height )

其中 brush 指定填充矩形的画刷, x,y 表示矩形左上角的坐标, width 和 height 表示矩形的宽和高。

Page 42: 第 9 章    二维图形图像处理

42

4. 使用 FillRectangles 方法填充多个矩形常用形式 public void FillRectangles ( Brush brush, Rectangle[] re

cts )

Page 43: 第 9 章    二维图形图像处理

439.2.2 矩形(续)

【例】绘制矩形方法示例。 用以下代码添加 Form1_Paint 事件。

Graphics g = e.Graphics; // 创建 Graphics 对象Pen blackPen = new Pen(Color.Black, 3); // 创建一支黑色的画笔Rectangle rect = new Rectangle(300, 21, 200, 50); // 指定矩形的结构g.DrawRectangle(blackPen, rect); // 绘制矩形Pen redPen= new Pen(Color.Red, 3); // 创建一支红色的画笔// 指定矩形左上角的坐标及宽和高int x = 300;// 矩形左上角点的 x 坐标分量int y = 90;// 矩形左上角点的 y 坐标分量int width = 200;// 矩形的宽int height = 50;// 矩形的高g.DrawRectangle(redPen, x, y, width, height); // 绘制矩形Pen bluePen = new Pen(Color.Blue, 3); // 创建一支蓝色的画笔

Page 44: 第 9 章    二维图形图像处理

449.2.2 矩形(续)Rectangle[] rects ={ new Rectangle (300,160,90,50), new Rectangle (350,170,90,50), new Rectangle (400,160,90,50)}; // 指定多个矩形的结构g.DrawRectangles(bluePen, rects); // 绘制多个矩形// 创建一支黑色的画刷SolidBrush blackBrush = new SolidBrush(Color.Black); Rectangle rect1 = new Rectangle(300, 240, 200, 50); // 指定矩形的结构g.FillRectangle(blackBrush, rect1); // 填充矩形SolidBrush redBrush = new SolidBrush(Color.Red); // 创建一支黑色的画刷// 指定矩形左上角的坐标及宽和高int ix = 300; // 矩形左上角点的 x 坐标分量int iy = 310; // 矩形左上角点的 y 坐标分量int iwidth = 200; // 矩形的宽int iheight = 50; // 矩形的高g.FillRectangle(redBrush, ix, iy, iwidth, iheight); // 填充矩形

Page 45: 第 9 章    二维图形图像处理

45

9.2.2 矩形(续)// 创建一支蓝色的画刷SolidBrush blueBrush = new SolidBrush(Color.Blue); Rectangle[] irects =

{

new Rectangle (300,380,90,50),

new Rectangle (350,390,90,50),

new Rectangle (400,380,90,50)

}; // 指定多个矩形的结构//填充多个矩形g.FillRectangles(blueBrush, irects);

Page 46: 第 9 章    二维图形图像处理

46

9.2.3 多边形1. DrawPolygon 方法

DrawPolygon 方法用来绘制多边形的轮廓,一个多边形是由数组中指明的节点连接起来而组成的。 DrawPolygon 方法常用形式如下: public void DrawPolygon (Pen pen, Point[] points)

2. FillPolygon 方法 FillPolygon 方法用来填充多边形的封闭区域。FillPolygon 方法常用形式如下: public void FillPolygon (Brush brush, Point[] points)

Page 47: 第 9 章    二维图形图像处理

47

9.2.3 多边形(续)【例】绘制多边形示例。 添加名称空间引用 using System.Drawing.Drawing2D;并用如下代码添加窗体的 Paint 事件。

Graphics g = e.Graphics; // 创建 Graphics 对象Pen pen = new Pen(Color.Red); // 创建一支红色的画笔Point[] points ={ new Point (50,50), new Point (100,50), new Point (130,90), new Point (130,140), new Point (100,180), new Point (50,180), new Point (20,140), new Point (20,90)}; // 定义多边形的点

Page 48: 第 9 章    二维图形图像处理

48

9.2.3 多边形(续) g.DrawPolygon(pen, points); // 绘制多边形轮廓Point[] points1 =

{

new Point (250,50),

new Point (300,50),

new Point (330,90),

new Point (330,140),

new Point (300,180),

new Point (250,180),

new Point (220,140),

new Point (220,90)

}; // 定义第二个多边形的点//填充多边形封闭区域g.FillPolygon(new SolidBrush(Color.Red), points1);

Page 49: 第 9 章    二维图形图像处理

49

9.2.4 曲线1. DrawCurve 方法

这个方法用光滑的曲线把给定的点连接起来,常用形式有:

1) public void DrawCurve (Pen pen ,Point[] points )

其中, Point 结构类型的数组中指明各节点,默认弯曲强度为 0.5 。注意,数组中至少要有 3 个元素。

2) public void DrawCurve (Pen pen ,Point[] points,float tension )

其中, tension 指定弯曲强度,该值范围为 0.0f~1.0f ,超出此范围会产生异常。当弯曲强度为零时,就是直线。

Page 50: 第 9 章    二维图形图像处理

50

9.2.4 曲线(续)2. DrawClosedCurve 方法

这个方法是通过连接数组中节点画一个平滑的曲线,此方法会自动把首尾节点连接起来构成封闭曲线。注意数组中的节点至少要有 3 个点组成,默认弯曲强度为 0.5 。

1) public void DrawClosedCurve (Pen pen ,Point[] po

ints )

其中, Point 结构类型的数组中指明各节点。 2) public void DrawClosedCurve (Pen pen ,Point[] poi

nts,float tension FillMode fillmode)

其中, fillmode 指明曲线封闭区域内以何种方式填充。

Page 51: 第 9 章    二维图形图像处理

519.2.4 曲线(续)

3. 贝塞尔曲线 每段贝塞尔曲线由 4 个点组成,两个端点( p1 为起点, p2 为终点)和两个控制点( c1 和c2 )。曲线不经过控制点,但是控制点如同一个磁体吸引曲线,影响并引导曲线向某个方向拉伸。

Page 52: 第 9 章    二维图形图像处理

52

9.2.4 曲线(续)1) DrawBezier 方法:用来绘制一段贝塞尔曲

线的,常用形式如下: public void DrawBezier (Pen pen ,Point pt1 ,

Point pt2 , Point pt3 , Point pt4 ) 其中 pt1 、 pt2 、 pt3 和 pt4 分别指定四个点。

Page 53: 第 9 章    二维图形图像处理

53

2) DrawBeziers 方法:用来绘制多段贝塞尔曲线,常用形式如下:

public void DrawBezier (Pen pen ,Point[] points)

其中 points 是 Point 结构的数组,第一段贝塞尔曲线由点数组中的第 1~4 个点绘制而成。以后每段曲线只需要 3 个点: 2 个控制点和一个结束点。前一段曲线的结束点会自动被用作后一段曲线的起始点。

Page 54: 第 9 章    二维图形图像处理

549.2.4 曲线(续)

【例】绘制曲线示例。 添加名称空间引用: using System.Drawing.Drawing2D; 并用如下代码添加窗体的 Paint 事件。

Graphics g = e.Graphics; // 创建 Graphics 对象Pen redPen = new Pen(Color.Red,3); // 创建一支红色的画笔Point[] curve1points ={ new Point (150,100),new Point (200,50), new Point (250,100),new Point (300,50)}; // 定义组成曲线的点g.DrawCurve(redPen, curve1points);Pen blackPen = new Pen(Color.Black, 3); // 创建一支黑色的画笔Point[] curve1points ={ new Point (150,100),new Point (200,50), new Point (250,100),new Point (300,50)}; // 定义组成曲线的点

Page 55: 第 9 章    二维图形图像处理

559.2.4 曲线(续)

float tension = 1.0f;g.DrawCurve(blackPen, curve2points,tension );Point[] curve3points ={ new Point (150,200),new Point (200,150), new Point (250,200),new Point (300,150)}; // 定义组成曲线的点g.DrawClosedCurve(redPen, curve3points);Point[] curve4points ={ new Point (350,200),new Point (400,150), new Point (450,200),new Point (500,150)}; // 定义组成曲线的点float tension1 = 1.0f;FillMode afillmode = FillMode.Alternate;g.DrawClosedCurve(redPen, curve4points,tension1 ,afillmode );// 定义组成贝塞尔曲线的点Point istart = new Point(150, 300);Point icontrol1 = new Point(200, 180);

Page 56: 第 9 章    二维图形图像处理

569.2.4 曲线(续)

Point icontrol2 = new Point(250, 250);Point iend = new Point(300, 300);g.DrawBezier(blackPen, istart, icontrol1, icontrol2, iend); // 绘制贝塞尔曲

线// 定义组成贝塞尔曲线的点Point jstart = new Point(350, 300);Point jcontrol1 = new Point(400, 200);Point jcontrol2 = new Point(420, 250);Point jend1 = new Point(440, 300);Point jcontrol3 = new Point(460, 360);Point jcontrol4 = new Point(480, 400);Point jend2 = new Point(500, 300);Point[] bezierpoints ={ jstart,jcontrol1,jcontrol2,jend1,jcontrol3,jcontrol4,jend2};g.DrawBeziers(redPen, bezierpoints); // 绘制贝塞尔曲线

Page 57: 第 9 章    二维图形图像处理

57

9.2.5 椭圆1. DrawEllipse 方法

1)给定椭圆左上角坐标和椭圆的外接矩形的宽度和高度

public void DrawEllipse(Pen pen, int x, int y, int width, int height);

其中, pen 为 Pen 对象, x, y 为椭圆左上角的坐标, width 定义椭圆外接矩形的宽度, height 定义椭圆外接矩形的高度。

2)给定椭圆外接矩形的结构 public void DrawEllipse(Pen pen, Rectangle rect); 其中, rect 为 Rectangle 结构,用于确定椭圆的边界。

Page 58: 第 9 章    二维图形图像处理

58

9.2.5 椭圆(续)2. FillEllipse 方法

1) 给定椭圆左上角坐标和椭圆的外接矩形的宽度和高度

public void FillEllipse( Brush brush, int x, int y, int width, int height);

其中, x, y 为椭圆左上角的坐标, width 定义椭圆外接矩形的宽度, height 定义椭圆外接矩形的高度。

Page 59: 第 9 章    二维图形图像处理

59

2) 给定椭圆外接矩形的结构 public void FillEllipse(Brush brush, Rectangle rec

t); 其中, rect 为 Rectangle 结构,用于确定椭圆

的边界。

Page 60: 第 9 章    二维图形图像处理

60

9.2.5 椭圆(续) 【例】绘制椭圆示例。 用下页代码添加窗体的 Paint 事件。

Graphics g = e.Graphics; // 创建 Graphics 对象Pen redPen = new Pen(Color.Red, 3); // 创建一支红色的画笔g.DrawEllipse(redPen, 50, 65, 150, 100); // 用 DrawEllipse 方法绘制椭圆轮廓

Pen blackPen = new Pen(Color.Black, 3); // 创建一支黑色的画笔Rectangle irect = new Rectangle(390, 65, 150, 100); // 指定矩形的结构g.DrawEllipse(blackPen, irect); // 用 DrawEllipse 方法绘制椭圆轮廓SolidBrush redBrush = new SolidBrush(Color.Red); // 创建一支红色的画刷g.FillEllipse(redBrush, 50, 280, 150, 100);

SolidBrush blackBrush = new SolidBrush(Color.Black);

Rectangle jrect = new Rectangle(390, 280, 150, 100);

g.FillEllipse(blackBrush, jrect);

Page 61: 第 9 章    二维图形图像处理

61

9.2.5 椭圆(续)

blackPen.Dispose();

redPen.Dispose();

blackBrush.Dispose();

redBrush.Dispose();

g.Dispose();

Page 62: 第 9 章    二维图形图像处理

62

9.2.6 扇形(续)1. DrawPie 方法

1) public void Drawpie(Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle);

其中, pen 为 Pen 对象, x, y 为椭圆左上角的坐标, width定义

扇形外接矩形的宽度, height 定义扇形外接矩形的高度,startAngle 为起始角度(以度为单位), sweepAngle 为延伸角度。 2) public void DrawPie(Pen pen, Rectangle rect, float st

artAngle, float sweepAngle); 其中, rect 为 Rectangle 结构,用于确定扇形的外接矩形。

Page 63: 第 9 章    二维图形图像处理

63

9.2.6 扇形(续)2. FillPie 方法

1 ) public void FillPie(Brush brush, int x, int y, int width, int height,

int startAngle, int sweepAngle); 其中, brush 为 SolidBrush 对象, x, y 为椭圆左上角的坐标,width 定义扇形外接矩形的宽度, height 定义扇形外接矩形的

高度, startAngle 为起始角度(以度为单位), sweepAngle 为延伸角度。

Page 64: 第 9 章    二维图形图像处理

64

2 ) public void FillPie(Brush brush, Rectangle rect, float startAngle,

float sweepAngle); 其中, rect 为 Rectangle 结构,用于确定扇形的边

界。

Page 65: 第 9 章    二维图形图像处理

659.2.6 扇形(续)

【例】绘制扇形示例。 用如下代码添加窗体的 Paint 事件。

Graphics g = e.Graphics; // 创建 Graphics 对象Pen redPen = new Pen(Color.Red, 3); // 创建一支红色的画笔// 用 DrawPie 方法绘制扇形轮廓 g.DrawPie(redPen, 15, 30, 100,100,0.0f,100.0f); Pen bluePen = new Pen(Color.Blue, 3); // 创建一支蓝色的画笔// 用 DrawPie 方法绘制扇形轮廓Rectangle rect1 = new Rectangle(210, 30, 100, 100); // 指定矩

形的结构float statrAngle = 0.0f; //给定扇形起始角度float sweepAngle = 100.0f;g.DrawPie(bluePen , rect1 ,statrAngle ,sweepAngle );

Page 66: 第 9 章    二维图形图像处理

66

9.2.6 扇形(续)SolidBrush redBrush = new SolidBrush(Color.Red); // 创建一支红色的画刷g.FillPie(redBrush ,15,170,100,100,0.0f,100.0f); // 用 FillPie 方法绘制扇形轮廓

SolidBrush blueBrush = new SolidBrush(Color.Blue); // 创建一支蓝色的画刷Rectangle rect2 = new Rectangle(210, 170, 100, 100);

g.FillPie(blueBrush, rect2,statrAngle ,sweepAngle );

bluePen.Dispose();

redPen.Dispose();

blueBrush.Dispose();

redBrush.Dispose();

g.Dispose();

Page 67: 第 9 章    二维图形图像处理

679.2.6 扇形(续)

【例】用扇形描述磁盘空间的使用情况。 添添添添添添添添添 using System.IO; 添添添添添 Paint 事件

Rectangle rect = new Rectangle(370, 20, 200, 200); Rectangle rect2 = new Rectangle(310, 10, 320, 320); Rectangle freeLegend = new Rectangle(320, 275, 20, 20); Rectangle usedLegend = new Rectangle(320, 300, 20, 20); e.Graphics.DrawRectangle(Pens.Black, rect2); if (isSpaceInfoAvailable == true) { e.Graphics.FillPie(Brushes.Green, rect, 0, sweep); e.Graphics.FillPie(Brushes.Red, rect, sweep, 360 - sweep); e.Graphics.FillRectangle(Brushes.Green, freeLegend); e.Graphics.FillRectangle(Brushes.Red, usedLegend); }

Page 68: 第 9 章    二维图形图像处理

689.2.6 扇形(续) 定义 LoadDriveInfo 方法 private void LoadDriveInfo(string driveLetter) { DriveInfo driveInfo; try { driveInfo = new DriveInfo(driveLetter); } catch (ArgumentNullException ex1) { MessageBox.Show("The drive letter can not be null./n/r" +ex1.Message, "Drive Letter error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } catch (ArgumentException ex2) { MessageBox.Show("The drive letter must be in the range of a-z./n/r" + ex2.Message, "Drive Letter error", MessageBoxButtons.OK, MessageBoxIcon.Erro

r); return; }

Page 69: 第 9 章    二维图形图像处理

69

9.2.6 扇形(续) this. textBoxDriveName.Text = driveInfo.Name; try { if (driveInfo.VolumeLabel.Length > 0) this. textBoxDriveVolumeLabel.Text = driveInfo.VolumeLabel; else this. textBoxDriveVolumeLabel.Text = "None"; this. textBoxDriveFormat.Text = driveInfo.DriveFormat; totalSpace = driveInfo.TotalSize; freeSpace = driveInfo.TotalFreeSpace; usedSpace = totalSpace - freeSpace; sweep = 360f * freeSpace / totalSpace; freepercent = (int)(100f * freeSpace / totalSpace); usepercent = (int)(100f * usedSpace / totalSpace); isSpaceInfoAvailable = true; }

Page 70: 第 9 章    二维图形图像处理

70

9.2.6 扇形(续)catch { this. textBoxDriveVolumeLabel.Text = "Not available"; this. textBoxDriveFormat.Text = "Not available"; isSpaceInfoAvailab

le = false; } this. textBoxDriveType.Text = driveInfo.DriveType.ToString(); this. textBoxDriveRootDirectory.Text =driveInfo.RootDirectory.ToString(); dirInfo = driveInfo.RootDirectory; if (driveInfo.IsReady == true) this. lableDriveReadyStatus.Text = "Drive is Ready"; else this. lableDriveReadyStatus.Text = "Drive is NOT Ready"; }

Page 71: 第 9 章    二维图形图像处理

71

9.2.6 扇形(续)添加 comboBoxDrivesOnPc 的 SelectionChangeCommitted

事件。LoadDriveInfo(comboBoxDrivesOnPc.Items

[comboBoxDrivesOnPc.SelectedIndex].ToString());

label7.Text = " 可用空间: " + freepercent.ToString() + "%";

label8.Text = “已用空间:” + usepercent.ToString() + “%”;

label9.Text = " 分区总容量: " + (int)(totalSpace / 1073741824) + "GB";

this.Invalidate();

Page 72: 第 9 章    二维图形图像处理

729.3 图像处理

1. 图像的显示 GDI+ 提供了两个类用来表示图像: Bitmap 类和 Metafile 类。 从文件中读取一个位图并在屏幕中显示出此图像需要三个步骤: ① 创建一个 Bitmap 对象指明要显示的图像文件; ② 创建一个 Graphics 对象表明要使用绘图平面; ③ 通过调用 Graphics 对象的 DrawImage 方法显示图像。

Page 73: 第 9 章    二维图形图像处理

73

9.3.1 图像的显示与保存(续)1) 创建 Bitmap 对象

Bitmap 类有很多重载的构造函数,其中常用的有: Public Bitmap(string filename) 其中 filename 是图像文件的名字。可以利用该构造

函数创建 Bitmap 对象。例如: Bitmap bitmap = new Bitmap("filename.jpg");

Page 74: 第 9 章    二维图形图像处理

74

2) DrawImage 方法 Graphics 类的 DrawImage 方法用于在指定位置显

示原始图像或者缩放后的图像。该方法的重载形式也非常多,其中常用的一种为:

Public void DrawImage(Image image,int x,int y,int width, int height)

该方法在 (x,y) 位置点按指定的大小显示图像。利用此方法可以

直接显示缩放后的图像。

Page 75: 第 9 章    二维图形图像处理

75

9.3.1 图像的显示与保存(续)【例】实现显示图像的功能。• 把所用图片添加到项目中,并修改图片的【复制到输出目录】属性为“总是复制” 。

• 添加窗体的 Paint 事件。 Bitmap bitmap = new Bitmap(“shu.bmp”); e.Graphics.DrawImage(bitmap, 10, 10); e.Graphics.DrawImage(bitmap, 300, 10, bitmap.Width / 2, bitmap.Height / 2); e.Graphics.DrawImage(bitmap, 330, 200, 80, 80); bitmap .Dispose (); e.Dispose ();

Page 76: 第 9 章    二维图形图像处理

769.3.1 图像的显示与保存(续)

2. 图像的保存 图像的保存要用到 Image.Save 方法。这个方法有多种

构造函数,其中最常用的形式如下: public void Save (string filename)

其中 filename 为图像或图形所要保存的路径。 【例】将绘制的图形或图像保存到文件中。 添加字段声明: Bitmap image1;

添加 【显示】按钮的 Click 事件代码: image1 = new Bitmap("shu.bmp");

Graphics g = this.CreateGraphics();

g.DrawImage(image1, 30, 30, 180, 180);

Page 77: 第 9 章    二维图形图像处理

77

9.3.1 图像的显示与保存(续) 添加 【保存】按钮的 Click 事件代码: try { if (image1 != null) { image1.Save("c:\\myBitmap.bmp"); MessageBox.Show("保存成功! "); } } catch (Exception) { MessageBox.Show("保存失败 "); }

Page 78: 第 9 章    二维图形图像处理

78

9.3. 2 图像的平移、旋转和缩放

Graphics 类提供了三种对图像进行几何变换的方法,它们分别是 TranslateTransform 方法、RotateTransform 方法、 ScaleTransform 方法,分别用于图形图像的平移、旋转和缩放。

1. TranslateTransform 方法常用形式: public void TranslateTransform (float dx,float dy)

其中 dx 表示平移的 x 分量, dy 表示平移的 y 分量。

Page 79: 第 9 章    二维图形图像处理

79

9.3. 2 图像的平移、旋转和缩放(续)

2. RotateTransform 方法常用形式: public void RotateTransform (float angle)

其中 angle 表示旋转角度。3. ScaleTransform 方法常用形式:

public void ScaleTransform (float sx,float sy)

其中 sx 表示 x 方向缩放比例, sy 表示 y 方向缩放的比例。

Page 80: 第 9 章    二维图形图像处理

80

9.3. 2 图像的平移、旋转和缩放(续)【例】三种图像变换示例。 添加窗体的 Paint 事件。

Graphics g = e.Graphics;

g.TranslateTransform(110, 120);

for (float angle = 0; angle < 360; angle += 45)

{

g.RotateTransform(angle);

g.FillEllipse(new SolidBrush(Color.FromArgb(80, Color.Blue)), 0, 0, 20, 80);

}

g.TranslateTransform(-200.0f, 0.0f);

Page 81: 第 9 章    二维图形图像处理

81

9.3. 2 图像的平移、旋转和缩放(续)for (float angle = 0; angle < 360; angle += 45){ g.RotateTransform(angle); g.FillEllipse(new SolidBrush(Color.FromArgb(80, Color.Blu

e)), 0, 0, 20, 80);}g.TranslateTransform(200.0f, 0.0f);g.ScaleTransform(0.5f, 0.5f); for (float angle = 0; angle < 360; a

ngle += 45){ g.RotateTransform(angle); g.FillEllipse(new SolidBrush(Color.FromArgb(80, Color.Blu

e)), 0, 0, 20, 80);}

Page 82: 第 9 章    二维图形图像处理

82

9.3.3 图像的拉伸与反转变换【例】图像变换演示。

添加字段声明: Bitmap myBitmap;

添加【选择图像文件】按钮的 Click 事件代码。添加【左到右拉伸】按钮的 Click 事件代码:

int iWidth = this.pictureBox1.Width; // 图像宽度 int iHeight = this.pictureBox1.Height; // 图像高度 Graphics g = this.pictureBox1.CreateGraphics(); // 取得 Graphics 对象 //初始为灰色 g.Clear(Color.Gray);

for (int x = 0; x <= iWidth; x++)

{

g.DrawImage(myBitmap, 0, 0, x, iHeight);

}

Page 83: 第 9 章    二维图形图像处理

83

添加【上到下拉伸】按钮的 Click 事件代码:

g.Clear(Color.Gray);

for (int y = 0; y <= iHeight ; y++)

{

g.DrawImage(myBitmap, 0, 0,iWidth ,y);

}

Page 84: 第 9 章    二维图形图像处理

84

添加【中间向两边拉伸】按钮的 Click 事件代码: g.Clear(Color.Gray); for (int y = 0; y <= iWidth /2; y++) { Rectangle DestRect = new Rectangle(iWidth / 2 - y, 0, 2 * y, iHeight); Rectangle SrcRect = new Rectangle(0, 0, myBitmap.Width,myBitmap.Height); g.DrawImage( myBitmap, DestRect, SrcRect, GraphicsUnit.Pixel); }

Page 85: 第 9 章    二维图形图像处理

85

添加【反转】按钮的 Click 事件代码: g.Clear(Color.Gray); for (int x =-iWidth /2; x <= iWidth / 2; x++) { Rectangle DestRect = new Rectangle(0,iHeight/2-x,iWidth ,2*x); Rectangle SrcRect = new Rectangle(0,0,myBitmap.Width,myBitmap.Height); g.DrawImage( myBitmap, DestRect, SrcRect, GraphicsUnit.Pixel); }

Page 86: 第 9 章    二维图形图像处理

86

添加【中间向四周扩散】按钮的 Click 事件代码: g.Clear(Color.Gray);

for (int x =0; x <= iWidth / 2; x++)

{

Rectangle DestRect =

new Rectangle(iWidth / 2 - x, iHeight / 2 - x, 2 * x, 2 * x);

Rectangle SrcRect =

new Rectangle(0, 0, myBitmap.Width, myBitmap.Height);

g.DrawImage(myBitmap, DestRect, SrcRect, GraphicsUnit.Pixel);

}