GDI+(Graphics Device Interface Plus 图形设备接口加)是 Windows XP 和 Windows Server 2003 操作
系统的子系统,也是.NET 框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。
GDI+不但在功能上比 GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为 Windows 图
形图像程序开发的首选。
一、 GDI+的特点和新增功能
GDI+与 GDI 一样,都具有设备无关性。应用程序的程序员可利用 GDI+这样的图形设备接口在屏幕或
打印机上显示信息,而不需要考虑特定显示设备的具体情况。应用程序的程序员调用 GDI+类提供的方法,
而这些方法又反过来相应地调用特定的设备驱动程序。GDI+将应用程序与图形硬件隔离,而正是这种隔离
允许开发人员创建设备无关的应用程序。
1、 GDI+
的功能
GDI+主要提供了以下三种功能:
1) 二维矢量图形
矢量图形包括坐标系统中的系列点指定的绘图基元(如直线、曲线和图形)。例如,直线可通过它的
两个端点来指定,而矩形可通过确定其左上角位置的点并给出其宽度和高度的一对数字来指定。简单路径
可由通过直线连接的点的数组来指定。贝塞尔样条是由四个控制点指定的复杂曲线。
GDI+提供了存储基元自身相关信息的类(结构)、存储基元���制方式相关信息的类,以及实际进
行绘制的类。例如,Rectangle 结构存储矩形的位置和尺寸;Pen 类存储有关线条颜色、线条粗细和线型
的信息;而 Graphics 类具有用于绘制直线、矩形、路径和其它图形的方法(类似于 GDI 中的 CDC 类)。
还有几种 Brush 类,它们存储有关如何使用颜色或图案来填充封闭图形和路径的信息。
用户可以在图元文件中记录矢量图像(图形命令的序列)。GDI+提供了 Metafile 类,可用于记录、显
示和保存图元文件。MetafileHeader 和 MetaHeader 类允许您检查图元文件头中存储的数据。
2) 图像处理
某些种类的图片很难或者根本无法用矢量图形技术来显示。例如,工具栏按钮上的图片和显示为图标
的图片就难以指定为直线和曲线的集合。拥挤的棒球运动场的高分辨率数字照片会更难以使用矢量技术来
制作。这种类型的图像可存储为位图,即代表屏幕上单个点颜色的数字数组。
GDI+提供了 Image、Bitmap 和 Metafile 类,可用于显示、操作和保存位图。它们支持众多的图像文
件格式,还可以进行多种图像处理的操作。
3) 文字显示版式
就是使用各种字体、字号和样式来显示文本。GDI +为这种复杂任务提供了大量的支持。GDI+中的新
功能之一是子像素消除锯齿,它可以使文本在 LCD 屏幕上呈现时显得比较平滑。 2、 GDI+新增特性
1)、渐变画刷
渐变画刷(gradient brush 梯度刷)通过提供用于填充图形、路径和区域的线性渐变画笔和路径渐变画
笔,GDI+扩展了 GDI 的功能。渐变画笔还可用于绘制直线、曲线和路径。线性渐变画笔可用于使用颜色
来填充图形,画笔在图形中移动时,颜色会逐渐改变。例如,假定通过指定图形左边为蓝色、右边为绿色,
创建了一个水平渐变画笔。当用水平渐变画笔填充该图形时,随着画笔从图形的左边移至右边,颜色就会
由蓝色逐渐变为绿色。用类似方法定义的垂直渐变画笔填充的图形,颜色从上到下变化。图显示了用水平
渐变画笔填充的椭圆和用斜式渐变画笔填充的区域。
图 水平和斜式渐变画笔 用路
径渐变画笔填充图形时,可选择不同的方法来指定当从图形的一部分至另一部分移动画笔时颜色的变化方
式。一种选择是指定中心颜色和边缘颜色,在从图形中间向外边缘移动画笔时,像素逐渐从一种颜色变化
到另一种颜色。图显示了用路径渐变画笔填充的路径(该路径是用一对贝塞尔样条创建的)。
图 路径渐变画笔
2)、基数样条函数
GDI+支持在 GDI 中不支持的基数样条(cardinal spines)。基数样条是一连串单独的曲线,这些曲线
连接起来形成一条较长的光滑曲线。样条由点的数组指定,并通过该数组中的每一个点。基数样条平滑地
(没有锐角)通过数组中的每一个点,因此,比通过连接直线创建的路径更光滑精准。图显示了两个路径:
一个以基数样条的形式创建;另一个通过连接直线创建。
图 基数样条路径和折线路径
3)、持久路径对象
在 GDI 中,路径属于设备上下文,并且会在绘制时被毁坏。利用 GDI +,绘图由 Graphics 对象执行,
可以创建并维护几个与 Graphics 对象分开的持久的路径对象(persistent path object)—— GraphicsPath
对象。绘图操作不会破坏 GraphicsPath 对象,因此可以多次使用同一个 GraphicsPath 对象来绘制路径。
4)、变换和矩阵对象
GDI+提供了 Matrix(矩阵) 对象,它是一种可以使(缩放、旋转和平移等)变换(transformation)
简易灵活的强大工具。矩阵对象一般与变换对象联合使用。例如,GraphicsPath 对象具有 Transform 方
法,此方法接收 Matrix 对象作为参数。单一的 3×3 矩阵可存储一种变换或一个变换序列。图显示了一个
路径在执行两种变换前后的情况。 图 路径的变换
5)、可伸缩区域
GDI+ 通过对可伸缩区域(Scalable Regions)的支持极大地扩展了 GDI。在 GDI 中,区域被存储在
设备坐标中,而且,可应用于区域的惟一变换是平移。而 GDI+在全局坐标中存储区域,并且允许区域发生
任何可存储在变换矩阵中的变换(如缩放和旋转)。图显示一个区域在执行三种变换(缩放、旋转和平移)
前后的情况。 图 区域的三种变换(缩放、旋转和平移)
6)、α 混色
在下图中,可以在变换区域(用蓝色阴影画笔填充)中看到未变换区域(用红色填充)。这是由 GDI+
支持的 α 混色(Alpha Blending,透明混合)实现的。使用 α 混色,可以指定填充颜色的透明度。透明色
与背景色相混合———填充色越透明,透出的背景色就越多。图显示四个用相同颜色(红色)填充、但透
明层次不同的椭圆。 图 不同透明度
7)、丰富的图像格式支持
GDI+提供 Image、Bitmap 和 Metafile 类,可以用不同的格式加载、保存和操作图像。GDI+支持 BMP、
GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF 共 9 种常见的图像格式。
8)、GDI+的不足
虽然,相对于 GDI 来说,GDI+ 确实增加了许多新特性,而且功能更强大,使用也更方便。但是,这
并不等于 GDI+ 就能够完全代替 GDI。
因为 GDI+实际上是 GDI 的封装和扩展,GDI+的执行效率一般要低于 GDI 的。另外,GDI+不支持图
的位运算,那么就不能进行异或绘图等操作。而且在 VC 中,GDI+ 还不支持双缓存机制(如内存 DC 和
显示 DC),这将大大影响 GDI+ 在高速图形、图像、动画和视频等方面的应用。 3、 GDI+的使用
1) GDI+开发包
若采用的是 Visual C++ 2008,则已经包含了开发 GDI+应用程序所需的所有东西。如果使用的是 Visual
C++6.0 而非 VS.Net,我们需要下载微软的 GDIPLUS 支持包。在微软官方网站下载时需认证 Windows 为
正版,我们可从这个地址下载:http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip。一个完整的 GDI+
支持包至少包括如下文件:
(1)头文件:gdiplus.h
(2)动态链接库的.lib 文件:gdiplus.lib
(3)动态链接库的.dll 文件:gdiplus.dll
少了(1)、(2)程序不能编译,少了(3)程序能以共享 DLL 的方式编译但是不能运行,运行时找不到.dll
文件。
如果你使用的操作系统是 Windows XP 或 Windows Server 2003,则 GDI+所对应的动态链接库,已
经被包含在其中。gdiplus.dll 一般位于操作系统的 WinSxS(Windows side-by-side assembly,视窗并行
程序集)目录中,例如:
C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.0.0_x-ww_8d353f13\gd
iplus.dll(1661KB,2002.10.8)
而 GDI 的动态链接库 gdi32.dll,却一般在操作系统的 32 位系统目录中:
F:\WINDOWS\system32\gdi32.dll(272KB,2004.8.4)
2) VC 使用 GDI+初始化准备工作。
#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "c:\gdiplus\includes\gdiplus.h"
using namespace Gdiplus;
#pragma comment(lib, "c:\\gdiplus\\lib\\gdiplus.lib")
//在 CWinApp 派生类的 InitInstance 函数中加入:
//初始化 gdiplus 的环境
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// 初始化 GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
//在 CWinApp 派生类的 ExitInstance 函数中加入:
//关闭 gdiplus 的环境
GdiplusShutdown(gdiplusToken); 4、GDI+的组成
GDI+ API 包含 54 个类、12 个函数、6 类(226 个)图像常量、55 种枚举和 19 种结构。
1)、类
GDI+ API 中共有 54 个类,核心类是 Graphics,它是实际绘制直线、曲线、图形、图像和文本的类。
许多其它 GDI+类是与 Graphics 类一起使用的。例如,DrawLine 方法接收 Pen 对象,该对象中存有所要
绘制的线条的属性(颜色、宽度、虚线线型等)。FillRectangle 方法可以接收指向 LinearGradientBrush
对象的指针,该对象与 Graphics 对象配合工作来用一种渐变色填充矩形。Font 和 StringFormat 对象影响
Graphics 对象绘制文本的方式。Matrix 对象存储并操作 Graphics 对象的仿射变换——旋转、缩放和翻转
图像。
GDI+还提供了用于组织图形数据的几种结构类(例如 Rect、Point 和 Size)。而且,某些类的主要作
用是结构化数据类型。例如,BitmapData 类是 Bitmap 类的帮助器,PathData 类是 GraphicsPath 类的帮
助器。
下面是所有 GDI+的 API 类的列表: GDI+的 API 类(54 个)
名称
类
功能
调整箭头帽
AdjustableArrowCap
创建自定义箭头线帽
位图
Bitmap
提供装入和保存矢量和光栅图像的方法,并可以创建和操作光栅图像
位图数据
BitmapData
保存位图的属性
模糊
Blur
将高斯模糊效果作用到图像
亮度对比度
BrightnessContrast
改变图像的亮度和对比度
刷
Brush
定义刷对象
缓存图像
CachedBitmap
用为特点设备显示而优化过的格式存储位图
字符范围
CharacterRange
指定串内字符位置的范围
颜色
Color
保存表示颜色的 32 位值
色平衡
ColorBalance
改变位图的颜色平衡
颜色曲线
ColorCurve
可调整位图的曝光度、密度、对比度、加亮、阴影、色调、白饱和和黑饱和。
颜色查找表
ColorLUT
用于定制位图的颜色调整
颜色矩阵效果
ColorMatrixEffect
对位图进行仿射变换
定制线帽
CustomLineCap
封装了自定义线帽
效果
Effect
作用于图像的效果和调整类的基类
编码器参数
EncoderParameter
保存图像编码器的参数
编码器参数组
EncoderParameters
图像编码器参数的数组
字体
Font
封装了字体的族系、高度、大小和风格等特性
字体集
FontCollection
包含枚举字体集中的字体族系的方法
字体族
FontFamily
封装了构成一个字体族的字体集合
GDI+基类
GdiplusBase
提供对 GDI+对象的存储分配与释放,是其它 GDI+类的基类
图形
Graphics
提供绘制图形、图像和文本的方法,存储显示设备和被画项目的属性
图形路径
GraphicsPath
保存一个供绘图用的直线、曲线和形状序列
图形路径迭代器
GraphicsPathIterator
提供从保存在 GraphicsPath 对象中的路径里选择孤立子集的方法
影线刷
HatchBrush
定义具有影线风格和前景色/背景色的矩形刷
色调饱和度亮度
HueSaturationLightness
改变位图的色调 H、饱和度 S 和亮度 L
图像
Image
提供装入和保存矢量和光栅图像的方法
图像属性
ImageAttributes
含渲染时如何操作位图和图元文件颜色的信息
图像编解码信息
ImageCodecInfo
存储与图像编解码有关的信息
图像项数据
ImageItemData
用于存储和获取自定义图像的元数据
已装入字体集
InstalledFontCollection
定义表示已装入系统中的字体集
级别
Levels
可调整位图的加亮、阴影和色调
线形梯度刷
LinearGradientBrush
定义线性渐变刷
矩阵
Matrix
表示 3×3 的仿射变换矩阵
图元文件
Metafile
定义包含描述一系列图形 API 调用记录的图形元文件,可被记录(构造)和回放(显示)
图元文件头
MetafileHeader
保存关联图元文件的性质
路径数据
PathData
GraphicsPath 和 GraphicsPathIterator 类的助手类,用于获取和设置路径中的数据点及其类型
路径梯度刷
PathGradientBrush
保存颜色的梯度属性,用于渐变色填充路径内部
笔
Pen
用于绘制直线和曲线的笔对象
点
Point
封装 2D 整数坐标系统中的点
浮点点
PointF
封装 2D 浮点坐标系统中的点
专用字体集
PrivateFontCollection
保存用于特定应用程序的字体集,可含未装入系统中的字体
特性项
PropertyItem
Image 和 Bitmap 类的助手类,保存一块(piece)图像元数据
矩形
Rect
保存矩形的左上角、宽度和高度之对象(整数)
浮点矩形
RectF
保存矩形的左上角、宽度和高度之对象(浮点数)
红眼校正
RedEyeCorrection
校正有时在闪光照片中出现的红眼
区域
Region
描述显示表面的范围,可以是任意形状
锐化
Sharpen
调整位图的清晰度
大小
Size
封装 2D 整数坐标系统中的宽和高
浮点大小
SizeF
封装 2D 浮点数坐标系统中的宽和高
实心刷
SolidBrush
定义实心颜色的刷子对象
串格式
StringFormat
封装文本的格式(layout)信息和显示操作
纹理刷
TextureBrush
用于填充的包含图像对象的刷子
浓淡
Tint
改变位图的色彩浓淡 下面是 GDI+ API 类的层次结构图:
GdiplusBase
Graphics
GraphicsPath
GraphicsPathIterator
Pen
Brush
SolidBrush
HatchBrush
TextureBrush LinearGradientBrush
PathGradientBrush
Image
Bitmap
Metafile
CustomLineCap
AdjustableArrowCap
CachedBitmap
ImageAttributes
FontCollection
InstalledFontCollection
PrivateFontCollection
StringFormat
Region
Font
FontFamily
Matrix
Point
PointF
Size
SizeF
Rect
RectF
Color
Effect
Blur
BrightnessContrast
ColorBalance
ColorCurve
ColorLUT
ColorMatrixEffect
HueSaturationLightness
Levels
RedEyeCorrection
Sharpen
Tint
ImageItemData
BitmapData
MetafileHeader
PropertyItem
EncoderParameter
EncoderParameters
ImageCodecInfo
PathData
CharacterRange
独立类
绘图类
效果类
GDI+类的层次结构图 2)、函
数
GDI+命名空间中的函数(12 个)
名称
函数
功能
关闭 GDI+
GdiplusShutdown
清除 GDI+所使用的资源
启动 GDI+
GdiplusStartup
初始化 GDI+
获取图像解码器
GetImageDecoders
获取含有可用图像解码器信息的 ImageCodecInfo 对象数组
获取图像解码器的大小
GetImageDecodersSize
获取含有可用图像解码器的数目
获取图像编码器
GetImageEncoders
获取含有可用图像编码器信息的 ImageCodecInfo 对象数组
获取图像编码器的大小
GetImageEncodersSize
获取含有可用图像编码器的数目
获取像素格式大小
GetPixelFormatSize
返回指定像素格式的每像素二进制位数
是否为 α 像素格式
IsAlphaPixelFormat
确定指定像素格式是否有 α 分量
是否为
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
像素格式
IsCanonicalPixelFormat
确定指定像素格式是否为规范格式之一
是否为扩展像素格式
IsExtendedPixelFormat
确定指定像素格式是否使用 16 位色
是否为索引像素格式
IsIndexedPixelFormat
确定指定像素格式是否是索引格式
对象类型是否有效
ObjectTypeIsValid
确定 ObjectType 枚举元素是否表示一个有效对象类型 3)、常量
GDI+中定义了如下 6 类图像常量(226 个):(GdiplusImaging.h)
类型
常量
说明
图像
文件
格式
ImageFormat*
(11 个)
ImageFormatBMP
BMP(BitMaP 位图)
ImageFormatEMF
EMF(Enhanced MetaFile 增强图元文件)
ImageFormatEXIF
Exif(Exchangeable Image File 可交换图像文件)
ImageFormatGIF
GIF(Graphics Interchange Format 图形交换格式)
ImageFormatIcon
Icon(图标)
ImageFormatJPEG
JPEG(Joint Photographic Experts Group 联合图象专家组)
ImageFormatMemoryBMP
从内存位图构造的图像
ImageFormatPNG
PNG(Portable Network Graphics 可移植网络图形)
ImageFormatTIFF
TIFF(Tagged Image File Format 标签图像文件格式)
ImageFormatUndefined
不能确定格式
ImageFormatWMF
WMF(Windows Metafile Format 视窗图元文件格式)
图像
帧维
FrameDimensionPage
多帧 TIFF 图像
FrameDimensionTime
多帧 GIF 图像
图像
编码器
(13 个)
EncoderChrominanceTable
色度表
EncoderColorDepth
颜色深度
EncoderColorSpace
颜色空间
EncoderCompression
压缩
EncoderLuminanceTable
亮度表
EncoderQuality
质量
EncoderRenderMethod
渲染方法
EncoderSaveFlag
保存标志
EncoderScanMethod
扫描方法
EncoderTransformation
变换
EncoderVersion
版本
EncoderImageItems
图像项
EncoderSaveAsCMYK
保存为 CMYK(Cyan 青、Magenta 品红、Yellow 黄、blacK 黑,用于印刷的四分色)
图像
像素
格式
(14 个)
PixelFormat1bppIndexed
每像素 1 位,索引色
PixelFormat4bppIndexed
每像素 4 位,索引色
PixelFormat8bppIndexed
每像素 8 位,索引色
PixelFormat16bppARGB1555
每像素 16 位,α 分量 1 位、RGB 分量各 5 位
PixelFormat16bppGrayScale
每像素 16 位,灰度
PixelFormat16bppRGB555
每像素 16 位,RGB 分量各 5 位,另 1 位未用
PixelFormat16bppRGB565
每像素 16 位,RB 分量各 5 位、G 分量 6 位
PixelFormat24bppRGB
每像素 24 位,RGB 分量各 8 位
PixelFormat32bppARGB
每像素 32 位,αRGB 分量各 8 位
PixelFormat32bppPARGB
每像素 32 位,αRGB 分量各 8 位,RGB 分量预乘 α 分量
PixelFormat32bppRGB
每像素 24 位,RGB 分量各 8 位,另 8 位未用
PixelFormat48bppRGB
每像素 48 位,RGB 分量各 16 位
PixelFormat64bppARGB
每像素 64 位,αRGB 分量各 16 位
PixelFormat64bppPARGB
每像素 64 位,αRGB 分量各 16 位,RGB 分量预乘 α 分量
图像
特性
标志
类型
(9 个)
PixelFormat4bppIndexed
格式为每像素 4 位,索引色
PropertyTagTypeASCII
值数据成员为以 null 结尾的 ASCII 字符串
PropertyTagTypeByte
值数据成员为字节数组
PropertyTagTypeLong
值数据成员为 32 位无符号长整数的数组
PropertyTagTypeRational
值数据成员为 32 位无符号长整数对的数组,每对数中的第一个整数为分子,第二个整数为分母
PropertyTagTypeShort
值数据成员为 16 位无符号短整数的数组
PropertyTagTypeSLONG
值数据成员为 32 位有符号长整数的数组
PropertyTagTypeSRational
值数据成员为 32 位有符号长整数对的数组,每对数中的第一个整数为分子,第二个整数为分母
PropertyTagTypeUndefined
值数据成员为字节数组,可保存任何数据类型的值
图像
特性
标志
(217 个)
PropertyTagGpsVer ~
GPS(Global Positioning Systems 全球定位系统)版本
PropertyTagGpsDestDist
(0x0000)~ 到目标点的距离(0x001A)(27 个)
PropertyTagNewSubfileType ~
子文件数据类型(0x00FE)~
PropertyTagPageNumber
被扫描图像的页数(0x0129)(44 个)
PropertyTagTransferFunction
图像传送函数表(0x012D)
PropertyTagSoftwareUsed
指定用于生成图像的设备之软件或固件的名称和版本的以 null 结尾的字符串(0x0131)
PropertyTagDateTime
图像创建的日期和时间(0x0132)
PropertyTagArtist ~
指定图像创建者姓名的以 null 结尾的字符串(0x013B)
PropertyTagTileByteCounts
~ 标题的字节数(0x0145)(11 个)
PropertyTagInkSet ~
在分开图像中使用的墨水集(0x014C)
PropertyTagNumberOfInks
~ 墨水数目(0x014D)(3 个)
PropertyTagDotRange ~
对应于 0%点和 100%点的颜色分量值(0x0150)~
PropertyTagTransferRange
扩充传送函数范围的值表(0x0156)(7 个)
PropertyTagJPEGProc ~
JPEG 压缩过程(0x0200)~
PropertyTagImageTitle
图像标题的以 null 结尾的字符串(0x0320)(17 个)
PropertyTagResolutionXUnit ~
显示水平分辨率的单位(0x5001)~(27 个)
PropertyTagThumbnailData
RGB 或 JPEG 中的原始缩略图中的位数据(0x501B)
PropertyTagThumbnailImage
Width ~
略图像的每行像素数(0x5020)~(28 个)
PropertyTagThumbnailCopy
Right
含缩略图像版权信息的以 null 结尾的字符串(0x503B)
PropertyTagLuminanceTable
亮度表(0x5090)
PropertyTagFrameDelay ~
GIF 动画中两帧之间的延时,单位为 10 毫秒(0x5100)
PropertyTagPaletteHistogram
~ 调色板直方图(0x5113)(9 个)
PropertyTagCopyright ~
含版权信息的以 null 结尾的字符串(0x8298B)~
PropertyTagExifCfaPattern
颜色滤波器数组(0xA302)(48 个) 4)、枚举
GDI+定义了 55 种枚举,它们都是相关常数的集合。例如,LineJoin 枚举包含元素 Bevel、Miter 和
Round,它们指定可用于连接两个线条的线型。下面是所有枚举类型的列表: GDI+枚举类型(55 种)
枚举类型
名称 枚举类型
名称
BrushType
刷类型
ImageType
图像类型
ColorAdjustType
颜色调整类型
InterpolationMode
插值类型
ColorChannelFlags
颜色通道标志
ItemDataPosition
项数据位置
ColorMatrixFlags
颜色矩阵标志
LinearGradientMode
线性梯度模式
CombineMode
组合模式
LineCap
线帽
CompositingMode
合成模式
LineJoin
线连接
CompositingQuality
合成质量
MatrixOrder
矩阵序(左右乘)
CoordinateSpace
坐标空间
MetafileFrameUnit
图元文件帧单位
CurveAdjustments
曲线调整
MetafileType
图元文件类型
CurveChannel
曲线通道
ObjectType
对象类型
DashCap
虚线帽
PaletteFlags
调色板标志
DashStyle
虚线风格
PaletteType
调色板类型
DitherType
抖动类型
PathPointType
路径点类型
DriverStringOptions
驱动器串选项
PenAlignment
笔对齐
EmfPlusRecordType
EMF+等图元文件记录类型
PenType
笔类型
EmfToWmfBitsFlags
EMF 转 WMF 的标志位
PixelOffsetMode
像素偏移模式
EmfType
EMF 类型
RotateFlipType
旋转翻转类型
EncoderParameterValueType
编码器参数值类型
SmoothingMode
平滑模式
EncoderValue
编码器值
Status
状态
FillMode
填充模式
StringAlignment
串对齐
FlushIntention
刷新意图
StringDigitSubstitute
串数字替换
FontStyle
字体风格
StringFormatFlags
串格式标志
HatchStyle
影线风格
StringTrimming
串修整
HistogramFormat
直方图格式
TextRenderingHint
文本渲染提示
HotkeyPrefix
热键前缀
Unit
单位
ImageCodecFlags
图像编解码标志
WarpMode
弯曲模式
ImageFlags
图像标志
WrapMode
覆盖模式
ImageLockMode
图像加锁模式 5)、结构
GDI+ API 中还定义了 19 种结构,用于 GDI+的各种函数调用中。下面是所有 GDI+ API 结构的列表:
GDI+ API 中的结构(19 种)
结构
名称
BlurParams
模糊参数
BrightnessContrastParams
亮度对比度参数
ColorBalanceParams
颜色平衡参数
ColorCurveParams
颜色曲线参数
ColorLUTParams
颜色查找表参数
ColorMap
颜色映射
ColorMatrix
颜色矩阵
ColorPalette
颜色调色板
ENHMETAHEADER3
增强图元文件头
GdiplusAbort
GDI+异常中断
GdiplusStartupInput
GDI+启动输入
GdiplusStartupOutput
GDI+启动输出
HueSaturationLightnessParams
色调饱和度亮度参数
LevelsParams
级别参数
PWMFRect16
可定位 WMF 矩形(INT16 整数值)
RedEyeCorrectionParams
红眼校正参数
SharpenParams
锐化参数
TintParams
浓淡参数
WmfPlaceableFileHeader
可定位 WMF 文件头
6)、GDI+平面 API
GDI+暴露出(exposes)一个平面(flat)API,它包含大约 600 个函数,被实现在 Gdiplus.dll 中,声
明在 Gdiplusflat.h 内。这些函数被包装到了前面讨论过的 GDI+ API 的 54 个 C++类的集合之中。不要直接
调用这些函数,而推荐用调用类成员方法来替代。因为微软产品支持服务(Microsoft Product Support
Services),不会为直接调用平面 API 的代码提供支持。
作为 C++封装的替代方案,微软网络框架(Microsoft .NET Framework),提供了 GDI+的一个托管代
码封装类集,包含大约 60 个类、50 个枚举和 8 个结构。它们属于下列命名空间: // 在 C#中使用之
System.Drawing
System.Drawing.Drawing2D
System.Drawing.Imaging
System.Drawing.Text
System.Drawing.Printing
DllExports
System.Drawing[.dll]
Gdiplus
Gdiplus.h
afxwin.h
C++封装
(MFC)
C++封装
托管代码封装
设备驱动程序
计算机硬件(显示器、打印机等图形设备)
GDI API
GDI+平面 API
C++
C#、VB、J#
GDI+ API
GDI+托管类接口
GDI 类与结构
Gdi32.dll
WinGDI.h
Gdiplus.dll
GdiplusFlat.h
GDI+的
封装与使用
这两种包装(C++和托管代码)都采用了面向对象方法,所以二者在将参数传递给封装的方法和将参
数传递给平面 API 函数的方式上存在差别。 二、GDI+编程
本部分简单介绍 GDI+编程中的一些概念与技巧,具体的编程细节请参考《精通 GDI+编程》、陈宝楷
《GDI+编程》等书籍。
1、Point、浮点数点类 PointF;Size、浮点数大小类 SizeF;Rect、浮点数矩形类 RectF 等。 浮
点数版的几何对象和绘图函数,是 GDI+新增的功能,这些在各种工程技术领域都非常有用。因为一般的实
际图形
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
,都是基于实数坐标的。包括机械(机床/汽车/轮船/飞机等)、建筑(房屋/桥梁/道路/堤坝等)
和图形动画设计(形状/物体/人物/背景/轨迹等)等设计,都必须使用浮点参数和坐标系。
2、Color:在 GDI+中,色彩是通过 Color(色彩)类来描述的。Color 类的构造函数分别为:
Color();
Color(BYTE a,BYTE r,BYTE g,BYTE b);
Color(ARGB argb);
Color(BYTE r,BYTE g,BYTE b);
参数:
a:色彩的透明度(0~255)
r、g、b:红、绿、蓝 3 种色彩分量值(0~255)
不同于 GDI,GDI+在对色彩支持方面主要体现在对色彩的透明度支持。从本质上讲,透明度是像素之
间的一种合成运算。它的计算公式是:
输出色彩=前景色*Alpha/255 + 背景色*(255-Alpha)/255
3、Graphics(图形)
图形类 Graphics 是 GDI+的核心,它提供绘制图形、图像和文本的各种方法(操作/函数)(似 GDI
中的 CDC 类),还可以存储显示设备和被画项目的属性(到图元文件)。Graphics 类及其成员函数都被
定义在头文件 Gdiplusgraphics.h 中。
Graphics 类的构造函数有如下 4 种:
Graphics(Image* image); // 用于绘制图像
Graphics(HDC hdc); // 用于在当前窗口中绘图
Graphics(HDC hdc, HANDLE hdevice); // 用于在指定设备上绘制图形
Graphics(HWND hwnd, BOOL icm = FALSE); // 用于在指定窗口中绘图可以进行颜色调整
其中,最常用的是第二种——在当前视图窗口中绘图的图形类构造函数。
注意,该构造函数的输入参数,是设备上下文的句柄,而不是 CDC 类对象的指针。一般可以由 CDC
对象得到(CDC 类含有公用数据成员 HDC m_hDC;)
6 种绘制直线和折线的函数:(前三个为整数版,后三个为对应的浮点数版) // 画折线
DrawLines
Status DrawLine(const Pen* pen, INT x1, INT y1, INT x2, INT y2);
Status DrawLine(const Pen* pen, const Point& pt1, const Point& pt2);
Status DrawLines(const Pen* pen, const Point* points, INT count); // 画折线
Status DrawLine(const Pen* pen, REAL x1, REAL y1, REAL x2, REAL y2);
Status DrawLine(const Pen* pen, const PointF& pt1, const PointF& pt2);
Status DrawLines(const Pen* pen, const PointF* points, INT count);
6 种绘制矩形和矩形组的函数:(也是前三个为整数版,后三个为对应的浮点数版) // Rectangle = rect
angle
Status DrawRectangle(const Pen* pen, const Rect& rect);
Status DrawRectangle(const Pen* pen, INT x, INT y, INT width, INT height);
Status DrawRectangles(const Pen* pen, const Rect* rects, INT count);
Status DrawRectangle(const Pen* pen, const RectF& rect);
Status DrawRectangle(const Pen* pen, REAL x, REAL y, REAL width, REAL height);
Status DrawRectangles(const Pen* pen, const RectF* rects, INT count);
绘制椭圆的函数,如果输入参数所确定的外接矩形的宽高相等,则画圆。(也是前两个为整数版,后
两个为对应的浮点数版)
Status DrawEllipse(const Pen* pen, const Rect& rect);
Status DrawEllipse(const Pen* pen, INT x, INT y, INT width, INT height)
Status DrawEllipse(const Pen* pen, const RectF& rect);
Status DrawEllipse(const Pen* pen, REAL x, REAL y, REAL width, REAL height);
绘制椭圆弧的函数,如果输入参数所确定的外接矩形的宽高相等,则画圆弧。(也是前两个为整数版,
后两个为对应的浮点数版)
Status DrawArc(const Pen* pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL
sweepAngle); // sweep 掠过
Status DrawArc(const Pen* pen, const Rect& rect, REAL startAngle, REAL sweepAngle);
Status DrawArc(const Pen* pen, REAL x, REAL y, REAL width, REAL height, REAL startAngle,
REAL sweepAngle);
Status DrawArc(const Pen* pen, const RectF& rect, REAL startAngle, REAL sweepAngle);
画弧函数的输入参数 // 注意:顺时
钟方向
该函数的功能与 GDI 的 Arc 相同:
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
但是也有区别,主要是,最后的参数不再是弧的终角,而是弧段所对应的扫描角。这倒是与另一个 GDI
画圆弧函数类似(其中(x, y)为圆心、nRadiu