使用GDI+进行开发的一些问题(10)
来源:互联网 发布:淘宝客app制作教程 编辑:程序博客网 时间:2024/05/21 09:39
问题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+进行开发的一些问题(10)
- 使用GDI+进行开发的一些问题(1)
- 使用GDI+进行开发的一些问题(2)
- 使用GDI+进行开发的一些问题(3)
- 使用GDI+进行开发的一些问题(4)
- 使用GDI+进行开发的一些问题(5)
- 使用GDI+进行开发的一些问题(6)
- 使用GDI+进行开发的一些问题(7)
- 使用GDI+进行开发的一些问题(8)
- 使用GDI+进行开发的一些问题(9)
- 使用GDI+进行开发的一些问题(11)
- GDI+的一些问题
- 使用CocoaPods进行开发的一些问题及策略
- 初次使用java进行web开发的一些问题
- 使用GDI+进行图片处理时要注意的问题
- 使用GDI+进行图片处理时要注意的问题
- 使用GDI+进行图片处理时要注意的问题
- GDI+关于画图的一些问题
- 简单的正则表达式 Regex
- netfilter源码分析(4)-nf_hook_ops 钩子的注册
- 通常在C#中判断两个日期是否相等可使用DateTime的方法
- oracle 查询主表的主键被其他表作为外键参照的SQL
- 【Java常用类库】_比较器(Comparable、Comparator)笔记
- 使用GDI+进行开发的一些问题(10)
- Applet 远程调试
- netfilter源码分析(5)- ipt_do_table()函数,数据包的过滤
- IOS之手势锁屏
- rails尚未安装 的解决方法
- junit java 单元测试
- netfilter源码分析(6)-扩展的match
- Java客户端与C服务器端数据通信
- netfilter源码分析(7)- target 匹配