`
huozheleisi
  • 浏览: 1234419 次
文章分类
社区版块
存档分类
最新评论

GDI+使用说明

 
阅读更多

基于Visual C++.NET的GDI+开发教程

  以前开发人员可以通过GDI(GraphicsDevice Interface)在Windows窗口中绘制图形、文本和图像。但GDI的图像处理能力却非常欠缺,位图超过256色就会失真或不能显示,因此开发人员在焦急的等待新一代的图形处理工具。

  在漫长的等待后,我们终于等来了GDI+。GDI+是GDI的新版本,它在GDI的基础上添加了许多新特性,为开发人员提供了处理二维矢量图形、文本、图像以及图形数据矩阵的一系列API接口。

   本文从实际应用出发,着重讨论了GDI+和CImage类的一般使用方法以及在图像处理等方面的使用方法。

GDI+接口是Microsoft Whistler操作系统中的一部分,它是GDI的一个新版本,不仅在GDI基础上添加许多新特性而且对原有的GDI功能进行优化。在为开发人员提供的二维矢量图形、文本、图像处理、区域、路径以及图形数据矩阵等方面构造了一系列相关的类,如Bitmap(位图类)、Brush(画刷类)、Color(颜色类)、Font(字体类)、Graphics(图形类)、Image(图像类)、Pen(画笔类)和Region(区域类)等。其中,图形类Graphics是GDI+接口中的一个核心类,许多绘图操作都可用它来完成。

  我们首先介绍一下GDI+的新特性以及其编程方式的改变,然后介绍用VisualC++.NET在基于对话框和单文档/多文档等应用程序中使用GDI+的一般方法。

  GDI+新特性

  GDI+与GDI相比,增加了下列新的特性:

  1、渐变画刷

  以往GDI实现颜色渐变区域的方法是通过使用不同颜色的线条来填充一个裁剪区域而达到的。现在GDI+拓展了GDI功能,提供线型渐变和路径渐变画刷来填充一个图形、路径和区域,甚至也可用来绘制直线、曲线等。这里的路径可以视为由各种绘图函数产生的轨迹。

  2、样条曲线

  对于曲线而言,最具实际意义的莫过于样条曲线。样条曲线是在生产实践的基础上产生和发展起来的。模线间的设计人员在绘制模线时,先按给定的数据将型值点准确地"点"到图板上。然后,采用一种称为"样条"的工具(一根富有弹性的有机玻璃条或木条),用压铁强迫它通过这些型值点,再适当调整这些压铁,让样条的形态发生变化,直至取得合适的形状,才沿着样条画出所需的曲线。如果我们把样条看成弹性细梁,那么压铁就可看成作用在这梁上的某些点上的集中力。GDI+的Graphics:: DrawCurve函数中就有一个这样的参数用来调整集中力的大小。除了样条曲线外,GDI+还支持原来GDI中的Bezier曲线。

  3、持久的路径对象

  我们知道,在GDI中,路径是隶属于一个设备环境(上下文),也就是说一旦设备环境指针超过它的有效期,路径也会被删除。而GDI+是使用Graphics对象来进行绘图操作,并将路径操作从Graphics对象分离出来,提供一个GraphicsPath类供用户使用。这就是说,我们不必担心路径对象会受到Graphics对象操作的影响,从而可以使用同一个路径对象进行多次的路径绘制操作。

  4、矩阵和矩阵变换

  在图形处理过程中常需要对其几何信息进行变换以便产生复杂的新图形,矩阵是这种图形几何变换最常用的方法。为了满足人们对图形变换的需求,GDI+提供了功能强大的Matrix类来实现矩阵的旋转、错切、平移、比例等变换操作,并且GDI+还支持Graphics图形和区域(Region)的矩阵变换。

  5、Alpha混色

  在图像处理中,Alpha用来衡量一个像素或图像的透明度。在非压缩的32位RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(R、G和B)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。

  Alpha混色是将源像素和背景像素的颜色进行混合,最终显示的颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示:
显示颜色 = 源像素颜色 X alpha /255 + 背景颜色 X (255 -alpha) / 255

  GDI+的Color类定义了ARGB颜色数据类型,从而可以通过调整Alpha值来改变线条、图像等与背景色混合后的实际效果。

  除了上述新特性外,GDI+还将支持重新着色、色彩修正、消除走样、元数据以及Graphics容器等特性。

Visual C++.NET GDI+编程基础

[文章导读]

GDI+提供从简单到复杂图形绘制的大量方法,可以通过对路径和区域的操作构造出复杂的图形

GDI+提供从简单到复杂图形绘制的大量方法,并且我们可以通过对路径和区域的操作构造出更复杂的图形,这在CAD等场合极为有用。当然,在绘图之前我们有必要搞清一些基本内容,如坐标空间、画笔和画刷等。

  坐标空间及其变换

  在视图和窗口中绘图或定位总是在一个二维坐标系进行,依据作用方法的不同,坐标有多种表示方法,并且各种不同坐标之间可以相互转换。

  1. 世界坐标系、设备坐标系和页面坐标系

  GDI+为我们提供了三种坐标空间:世界坐标系、页面坐标系和设备坐标系。

  "世界坐标系"是应用程序用来进行图形输入输出所使用的一种与设备无关的笛卡尔坐标系。通常,我们可以根据自己的需要和方便定义一个自己的世界坐标系,这个坐标系称为用户坐标系。例如,前面"DrawLine(&newPen,20, 10, 200, 100);"中的坐标都是以这个用户坐标系为基准的,默认时使用像素为单位。

  "设备坐标系"是指显示设备或打印设备坐标系下的坐标,它的特点是以设备上的象素点为单位。对于窗口中的视图而言,设备坐标的原点在客户区的左上角,x坐标从左向右递增,y坐标自上而下递增。由于设备的分辨率不同,相同坐标值的物理位置可能不同。如对于边长为100的正方形,当显示器为640 x 480和800 x 600时的大小是不一样的。

  "页面坐标系"是指某种映射模式下的一种坐标系。所谓映射是指将世界坐标系通过某种方式进行的变换。默认时,设备坐标和页面坐标是一致的。

  2. 坐标映射和坐标原点的设置

  为了能保证打印或显示的结果不受设备的影响,GDI+定义了一些映射方法和属性来决定设备坐标和页面坐标之间的关系。这些映射方法和属性有:

  SetPageUnit和GetPageUnit

  这两个属性函数是用来设置和获取每个单位所对应的实际度量单位。它通常可以有下列的值:

UnitDisplay -- 每个页面单位为1/75英寸;
UnitPixel -- 每个页面单位为1个像素,此时页面坐标与设备坐标相同;
UnitPoint -- 每个页面单位为1/72英寸;
UnitInch -- 每个页面单位为1英寸;
UnitDocument -- 每个页面单位为1/300英寸;
UnitMillimeter-- 每个页面单位为1毫米。

  例如,或将Ex_GDIPlusDlg示例中的绘图代码修改成:

CPaintDC dc(this);
using namespace Gdiplus;
Graphics graphics( dc.m_hDC );
graphics.SetPageUnit(UnitMillimeter);
Pen newPen( Color( 255, 0, 0 ), 3 );
HatchBrush newBrush( HatchStyleCross,
Color(255, 0, 255, 0),
Color(255, 0, 0, 255));
graphics.DrawRectangle( &newPen, 50, 50, 100, 60);
graphics.FillRectangle( &newBrush, 50, 50, 100, 60);


  则笔画宽度为3,以及矩形的左上角顶点坐标和大小单位都为毫米,其结果如图所示。



  SetPageScale和GetPageScale

 GDI+的这两个属性函数分别用来设置和获取页面的缩放比例。例如,当上面的绘图代码变成:

...
graphics.SetPageUnit(UnitMillimeter);
graphics.SetPageScale( (REAL)0.1);
Pen newPen( Color( 255, 0, 0 ), 3 );
...


  代码中,REAL是一个浮点类型的定义。上述代码的结果如图2所示。


图2

  TranslateTransform

  GDI+的TranslateTransform方法用来改变坐标的原点位置,例如TranslateTransform(100,50)是将坐标原点移到点(100,50)。

字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸等多方面的属性。适当地选用不同的字体,可以大大地丰富文字的外在表现力。例如,把文字中某些重要的字句用较粗的字体显示,能够体现出突出、强调的意图。当然,文本输出时还可使用其格式化属性和显示质量来优化文本显示的效果。

  字体属性和字体创建

  字体的属性有很多,这里主要介绍字样、风格和尺寸三个主要属性。

  字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。GDI+是通过FontFamily类来定义字样的,例如下面的代码:

FontFamily fontFamily(L"幼圆"); // 定义"幼圆"字样


  字体风格主要表现为字体的粗细和是否倾斜等特点。GDI+为用户提供了一些预定义的字体风格:FontStyleRegular(正常)、FontStyleBold(加粗)、FontStyleItalic(斜体)、FontStyleBoldItalic(粗斜体)、FontStyleUnderline(下划线)和FontStyleStrikeout(删除线)。

  字体尺寸是用来指定字符所占区域的大小,通常用字符高度来描述。字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为点的单位,一点约折合为1/72英寸。对于汉字,还常用号数来表示字体尺寸,初号字最大,以下依次为小初、一号、小一、二号、小二??,如此类推,字体尺寸起来越小。GDI+为用户提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(点)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字体尺寸单位。

  使用GDI+中的Font类,可以直接通过构造函数创建一个字体对象,例如下列代码:

Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);


  构造函数的第一个参数是用来指定FontFamily类对象指针,第二参数是用来指定字体的尺寸,它的实际大小取决于第四个参数所指定的尺寸单位。第三个参数用来指定字体风格。

  为了与原来的GDI字体相兼容,Font的构造函数还有另外一种型式:

Font( HDC hdc, const LOGFONTW* logfont)


  其中,hdc是用来指定一个窗口的设备环境句柄,logfon是指向LOGFONT(逻辑字体)数据结构的指针。

基于VC.NET的GDI+图像处理

[文章导读]

本问介绍了GDI+支持的大多数图像文件格式,以及GDI+提供的处理图像的文件的两个类:Image和Bitmap

我们知道,在以往的图像处理中,常常要根据不同图像文件的格式及其数据存储结构在不同格式中进行转换。某个图像文件的显示也是依靠对文件数据结构的剖析,然后读取相关图像数据而实现的。现在,GDI+提供了Image和Bitmap类使我们能轻松容易地处理图像。

  概述

  GDI+支持大多数流行的图像文件格式,如BMP、GIF、JPEG、TIFF和PNG等。下面先来介绍这些图像文件,然后再说明Image和Bitmap类支持的特性。

  1.图像文件格式简介

  图像文件是描绘一幅图像的计算机磁盘文件,其文件格式不下数十种。这里仅介绍BMP、GIF、JPEG、TIFF和PNG等图像文件格式。

   BMP文件格式

  BMP图像文件格式是Microsoft为其Windows环境设置的标准图像格式。一个Windows的BMP位图实际上是一些和显示像素相对应的位阵列,它有两种类型:一种称之为GDI位图,另一种是DIB位图(Device-IndependentBitmap)。GDI位图包含了一种和Windows的GDI模块有关的Windows数据结构,该数据结构是与设备有关的,故此位图又称为DDB位图(Device-DependentBitmap)。当用户的程序取得位图数据信息时,其位图显示方式视显示卡而定。由于GDI位图的这种设备依赖性,当位图通过网络传送到另一台PC,很可能就会出现问题。

  DIB比GDI位图有很多编程优势,例如它自带颜色信息,从而使调色板管理更加容易。且任何运行Windows的机器都可以处理DIB,并通常以后缀为.BMP的文件形式被保存在磁盘中或作为资源存在于程序的EXE或DLL文件中。

   GIF文件格式

  图形交换格式(GIF--GraphicsInterchange Format)最早由CompuServe公司于1987年6月15日制定的标准,主要用于CompuServe网络图形数据的在线传输、存储。GIF提供了足够的信息并很好地组织了这些信息,使得许多不同的输入输出设备能够方便地交换图像,它支持24位彩色,由一个最多256种颜色的调色板实现,图像的大小最多是64K x 64K个像点。GIF的特点是LZW压缩、多图像和交错屏幕绘图。

   JPEG文件格式

  国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合成立的"联合照片专家组"JPEG(JointPhotographic Experts Group)经过五年艰苦细致工作后,于1991年3月提出了ISO CD10918号建议草案:"多灰度静止图像的数字压缩编码"(通常简称为JPEG标准)。这是一个适用于彩色和单色多灰度或连续色调静止数字图像的压缩标准。它包括无损压缩和基于离散余弦变换和Huffman编码的有损压缩两个部分。前者不会产生失真,但压缩比很小;后一种算法进行图像压缩时,信息虽有损失但压缩比可以很大。例如压缩20~40倍时,人眼基本上看不出失真。

  JPEG图像文件也是一种像素格式的文件格式,但它比BMP等图像文件要复杂许多。所幸的是,GDI+的Image提供了对JPEG文件格式的支持,使得我们不需要对JPEG格式有太多的了解就能处理该格式的图像。

   TIFF文件格式

  TIFF(TaggedImage Format File,标志图像文件格式)最早由Aldus公司于1986年推出的,它能对从单色到24位真彩的任何图像都有很好的支持,而且在不同的平台之间的修改和转换是十分容易的。与其它图像文件格式不同的是,TIFF文件中有一个标记信息区用来定义文件存储的图像数据类型、颜色和压缩方法。

   PNG文件格式

  PNG(PortableNetwork Graphic,可移植的网络图像)文件格式是由Thomas Boutell、Tom Lane等人提出并设计的,它是为了适应网络数据传输而设计的一种图像文件格式,用于取代格式较为简单、专利限制严格的GIF图像文件格式。而且,这种图像文件格式在某种程度上甚至还可以取代格式比较复杂的TIFF图像文件格式。它的特点主要有:压缩效率通常比GIF要高、提供Alpha通道控制图像的透明度、支持Gamma校正机制用来调整图像的亮度等。

  需要说明的是,PNG文件格式支持三种主要的图像类型:真彩色图像、灰度级图像以及颜色索引数据图像。JPEG只支持前两种图像类型,而GIF虽然可以利用灰度调色板补偿图像的灰度级别,但原则上它仅仅支持第三种图像类型。

  mage和Bitmap类概述

  GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增强WMF)图像文件的调入、格式转换以及简单处理的功能。而Bitmap是从Image类继承的一个图像类,它封装了Windows位图操作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分别用来对位图进行读写像素操作,从而可以为图像的柔化和锐化处理提供一种可能。

  3.DrawImage方法

  DrawImage是GDI+的Graphics类显示图像的核心方法,它的重载函数有许多个。常用的一般重载函数有:

Status DrawImage( Image* image, INT x, INT y);
Status DrawImage( Image* image, const Rect& rect);
Status DrawImage( Image* image, const Point* destPoints, INT count);
Status DrawImage( Image* image, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unit srcUnit);


  其中,(x,y)用来指定图像image显示的位置,这个位置和image图像的左上角点相对应。rect用来指定被图像填充的矩形区域,destPoints和count分别用来指定一个多边形的顶点和顶点个数。若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点坐标。srcx、srcy、srcwidth 和srcheight用来指定要显示的源图像的位置和大小,srcUnit用来指定所使用的单位,默认时使用PageUnitPixel,即用像素作为度量单位



分享到:
评论

相关推荐

    GDI+的说明 GDI+的说明 GDI+的说明 GDI+的说明

    GDI+的说明 GDI+的说明 GDI+的说明 GDI+的说明

    GDI+图像程序设计(PDF & 源码 -电子工业出版社)

    本书通过一些例子来说明如何开发真实世界的工具,如GDI+Painter、GDI+Editro、ImageViewer和ImageAnimator等。另外,作者还给出了大量使用C#语言编写的可重用示例代码,读者可从网上下载完整的C#和Visual Basic.NET...

    GDI+库以及使用方法

    下面分别就单文档和基于对话框应用程序为例,说明使用GDI+的一般过程和方法。 1. 在单文档应用程序中使用GDI+ 在上面的过程中,我们就是以一个单文档应用程序Ex_GDIPlus作为示例的。下面列出第4步所涉及的代码: ...

    GDI+开发包 GDI+安装详解

    下面分别就单文档和基于对话框应用程序为例,说明使用GDI+的一般过程和方法。 1. 在单文档应用程序中使用GDI+ 在上面的过程中,我们就是以一个单文档应用程序Ex_GDIPlus作为示例的。下面列出第4步所涉及的代码: ...

    GDI+使用详细说明中文PDF版

    这是从一本书中截取出来的,详细说明了GDI+的使用方法,包括GDI+类库的配置、相关概念、具体使用方法、使用列子等,是学习GDI+非常好的文档。配合我上传的另外一个《GDI+ SDK参考(翻译版本)》就可以解决学习和使用...

    GDI+ SDK参考(翻译版本)_gdi+_源码

    GDI+SDK开发手册 翻译版本,GDI+详细开发说明

    GDI+说明文档

    GDI+的中文说明文档,对认识GDI+很有帮助~~

    VC6使用GDI+

    VC6使用GDI+,其中包含GDI源码、VC例子和使用说明

    GDI+的使用说明

    关于GDI+如何使用的文档,包括dll与lib文档都在里面包含

    GDI+ SDK参考(翻译版本)

    GDI+用法参考,各种函数的参数说明。 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于...

    GDI+绘图.dll

    GDI+绘图.dll

    GDI+ SDK参考中文PDF版

    这个是GDI+ SDK的中文PDF版,比WORD版看起来舒服多了。建议下载个Foxit Reader来查看。是学习GDI+的好东西,配合我上传的另外一个资源《第六章 GDI+使用说明》就可以掌握GDI+了。

    精通GDI+编程

    此外,GDI+的矩阵运算、图像的编码与解码、图像色彩信息校正等深层次知识,也都能够在本书中找到详细的说明。为了让读者更快地掌握GDI+编程,在每一章的内容中,都配有详尽的程序源代码,以强化具体的理论阐述。本书...

    Gdi+和Jpgdll 处理Jpeg图像

    Gdi+和Jpgdll 处理Jpeg图像 内含说明文档 Gdi+压缩包含有.h文件、.lib文件和.dll文件

    GDI+开发资料

    GDI+开发资料 类库及说明文档

    GDI+入门教程.....

    文档包含简单的程序代码和一个调用类demo和GDI+二维绘制说明

    GDI+ 详细编程指南

    GDI+编程详细说明文档,pdf格式。。。。

Global site tag (gtag.js) - Google Analytics