`
cloudtech
  • 浏览: 4612195 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用GDI+进行开发的一些问题(10)

 
阅读更多

问题10. Graphics的几个属性。

今天我来讲讲Graphics在DrawImage里的几个的属性。


Graphics是GDI+里面的大拿,可以用来画线,画矩形,甚至可以用来画各种各样的材质。通过不同的Pen,Brush来实现。具体的使用方法是所有想用GDI+的同学的基础,我就不详细讲了,具体可以参考MSDN: http://msdn.microsoft.com/en-us/library/haxsc50a(VS.80).aspx 。我主要来讲2个大家不太注意的属性:

a.Graphics.CompositingMode

这是一个枚举属性,可以取的值有2种,一种是SourceOver, 另外一种是SourceCopy。这定义了Graphics如何将当前颜色和背景合成。如果是SourceCopy,那么颜色不和当前背景合成。如果是SourceOver,那么背景颜色会和当前的颜色混合,算法如下:


显示颜色 = 源颜色 × alpha / 255 + 背景颜色 × (255 - alpha) / 255


新颜色的透明分量是255,也就是不透明。我们来看看下面的代码:

privatevoid Draw(object sender, EventArgs e)
{
this.BackColor = Color.FromArgb(255, 255, 255);
Graphics g = this.CreateGraphics();
g.CompositingMode =System.Drawing.Drawing2D.CompositingMode.SourceOver;
g.FillRectangle(newSolidBrush(Color.FromArgb(127, 255, 0, 0)), newRectangle(0, 0, 200, 200));

g.CompositingMode =System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(newSolidBrush(Color.FromArgb(127, 255, 0, 0)), newRectangle(200, 0, 200, 200));

g.CompositingMode =System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(newSolidBrush(Color.FromArgb(
CompositeColor(255, 127, 255),
CompositeColor(0, 127, 255),
CompositeColor(0, 127, 255))
), newRectangle(0, 200, 200, 200));

g.Dispose();

}

第1个色块和第2个色块分别是混合和不混合的,如果我们用不混合的方式希望得到混合的效果,那么应该用第三个色块的写法。从下面的图像中我们可以很清楚地看到结果:

b.Graphics.CompositingQuality

合成质量,一共有5种

成员名称

说明

AssumeLinear

假定线性值。

Default

默认质量。

GammaCorrected

使用灰度校正。

HighQuality

高质量、低速度复合。

HighSpeed

高速度、低质量。

Invalid

无效质量。

这部分东西稍有点学问,MSDN里面没怎么讲清楚,有些实践派的同学用了其他的几个相关的属性来解释GDI+中的图像质量,例如http://www.cnblogs.com/adow/archive/2007/10/05/914573.html ,不过不得精髓。我来解释一下图像合成的一些理论基础。这里还需要和另外一个属性InterpolationMode加以区分。这个属性的具体使用我会在下一节讲到,而合成质量与插值不是一回事。


根据我们上一节的算法,图像的合成是浮点运算,计算量非常大。此外,由于图像存储最后是需要被量化的,所以在量化的过程中会不可避免地出现锯齿的情况,为了平滑锯齿,又需要大量的计算。还有一个问题,如果我们有很多层不同的透明图像,需要进行合成,那么每一层都需要进行合成运算。其实这种合成运算式可以被优化的。CompositingQuality这个属性就是GDI+用来解决这些问题的。MSDN里面只是简单地说质量越高速度越慢,具体的算法不得而知。


HighQuality使用平滑技术去除在合成中出现的锯齿,并合成当前的Gamma灰度信息,这种计算是最慢的,并且出来的颜色与非GammaCorrected是不一样的。
GammaCorrected 合成当前Gamma灰度信息,但是不进行计算优化。
HighSpeed优化计算速度,出来的质量稍微有点差,如果不是对质量要求很高时看不出来的。
AssumeLinear的质量比Default稍好,速度稍慢,这种算法是假定合成中插值的像素变化是线性的。
Default就是最基本的计算方法。
Invalid未知,我也不知道,要是有知道的朋友可以告诉我。
其中HighQuality/GammaCorrected效果一样,其余四种一样。可以参考下图。

分享到:
评论

相关推荐

    GDI+开发包 GDI+ SDK

    GDI+开发包,解压文件,并将其中的Includes和Lib中的文件复制到VS安装目录中VC98目录下的Includes和Lib文件夹中

    gdi+ 帮助文档

    对于初学者,还有一个问题就是,如果想要进行GDI+开发, 需要下载一个GDI+的开发包(SDK). 网上搜到的一般只包含一个DLL,没法用. 在我另外一个资源中提供了一个详细的SDK,包含了进行开发所需要的全部内容:头文件,库文件...

    GDI+开发包 GDI+安装详解

    Visual C++6.0使用GDI+的一般方法 1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 或者 将Visual...

    GDI+开发库

    GDI+开发库

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

     本书从介绍GDI+Windows图形程序设计的基本知识开始,其核心是对一些实际问题的指导,包括如何使用Windows Forms及如何优化GDI+的性能。本书通过一些例子来说明如何开发真实世界的工具,如GDI+Painter、GDI+Editro...

    GDI+库以及使用方法

    1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 4. 程序中添加GDI+的包含文件gdiplus.h以及附加的类库...

    GDI+开发包

    包含GDI+开发所必需的开发包,并且包括配置使用方法,

    VC下如何使用GDI+进行

    因为GDI+对GDI的很多性能进行了优化,同时还提供了其他的一些特性。 一个图形设备接口,例如GDI+, 允许应用程序开发人员在打印机或屏幕上显示信息,而不用去考虑显示设备的具体细节。应用程序开发人员调用GDI+ ...

    C#GDI+图形程序设计源码

    2.4 一些基本的GDI+ 对象 总结 第3章 Graphics类 3.1 Graphics类的属性 3.2 Graphics类的方法 3.3 GDI+ Painter应用程序 3.4 绘制饼图 总结 第4章 使用画笔和钢笔 4.1 理解和使用画笔 4.2 在GDI+ 中使用...

    使用vc和gdi+开发图形界面

    使用VC6和GDI+开发图形界面.首先在VC6加载GDI+动态库,然后根据自己的要求建立控件,在控件中使用GDI+绘图.使用GDI+比使用GDI思路更清晰,界面更美观.

    GDI+库文件

    顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,...

    GDI+ PDF.rar

    顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,...

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

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

    GDI+ 开发SDK

    GDI+的开发组件,包括了所有的头文件,动态链接库文件和lib文件

    GDI+开发资料

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

    GDI+油量表开发

    GDI+油量表开发

    VC中使用GDI+库,实现图片旋转

    基于VC++语言,VS平台开发,应用GDI+库,双缓冲,实现图片旋转,屏幕不闪烁。代码量不大,简单易学。

    GDI+程序设计_GDI+程序设计_

    一本为C#开发人员准备的图形图像处理技术的书籍

Global site tag (gtag.js) - Google Analytics