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\gdiplus.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调用记录的图形元文件,可被记录(构造)和回放(显示)
|
图元文件头
|
padding-right: 5.4pt; border-top: #ece9d8; padding-le
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
### C# GDI GDI+编程小结 #### 一、引言 GDI+ (Graphics Device Interface Plus) 是微软为了提升 Windows 平台上的图形处理能力而在 Windows XP 和 Windows Server 2003 中引入的一项重要技术。作为 .NET 框架的...
本篇将针对GDI+编程进行深入探讨,涵盖其基本概念、核心组件以及常用技术点。 首先,GDI+的核心组件包括Graphics、Bitmap、Pen、Brush和Font等。Graphics对象是GDI+的主要绘图接口,用于在屏幕上绘制线条、形状和...
#### 小结 通过以上步骤,您已经成功地创建了一个能够使用GDI+功能的项目。需要注意的是,在实际编程过程中还需要根据具体需求调整和优化代码。此外,虽然GDI+提供了一些高级的图形处理功能,但其性能通常不如...
第1章 Visual C++与数字图像处理 1 1.1 数字图像处理概述 2 1.1.1 图像与数字图像 2 1.1.2 数字图像处理研究的内容 4 1.1.3 数字图像处理的应用 6 1.2 Visual C++概述 8 1.2.1 C++语言简介 8 ...15.5 本章小结 640
《.NET自定义控件小结》 在.NET框架中,自定义控件的开发是一项核心技能,尤其在WinForm和WPF平台下,开发者可以通过自定义控件实现丰富的用户界面和独特的功能。本文将围绕.GDI基础和自定义控件的界面编程两大主题...
1.4 小结 第2章 简单用户界面控件 2.1 用户界面设计原则 2.2 漫游简单用户控件 2.2.1 PictureBox控件 2.2.2 Label控件 2.2.3 Textbox控件 2.2.4 List控件 2.2.5 基于按钮的控件 2.2.6 Bar控件 2.3 小结 第3章 高级...
目录 第1章 面向对象编程 1.1 面向对象的基本概念 1.1.1 类和对象 1.1.2 封装、多态和继承 1.1.3 消息 1.2 面向对象的建模技术UML 1.2.1 类图 1.2.2 交互图 1.2.3 用例图 1.3 面向对象的C++语言... 16.5 小结
第一课 Windows编程和面向对象技术 1.1 Windows发展历史 1.2 Windows操作系统特点 1.3 Windows应用程序设计的特点 1.4 Windows应用程序的开发工具 1.5 面向对象和Windows编程 ... 12.5 小结
第一课 Windows编程和面向对象技术 1.1 Windows发展历史 1.2 Windows操作系统特点 1.3 Windows应用程序设计的特点 1.4 Windows应用程序的开发工具 1.5 面向对象和Windows编程 ... 12.5 小结
本章小结 习题 第2章 C#语言基础 2.1 数据类型 2.2 表达式 2.3 程序控制语句 本章小结 习题 第3章 C#.NET面向对象程序设计 3.1 类 3.2 接口 3.3 委托与事件 3.4 编译和调试 本章小结 习题 第4章 常用Windows窗体控件...
VC++编程指南(中文版),不错的一本电子书。啥也不说了,直接看内容预览: 第一课 Windows编程和面向对象技术 1.1 Windows发展历史 1.2 Windows操作系统特点 1.3 Windows应用程序设计的特点 ... 12.5 小结
C#数字图像处理算法典型实例随书光盘 精选数字图像处理领域中的一些应用实例,以理论和实践相结合的方式,系统地介绍了如何使用C#进行数字图像处理。 C#数字图像处理算法典型实例共11章,分别讲述了... 11.8 小结
3.4.7 小结 63 3.5 其他语言 63 3.5.1 Forth 63 3.5.2 Lisp 64 3.5.3 Java 64 3.5.4 Python、Lua、更多 65 第4章 前Windows 时代 67 4.1 386保护模式 68 4.2 VGA 到VESA 70 4.2.1 超越 BGI 70 4.2.2 VGA 72 4.2.3 ...
小结 第十三章 基本物理建模 物理学基本定律 线性动量的物理性质:守恒和传递 万有引力效果模型 磨擦力 基本的特殊碰撞响应(高级) 解决n-t坐标系统 简单运动学 微粒系统 游戏关键:创建游戏...