67
第5第 第第 / 第第第第

第 5 章 图形 / 图像处理

  • Upload
    walda

  • View
    274

  • Download
    0

Embed Size (px)

DESCRIPTION

第 5 章 图形 / 图像处理. 学习目标. 了解 GDI+ 新增的基本知识 掌握 GDI+ 程序的开发过程 掌握 使用画笔绘制图形的编程方法 了解创建字体并能够显示文本的编程方法 掌握 图像的基本处理方法. 5.1 图形 / 图像的基本概念. 图形 指的是一种矢量结构的画面存储形式 , 是使用计算机绘制图形的表现方式 如直线、矩形、圆、三维立体造型等 图像 则是栅格结构的画面存储形式 如用照相机、摄像机、扫描仪捕捉到的图案,也可以是手工绘制的图画作品 最常见的两种图像文件类型 位图 —— 把一幅图像分成许多很小的像素,然后再把这些像素组成图案。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 5 章  图形 / 图像处理

第 5 章 图形 / 图像处理

Page 2: 第 5 章  图形 / 图像处理

学习目标

了解 GDI+ 新增的基本知识 掌握 GDI+ 程序的开发过程 掌握使用画笔绘制图形的编程方法 了解创建字体并能够显示文本的编程方法 掌握图像的基本处理方法

Page 3: 第 5 章  图形 / 图像处理

5.1 图形 / 图像的基本概念 图形指的是一种矢量结构的画面存储形式 , 是使用计算机绘

制图形的表现方式 如直线、矩形、圆、三维立体造型等

图像则是栅格结构的画面存储形式 如用照相机、摄像机、扫描仪捕捉到的图案,也可以是

手工绘制的图画作品 最常见的两种图像文件类型

位图——把一幅图像分成许多很小的像素,然后再把这些像素组成图案。

矢量图——用数学的方法来描述一幅图,再将其转化为相应的一个个数学表达式,然后对其进行显示。

Page 4: 第 5 章  图形 / 图像处理

5.2 GDI+ 编程基础 GDI+ 是 Windows XP 操作系统、 Windows 2003 操作系统

的图形引擎,负责在屏幕和打印机上显示和打印信息。 GDI+ 是一个应用程序接口,通过一组 C++ 类来提供接口的

功能。

Page 5: 第 5 章  图形 / 图像处理

GDI+ 实际上是 GDI 的高层次的一种封装类,主要用来服务于图形、图像和文本的输出。

GDI+ 的内容主要由以下几方面构成: 1. 二维几何图形的处理

矢量图形的绘制与显示使用的类包括:矩形类 Rect ,画笔类 Pe

n ,图形类 Graphics ,画刷类 Brush

2. 显示图像 缓存位图类 CachedBitmap 提供对位图的快速访问与显示

5.2.1 GDI+ 概述

Page 6: 第 5 章  图形 / 图像处理

3. 排版 GDI+ 提供了大量的函数来完成各种不同风格的文

本输出。 使用 GDI+ 编程时 只需要简单地创建一个 Graphic

s (图形)对象,然后分别调用该 Graphics 对象的成员函数,便能完成大部分的绘图操作。

GDI 和 GDI+ 区别:GDI 是基于句柄的, GDI+ 是基于对象模型的

例:从窗口的点( 10 , 10 )到点( 200 , 10 )之间画一条宽度为 5 红色的直线。

Page 7: 第 5 章  图形 / 图像处理

5.2.3 GDI+ 程序的开发步骤 建立一个 GDI+ 程序分 4 个步骤:

在项目中引入 GDI+ 的头文件,使用 GDI+ 的命名空间。 初始化 GDI+ 系统资源。 使用完毕后,释放 GDI+ 所使用的资源。 在编译时加入 GdiPlus.Lib 库文件。

Page 8: 第 5 章  图形 / 图像处理

【例 5-1 】编写一个 GDI+ 程序 MyGDIplus ,在屏幕上输出“现在开始编写 GDI+ 程序”。程序的运行结果下图所示。

图 5-1 MyGDIplus 的运行结果

Page 9: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程

序 MyGDIplus ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 10: 第 5 章  图形 / 图像处理

5.2.4 Graphics 类 Graphics 类是 GDI+ 程序设计的核心,能够完成大部分的绘

图、文本输出、几何图形的填充及坐标系统的转换等各种操作。

Graphics 类的构造函数: Graphics ( HDC hdc ); Graphics ( HDC hdc , HANDLE hdevice ); Graphics ( Image* image ); Graphics ( HWND hwnd , BOOL icm );

设备环境句柄

设备句柄

图像对象

窗口句柄

是否使用色彩配置文件校正色彩

Page 11: 第 5 章  图形 / 图像处理

Graphics 类中常用的绘图和填充函数如下表所示

函数名称 说明Clear 用背景色填充整个绘图表面.背景色是在函数调用中指定的DrawArc — ——绘制 个椭圆弧。该圆弧是椭圆的一部分 指定 Pen对象、椭

圆的包含矩形以及起始角和椭圆弧包含的角度DrawBezier 绘制一条贝塞尔曲线。这条曲线在两个指定的端点之间绘制,其

—曲率由另外两个指定的控制点来控制。因此,需要指定 个 Pen对象、两个端点和两个控制点

DrawCurve —绘制 条基本曲线。这类似于绘制一条这样的曲线;取某一柔软材科的一段,使之通过一系列固定点

DrawEllipse —绘制 个椭圆。必须指定一个 Pen对象和椭圆的包含矩形DrawIcon 在指定的 Icon对象中绘制图像DrawImage 在绘图表面的指定区域绘制全部或部分指定的 Image对象DrawLine 在两个指定的点之间,使用指定 Pen对象绘制一条直线DrawPath 使用指定 Pen对象绘制一条由 GraphicsPath对象表示的路径

Page 12: 第 5 章  图形 / 图像处理

函数名称 说明DrawPie 绘制饼图。这需要指定一个 Pen对象,一个包含矩形和表

示饼圆弧的两个角度DrawPolygon 使用指定的 Pen对象绘制多边形,该多边形用一个点的数

组来表示DrawRectange 使用指定的 Pen对象绘制指定的矩形DrawString 以指定的字体,在指定包含矩形中绘制指定的文本字符串FillClosedCurve 使用指定的 Brush对象填充指定封闭的基本样条曲线的内

部区域FillEllipse 使用指定的 Brush对象填充指定椭圆的内部区域FillPath 使用指定的 Brush对象填充出 GraphicsPath对象表示的

路径FillPie 使用指定的 Brush对象填充饼图的内部区城FillPolygon 使用指定的 Brush对象填充多边形的内部区域,该多边形

是用一个点的数组来表示的FillRectange 使用指定的 Brush对象填充矩形的内部区域FillRectanges 使用指定的 Brush对象填充矩形集的内部区域FillRegion 使用指定的 Brush对象填充 Region对象的内部区域

Page 13: 第 5 章  图形 / 图像处理

5.2.5 色彩的使用 GDI+ 的色彩表示法

RGB

基本原理是使用不同强度的红、绿和蓝色光强度来组合成各式各样的色彩

CYMK

基本原理是使用青、洋红、黄色、黑色 4 种色彩来合成其它色彩

Page 14: 第 5 章  图形 / 图像处理

Color 类的构造函数分别为: Color(); Color(BYTE a , BYTE r , BYTE g , BYTE b); Color(BYTE r , BYTE g , BYTE b); Color(ARGB argb);

参数说明: a 表示色彩的透明度( 0~255 )。 r 、 g 、 b 表示红绿蓝 3 种色彩分量值( 0~255 )。

GDI+ 在对色彩支持方法主要体现在对色彩的透明度( Alph

a )支持 它包括 4 个方面的信息:红、绿、蓝 3 种基准色和透明度,每

个信息用 8 位来表示 透明度的计算公式

输出色彩 = 前景色 ×Alpha/255+ 背景色 ×(255-Alpha)/255

Page 15: 第 5 章  图形 / 图像处理

5.3 画笔和画刷 5.3.1 使用画笔

1 .画笔的创建 ( 1 ) Pen(const Color &color, REAL width) 这个构造函数创建一个宽度为 width ,颜色为 color 的画笔,默认情况下,宽度为 1 。

创建一个宽度为 2 的蓝色画笔: Pen pen(Color(0,0,255),2)

Page 16: 第 5 章  图形 / 图像处理

( 2 ) Pen(onst Brush *brush, REAL width); 这个构造函数使用指定的画刷来创建一个画笔,默认情况下,宽度为 1 。

创建一个宽度为 2 的蓝色画笔: SolidBrush brush(Color(0,0,255)); Pen pen(&brush,2)

2. 画笔的属性 ( 1 )画笔的线型 使用 Pen 类的成员函数 SetDashStyle 可以设置画笔的线

型,该函数原型如下: Status SetDashStyle(DashStyle dashStyle)

Page 17: 第 5 章  图形 / 图像处理

DashStyle 枚举中提供了 5 个常见的画笔线型风格,它主要定义了实线、虚线、点线、点划线、双点划线以及自定义的线型

DashStyle 枚举的定义如下:typedef enum {

    DashStyleSolid = 0, // 实线    DashStyleDash = 1, // 虚线    DashStyleDot = 2, // 点线    DashStyleDashDot = 3, // 点划线    DashStyleDashDotDot = 4, // 双点划线    DashStyleCustom = 5 // 自定义线型} DashStyle

Page 18: 第 5 章  图形 / 图像处理

Pen 类的成员函数 SetDashPattern 可以使用一个预定义的数组来描述画笔的虚实,这个数组的格式为: [ 画线部分长度,间隔部分长度,画线部分长度,间隔部

分长度,…… ] 数组的大小由用户自定义。 SetDashPattern 函数用于设置线型风格,该函数原型如下:

Status SetDashPattern(const REAL *dashArray, INT count);

参数说明: dashArray 是一个预定义的数组 count 表示数组中元素的个数

Page 19: 第 5 章  图形 / 图像处理

【例 5-2 】编写一个单文档应用程序 Mypenstyle ,用于显示不同线型的画笔画出的直线。程序的运行结果如下图所示

图 5-3 Mypenstyle 的运行结果

Page 20: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mypenstyle ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 21: 第 5 章  图形 / 图像处理

( 2 )画笔的对齐方式在 GDI+ 中, Pen 类的成员函数 SetAlignment 用于设置画笔的对齐方式,该函数原型如下:

Status SetAlignment(PenAlignment penAlignment);其中 PenAlignment 是一个枚举,它定义了画笔的对齐

方式,该枚举的定义如下:typedef enum {

    PenAlignmentCenter = 0, // 居中,默认对齐方式    PenAlignmentInset = 1 // 嵌入} PenAlignment;

Page 22: 第 5 章  图形 / 图像处理

【例 5-3 】编写一个单文档应用程序 Mypenalign ,用于显示不同的对齐方式。程序的运行结果如下图所示。

图 5-4 Mypenalign 的运行结果

Page 23: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mypenalign ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 24: 第 5 章  图形 / 图像处理

( 4 )画笔的透明度 透明度是相对于背景色而言的,线条透明度越大,背景的可见度就越大。

在 GDI+ 中之所以能够实现透明的效果,是因为它对色彩的定义使用了 ARGB 的方式。

创建带透明度的画笔,本质上就是设置画笔的色彩并在色彩中加入透明度

GDI+ 对线条透明度的支持主要是采用对画笔透明度的支持来实现的。

Page 25: 第 5 章  图形 / 图像处理

【例 5-5 】编写一个单文档应用程序 Mypenalpha ,用于表现画笔的透明度。程序的运行结果如下图所示。

图 5-6 Mypenalpha 的运行结果

Page 26: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mypenalpha ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 27: 第 5 章  图形 / 图像处理

5.3.3 绘制基本图形 1 .绘制直线

Graphics 类提供的函数 DrawLine 能够完成直线的绘制操作,该函数原型如下:

Status DrawLine(const Pen *pen,const Point &pt1, const Point &pt2);

Status DrawLine(const Pen *pen,const PointF &pt1, const Point &pt2);

Status DrawLine(const Pen *pen,REAL x1,REAL y1, REAL x2,REAL y2);

Status DrawLine(const Pen *pen,INT x1,INT y1, INT x2, INT y2);

Page 28: 第 5 章  图形 / 图像处理

2. 绘制矩形 Graphics 类的 DrawRectangle 函数能够完成矩形的绘制,

该函数原型如下: Status DrawRectangle(const Pen *pen,const Rect &rect); Status DrawRectangle(const Pen *pen, INT x,INT y, INT wi

dth,INT height); Status DrawRectangle(const Pen *pen,REAL x, REAL y,

REAL width,REAL height); Status DrawRectangle(const Pen *pen,const RectF &rect);

GDI+ 还提供了一次绘制多个矩形的函数 DrawRectangles ,该函数原型如下:

Status DrawRectangles(const Pen *pen,const Rect *rects, INT count);

Status DrawRectangles(const Pen *pen,const RectF *rects, INT count);

Page 29: 第 5 章  图形 / 图像处理

3. 绘制多边形 Graphics 类的 DrawPo1ygon 函数提供了对多边形绘制的支持,该函数原型如下:

Status DrawPolygon(const Pen *pen,const Point *points, INT *count);

Status DrawPolygon(const Pen *pen,const PointF *points, INT *count);

Page 30: 第 5 章  图形 / 图像处理

4. 绘制曲线和贝塞尔曲线 绘制曲线

利用 Graphics 对象的成员函数 DrawCurve 或 Draw

ClosedCurve 函数可以进行曲线的绘制 。

DrawCurve() 常用的定义如下: DrawCurve(Pen* pen,Point* points,INT count);

DrawCurve(Pen* pen,Point* points,INT count, RE

AL tension);

Page 31: 第 5 章  图形 / 图像处理

绘制贝塞尔曲线GDI+ 提供的 DrawBezier 函数可以实现贝塞尔曲线的

绘制,该函数原型如下: Status DrawBezier(const Pen *pen,const POINT &pt1,const

POINT &pt2,const POINT &pt3,const POINT 

&pt4);

Status DrawBezier(const Pen *pen,const POINTF &pt1,cons

t POINTF &pt2,const POINTF &pt3,const POI

NTF &pt4);

Status DrawBezier(const Pen *pen,REAL x1, REAL y1, REA

L x2, REAL y2,REAL x3,REAL y3,REAL x4,REAL y

4);

Status DrawBezier(const Pen *pen,INT x1,INT y1, INT x2,

INT y2,INT x3,INT y3,INT x4,INT y4);

Page 32: 第 5 章  图形 / 图像处理

5. 绘制弧线 GDI+ 的 DrawArc 函数用于绘制弧线,该函数原型如下:

Status DrawArc(const Pen *pen,const Rect &rect,

REAL startAngle,REAL sweepAngle);

Status DrawArc(const Pen *pen,const RectF &rect,

REAL startAngle,REAL sweepAngle);

Status DrawArc(const Pen *pen,REAL x, REAL y, RE

AL width, REAL height,REAL startAngle, REAL s

weepAngle);

Status DrawArc(const Pen *pen,INT x,INT y, INT 

width, INT height, REAL startAngle, REAL  sw

eepAngle);

Page 33: 第 5 章  图形 / 图像处理

6. 绘制扇形 GDI+ 的 DrawPie 函数用于绘制扇形,该函数原型如下:

Status DrawPie(const Pen *pen,const Rect &rect,

REAL startAngle, REAL sweepAngle);

Status DrawPie(const Pen *pen,INT x,INT y, INT widt

h, INT height, REAL startAngle, REAL sw

eepAngle);

Status DrawPie(const Pen *pen,REAL x,REAL y, REA

L width, REAL height,REAL startAngle, REAL s

weepAngle);

Status DrawPie(const Pen *pen,const RectF &rect,

REAL startAngle, REAL sweepAngle);

Page 34: 第 5 章  图形 / 图像处理

7. 绘制椭圆 GDI+ 的 DrawEllipse 函数用于绘制扇形,该函数原型如

下:Status DrawEllipse(const Pen *pen,const Rect &rect);

Status DrawEllipse(const Pen *pen,REAL x,REAL y,

REAL width,REAL height);

Status DrawEllipse(const Pen *pen,const RectF &rect);

Status DrawEllipse(const Pen *pen,INT x,INT y, INT 

width, INT height);

Page 35: 第 5 章  图形 / 图像处理

【例 5-10 】编写一个单文档应用程序 Mybasegraph ,显示线段、折线、矩形和扇形等基本图形并进行填充。程序的运行结果如下图所示。

图 5-11 Mybasegraph 的运行效果

Page 36: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mybasegraph ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 37: 第 5 章  图形 / 图像处理

5.4 文本与字体 GDI+ 提供了几个用于绘制文本的类:

FontFamily( 字体系列 )

Font( 字体 )

StringFormat( 字符串格式 )

InstalledFontCollection( 已安装字体信息 )

PrivateFontCollection( 私有字体信息 ) 。

Page 38: 第 5 章  图形 / 图像处理

1.LOGFONTA -- 描述字体信息的指针:typedef struct {

LONG lfHeight; // 字高 LONG lfWidth; // 字宽 LONG lfEscapement; // 字体旋转角度 LONG lfOrientation; // 字体方向 LONG lfWeight; // 字体的轻重 BYTE lfItalic; // 是否斜体 BYTE lfUnderline; // 是否有下划线

5.4.1 使用 GDI+ 字体

Page 39: 第 5 章  图形 / 图像处理

BYTE lfStrikeOut; // 是否有强调线 BYTE lfCharSet; // 字符集 BYTE lfOutPrecision; // 输出精度 BYTE lfClipPrecision; // 剪裁精度 BYTE lfQuality; // 输出质量 BYTE lfPitchAndFamily; // 间距和字体系列 CHAR lfFaceName[LF_FACESIZE]; // 字体名} LOGFONTA;

Page 40: 第 5 章  图形 / 图像处理

2. LOGFONTW LOGFONTW 也是描述字体信息的指针,它的数据

成员与 LOGFONTA 的数据成员基本相同,只是数据成员 lfFaceName 的类型不同。

LOGFONTA 的数据成员 lfFaceName 是单字节 (CHAR) 数组,而 LOGFONTW 的数据成员 lfFaceName是双字节 (WCHAR) 数组。

Page 41: 第 5 章  图形 / 图像处理

3. 字体的大小单位枚举 Unit GDI+ 中用 Unit 描述字体使用的不同单位,定义如下:

typedef enum {

    UnitWorld = 0, // 世界坐标,非物理上的单位    UnitDisplay = 1, // 使用和输出设备相同的单位    UnitPixel = 2, // 像素    UnitPoint = 3, // 点(磅), 1 点 =1/72 英寸    UnitInch = 4, // 英寸    UnitDocument = 5, //1/300 英寸    UnitMillimeter = 6 // 毫米} Unit;

Page 42: 第 5 章  图形 / 图像处理

4. 字体风格枚举 FontStyle GDI+ 中使用 FontStyle 枚举列出了常见的字体风格,定义如下:

typedef enum {    FontStyleRegular = 0, // 常规    FontStyleBold = 1, // 加粗    FontStyleItalic = 2, // 倾斜    FontStyleBoldItalic = 3, // 粗斜    FontStyleUnderline = 4, // 下划线    FontStyleStrikeout = 8 // 强调线} FontStyle;

Page 43: 第 5 章  图形 / 图像处理

5.4.2 Font 类 GDI+ 使用 Font 类来定义一个字体对象。 Font 类的构造函

数如下: Font(const FontFamily *family, REAL emSize, INT style,

Unit unit); Font(const WCHAR *familyName, REAL emSize, INT

 style, Unit unit,const FontCollection *fontCollection); Font(HDC hdc,const HFONT hfont); Font(HDC hdc,const LOGFONTA *logfont); Font(HDC hdc,const LOGFONTW *logfont); Font(HDC hdc);

Page 44: 第 5 章  图形 / 图像处理

5.4.3 字体系列类 FontFamily GDI+ 使用 4 种风格来形成字体系列

规则 (Regular) 黑体 (Bold) 斜体 (Italic) 粗斜体 (Bold Italic)

在 GDI+ 中输出文本之前,需要构造一个 FontFamily 对象和一个 Font 对象。 FontFamily 类的构造函数定义为: FontFamily( ); FontFamily(const WCHAR *name,const FontCollection *f

ontCollection);

Page 45: 第 5 章  图形 / 图像处理

【例 5-11 】编写一个单文档应用程序 Myfont ,用于显示输出多种字体和风格表示的“学习使用 GDI+ 的字体!”。程序的运行结果如下图所示。

图 5-12 Myfont 的运行效果

Page 46: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Myfont ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 47: 第 5 章  图形 / 图像处理

5.4.4 绘制文本 在 GDI+ 中可以使用 DrawString 函数进行文本的显示输出,

该函数原型如下: Status DrawString(const WCHAR *string, INT length,

const Font *font,const RectF &layoutRect, const StringFormat *stringFormat,const Brush *brush);

Status DrawString(const WCHAR *string, INT length, const Font *font,const PointF &origin,const Brush *brush);

Status DrawString(const WCHAR *string, INT length, const Font *font,const PointF &origin,const StringFormat *stringFormat, const Brush *brush);

Page 48: 第 5 章  图形 / 图像处理

StringFormat 对象的建立可以在其构造函数中进行: StringFormat(const StringFormat *format);

StringFormat(INT formatFlags, LANGID language);

枚举 StringFormatFlags 列出了常见的文本格式标记,常用的枚举成员含义如下:

StringFormatFlagsDirectionRightToLeft :从右至左输出文本。 StringFormatFlagsDirectionVertical :垂直方向输出文本。 StringFormatFlagsNoWrap :输出时不使用自动换行功能。 StringFormatFlagsNoClip :不使用剪裁。

1. 格式化文本输出 指向 StringFormat 对象的指

字符使用的语音标识符号

格式标志

Page 49: 第 5 章  图形 / 图像处理

【例 5-12 】编写一个单文档应用程序 Mytextformat ,用于格式化输出文本“锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。”。程序的运行结果如下图所示。

图 5-13 Mytextformat 的运行效果

Page 50: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mytextformat ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 51: 第 5 章  图形 / 图像处理

2. 设置文本对齐方式 GDI+ 主要通过 StringFormat 类的两个成员函数设置文本的对齐方式,

这两个函数的原型定义如下: Status SetAlignment(StringAlignment align);

Status SetLineAlignment(StringAlignment align);

文本的对齐方式 说明

StringAlignmentNear 靠近

StringAlignmentCenter

靠中

StringAlignmentFar 靠远

对齐方式的描述

文本的对齐方式

Page 52: 第 5 章  图形 / 图像处理

【例 5-13 】编写一个单文档应用程序 Mytextalignment ,使用不同的对齐方式输出文本“锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。”和“天生我材必有用,千金散尽还复来。”。程序的运行结果如下图所示。

图 5-14 Mytextalignment 的运行效果

Page 53: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mytextalignment ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 54: 第 5 章  图形 / 图像处理

3. 使用画刷绘制文本 【例 5-14 】编写一个单文档应用程序 Mytextbrush ,使用

不同的画刷填充文本“好好学习”。程序的运行结果如下图所示。

图 5-15 Mytextbrush 的运行效果

Page 55: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Mytextbrush ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 56: 第 5 章  图形 / 图像处理

5.5 图像的处理 5.5.1 图像和位图

GDI+ 提供了用与光栅图像(位图)和矢量图像(图元文件)的类 Image 。

Bitmap 类和 Metafile 类都是从 Image 类继承而来的。 Bitmap 类通过提供用于装入、保存和操纵光栅图像的附加方法扩展了 Image 类的能力。

Metafile 类通过提供用于记录与检查矢量图像的附加方法扩展了Image 类的能力。

Page 57: 第 5 章  图形 / 图像处理

5.5.2 图像的基本操作 1. 图像的打开

在 Image 类的构造函数中,可以直接加载图片供用户使用,构造函数原型如下:

Image(IStream *stream,BOOL useEmbeddedColorManagement);

Image(const WCHAR *filename, BOOL useEmbeddedColorManagement);

Page 58: 第 5 章  图形 / 图像处理

2. 图像的显示 GDI+ 主要使用 DrawImage 函数完成图像的显示,

DrawImage 函数共有 18 种,具体可参看 MSDN 。

3. 图像的剪裁与缩放 图像的剪裁与缩放就是对图片输出的范围和大小进

行设置。剪裁就是输出图片的部分内容,而缩放就是指调整显示区域的大小。

Page 59: 第 5 章  图形 / 图像处理

【例 5-15 】编写一个单文档应用程序 Myimage ,用于图像的剪裁与缩放。程序的运行结果如下图所示。

图 5-16 Myimage 的运行效果

Page 60: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Myimage ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 61: 第 5 章  图形 / 图像处理

4. 控制图形的缩放质量 GDI+ 中可以使用插补模式(也叫插值模式)控制图形的缩放质量。

所谓插补模式是指如何计算两个终结点之间的中间值。 Graphics 对象的插补模式影响图像缩放的质量。 拉伸图像时,原始图像中的每个像素都必须映射为较大

图像中的一组像素。 收缩图像时,必须将原始图像中承租的像素映射为较小

图像中的单个像素。

Page 62: 第 5 章  图形 / 图像处理

【例 5-16 】编写一个单文档应用程序 Myimagemode ,使用不同的插植模式控制图像的缩放质量。程序的运行结果如图下所示。

图 5-17 Myimagemode 的运行效果

Page 63: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Myimagemode ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 64: 第 5 章  图形 / 图像处理

【例 5-17 】编写一个单文档应用程序 Myimagerotate ,显示经过不同的旋转方式后的图像,程序的运行结果如下图所示。

图 5-18 Myimagerotate 的运行效果

Page 65: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程序

Myimagerotate ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )修改视图类的 OnDraw 函数

Page 66: 第 5 章  图形 / 图像处理

5.6 综合实例:画图程序的设计 【例 5-18 】创建一个画图程序 Mypaint ,该程序的功能是

实现根据选择的线型和线宽绘制直线。该程序的实际效果如下图所示。

图 5-19 程序 Mypaint 的实际效果

Page 67: 第 5 章  图形 / 图像处理

程序的实现过程如下: ( 1 )利用 MFC 应用程序向导新建一个单文档应用程

序 MyPaint ( 2 )在程序中使用 GDI+ 命名空间 ( 3 ) GDI+ 资源的初始化与销毁 ( 4 )在编译时加入 GdiPlus.Lib 库文件 ( 5 )添加菜单资源 ( 6 )在视图类的头文件中添加一些成员变量 ( 7 )在视图类中添加公有成员函数 Draw 用于绘制直

线 ( 8 )在视图类中添加消息处理函数 OnLButtonDown

和 OnLButtonDown ( 9 )添加菜单的消息处理函数