GDI+高级编程 - 图文(8)

2019-08-03 13:52

GraphicsPath newPath(points, types, n); // 用新路径点构造新路径 CRect crect; // 定义矩形对象

GetClientRect(&crect); // 获取客户区矩形

Graphics graph(pDC->m_hDC); // 将坐标原点移到窗口中心: graph.TranslateTransform(REAL(crect.Width() / 2),

REAL(crect.Height() / 2));

// 填充路径(绘制文本串)

graph.FillPath(&SolidBrush(Color::Green), &newPath);

图13-29 大小渐变文字

定义路径对象 GraphicsPath 获取路径点数 GetPointCount 创建类型数组 new BYTE[n] 获取路径类型数组 GetPathTypes 创建点数组 new PointF[n] 获取路径点数组 GetPathPoints 修改点的坐标值 (循环算法计算) 构造新路径 GraphicsPath 加文本串入路径 AddString 获取路径外接矩形 GetBounds 平移原点到路径中心 Translate 创建图形对象 Graphics 平移原点到窗口中心 TranslateTransform 填充路径(绘制文本串) FillPath 定义矩形对象 RectF 定义矩阵对象 Matrix 定义矩形对象 CRect 获取客户区矩形 GetClientRect 图13-30 字符串变换的过程框图

采用类似的方法,还可以让文本串沿圆周输出,留作本章的练习作业。

13.3.4 刷变换

GDI+的刷类(包括纹理刷类TextureBrush、线性渐变刷类LinearGradientBrush和路径渐变刷类PathGradientBrush)的对象,都支持基本的仿射变换(平移、旋转和伸缩):

36

Status TranslateTransform(REAL dx, REAL dy, MatrixOrder order = MatrixOrderPrepend); Status RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend); Status ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);

而且都可以设置复杂的矩阵变换:

Status SetTransform(const Matrix *matrix);

还都支持矩阵变换:

Status MultiplyTransform(const Matrix* matrix, MatrixOrder order = MatrixOrderPrepend); 例如:

LinearGradientBrush brush(Point(0, 0), Point(200, 0), Color::Red, Color::Blue); brush.TranslateTransform(100.0, 50.0);

由于篇幅的限制,这里就不一一介绍了,有兴趣的同学可以看相关的图书资料。

13.4 图像

与CImage类似(参见9.3.4),GDI+也支持BMP、GIF、JPEG、Exif、PNG、TIFF、ICON、WMF和EMF共计9种用于Windows的常见图像格式。其实MFC的CImage类正是GDI+图像基本功能的封装和应用,而且CImage类的使用比GDI+的简单。

GDI+的图像及其处理的功能十分强大,可以用不同的格式加载、保存和操作图像。但由于篇幅所限,本节只介绍最基本的内容。

GDI+中有三个图像类,其中的Image(图像)为基类,其他两个为

GdiplusBase Image Bitmap Metafile 图13-31 图像类的

它的派生类——Bitmap(位图)和Metafile(图元文件),它们的类层次

层次结构

结构如图13-31所示。Bitmap类对应于点阵位图,Metafile类对应于矢量图形,基类Image则对应于通用操作。

除此之外,还有大量与图像处理有关的GDI+类,如Effect类及其11个派生类以及与图像数据和信息有关的7个独立类。由于时间关系,我们只准备介绍上面这三个主要的图像类及其基本操作。

13.4.1 图像类Image

Image类是图像的基类,包含大量的通用图像操作的接口方法。

37

1.构造函数

Image类有如下两个构造函数:

Image(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE); Image(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);

其中第一个较常用。它们的第二个参数都是用于颜色校正,一般取默认值FALSE即可。

例如:

Image img(L”res\\\\张东健.bmp”); 或

Image *pImg = new Image(ar.GetFile()->GetFilePath());

2.常用方法

Image类的常用方法有:

UINT GetHeight(VOID); // 获取图像高度 UINT GetWidth(VOID); // 获取图像宽度 ImageType GetType(VOID); // 获取图像类型

Status GetRawFormat(GUID *format); // 获取图像原始格式(图像文件类型) UINT GetFlags(VOID); // 获取图像标志

Status GetLastStatus(VOID); // 获取最后的操作状态 Image *Clone(VOID); // 克隆

static Image *FromFile(const WCHAR *filename, // 由文件创建图像对象

BOOL useEmbeddedColorManagement = FALSE);

Status Save(const WCHAR *filename, const CLSID *clsidEncoder, // 保存图像到文件

const EncoderParameters *encoderParams = NULL);

3.获取类型与特征

类型包括图像类型和图像文件类型,图像的类型指位图和图元文件,图像的文件类型指上面提到的9种外加内存图像。特征指图像的颜色、透明、缩放、存储等信息。

1)获取图像对象种类

可以利用Image类的方法GetType(获取类型)来得到图像对象的种类:

38

ImageType GetType(VOID);

该方法返回的是ImageType枚举类型的值:

typedef enum {

ImageTypeUnknown = 0, // 未知 ImageTypeBitmap = 1, // 位图 ImageTypeMetafile = 2 // 图元文件 } ImageType; 2)获取图像文件类型

可以利用Image类的方法GetRawFormat(获取原始格式)来得到图像文件的格式种类:

Status GetRawFormat(GUID *format);

该方法返回值的是如下GUID(Globally Unique IDentifier,全局唯一标识符)结构的指针:

typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8]; } GUID;

该结构可用的指针常量见表13-1。

表13-1 GUID结构指针常量与对应的图像文件格式(11个) 结构指针常量 ImageFormatBMP ImageFormatEMF ImageFormatEXIF ImageFormatGIF ImageFormatIcon ImageFormatJPEG 图像文件格式 BMP(BitMaP,位图) EMF(Enhanced MetaFile,增强图元文件) Exif(Exchangeable Image File,可交换图像文件) GIF(Graphics Interchange Format,图形交换格式) Icon(图标) JPEG(Joint Photographic Experts Group,联合图象专家组) ImageFormatMemoryBMP 从内存位图构造的图像 ImageFormatPNG ImageFormatTIFF ImageFormatUndefined ImageFormatWMF PNG(Portable Network Graphics,可移植网络图形) TIFF(Tagged Image File Format,标签图像文件格式) 不能确定格式 WMF(Windows Metafile Format,视窗图元文件格式) 39

例如(JPEG的GUID为{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}):

Image img(ar.GetFile()->GetFilePath()); GUID guid;

img.GetRawFormat(&guid); if(guid == ImageFormatJPEG)

MessageBox(L\??

3)获取图像标志

可以利用Image类的方法GetFlags(获取标志)来得到图像文件的各种特征标志:

UINT GetFlags(VOID);

该方法返回的是ImageFlags枚举类型的值:

typedef enum {

ImageFlagsNone = 0, // 无格式信息 ImageFlagsScalable = 0x0001, // 可缩放 ImageFlagsHasAlpha = 0x0002, // 含α值 ImageFlagsHasTranslucent = 0x0004, // 可半透明 ImageFlagsPartiallyScalable = 0x0008, // 可部分缩放 ImageFlagsColorSpaceRGB = 0x0010, // 颜色空间为RGB ImageFlagsColorSpaceCMYK = 0x0020, // 颜色空间为CMYK ImageFlagsColorSpaceGRAY = 0x0040, // 颜色空间为灰度 ImageFlagsColorSpaceYCBCR = 0x0080, // 颜色空间为YCbCr ImageFlagsColorSpaceYCCK = 0x0100, // 颜色空间为YCCK

ImageFlagsHasRealDPI = 0x1000, // 含有DPI(dots per inch每英寸点数)信息 ImageFlagsHasRealPixelSize = 0x2000, // 含有像素大小信息 ImageFlagsReadOnly = 0x00010000, // 像素数据是只读的 ImageFlagsCaching = 0x00020000 // 像素数据可被高速缓存 } ImageFlags;

40


GDI+高级编程 - 图文(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国铜管市场及投资调研报告目录

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: