【转】Graphics 关于呈现质量与合成模式
GDI+相关的作图,每种语言都有其自身的封装类,但本质上是一样的,下面这篇文章写的非常好,对于C#的Graphics类也是使用的,所以转载了,原文在这里:
http://www.cnblogs.com/del/archive/2009/12/22/1630120.html
相关内容有:
IGPGraphics.SmoothingMode; { 绘图质量 }
IGPGraphics.InterpolationMode; { 插补模式 }
IGPGraphics.CompositingMode; { 前景色与背景色的合成混合模式 }
IGPGraphics.CompositingQuality; { 图像合成质量 }
IGPGraphics.PixelOffsetMode; { 像素的偏移模式 } { 文本的呈现质量要用 }
IGPGraphics.TextRenderingHint; { 文本呈现模式 }
IGPGraphics.TextContrast; { 文本灰度校正值(消除锯齿和 ClearType 文本的伽玛值校正) }
相关参数:
SmoothingMode { 对直线、曲线和已填充区域的边缘采用锯齿消除功能, 它不能控制路径渐变画笔 }
Invalid // 一个无效模式
Default // 不消除锯齿, 等效于 HighSpeed、None
HighSpeed // 不消除锯齿
HighQuality // 消除锯齿, 等效于 AntiAlias
None // 不消除锯齿
AntiAlias // 消除锯齿
InterpolationMode { 插补模式确定如何计算两个像素点之间的中间值 }
Invalid // 等效于 QualityMode 枚举的 Invalid 元素.
Default // 默认模式.
Low // 低质量插值法.
High // 高质量插值法.
Bilinear // 双线性插值法; 不进行预筛选; 将图像收缩为原始大小的 50% 以下时此模式不适用.
Bicubic // 双三次插值法; 不进行预筛选; 将图像收缩为原始大小的 25% 以下时此模式不适用.
NearestNeighbor // 最临近插值法.
HighQualityBilinear // 高质量的双线性插值法; 执行预筛选以确保高质量的收缩.
HighQualityBicubic // 高质量的双三次插值法; 执行预筛选以确保高质量的收缩; 可产生质量最高的转换图像.
CompositingMode { 颜色合成模式 }
SourceOver // 与背景色混合; 该混合由透明度确定
SourceCopy // 改写背景色
CompositingQuality { 图像合成时, 源像素与目标像素和合成方式 }
Invalid // 无效质量
Default // 默认质量
HighSpeed // 高速度、低质量
HighQuality // 高质量、低速度复合
GammaCorrected // 使用灰度校正
AssumeLinear // 假定线性值
PixelOffsetMode { 像素偏移模式 }
Invalid // 无效模式.
Default // 默认模式.
HighSpeed // 高速度、低质量呈现.
HighQuality // 高质量、低速度呈现.
None // 没有任何像素偏移.
Half // 像素在水平和垂直距离上均偏移 -0.5 个单位, 以进行高速锯齿消除.
SmoothingMode 测试:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject);
var Graphics: IGPGraphics; Pen: IGPPen; Rect: TGPRectF; i: Integer;
begin Graphics := TGPGraphics.Create(Handle); Pen := TGPPen.Create($FFB22222, 4); Rect.Initialize(ClientWidth * 3/8, ClientHeight * 3/8, ClientWidth / 4, ClientHeight / 4); for i := 0 to 4 do begin Graphics.SmoothingMode := TGPSmoothingMode(i); Graphics.DrawEllipse(Pen, Rect); Rect.Inflate(ClientWidth / 14, ClientHeight / 14); end;
end;
InterpolationMode 测试:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject);
var Graphics: IGPGraphics; Image: IGPImage; Rect: TGPRectF; i: Integer;
begin Graphics := TGPGraphics.Create(Handle); Image := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(10, 10, Image.Width * 0.5, Image.Height * 0.5); for i := 0 to 7 do begin Graphics.InterpolationMode := TGPInterpolationMode(i); Graphics.DrawImage(Image, Rect); Rect.Offset(Rect.Width + 10, 0); if Rect.X + Rect.Width > ClientWidth then begin Rect.X := 10; Rect.Offset(0, Rect.Height + 10); end; end;
end; procedure TForm1.FormResize(Sender: TObject);
begin Repaint;
end;
CompositingMode 测试:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject);
var Graphics: IGPGraphics; Brush: IGPLinearGradientBrush; Rect: TGPRect;
begin Graphics := TGPGraphics.Create(Handle); Rect.Initialize(20, 20, 200, 60); Brush := TGPLinearGradientBrush.Create(Rect, $FFA52A2A, $FFFFFF00, 0); Graphics.CompositingMode := CompositingModeSourceOver; //默认模式 Graphics.FillRectangle(Brush, Rect); Brush := TGPLinearGradientBrush.Create(Rect, $80A52A2A, $80FFFF00, 0); Graphics.CompositingMode := CompositingModeSourceOver; Rect.Offset(0, 20 + Rect.Height); Graphics.FillRectangle(Brush, Rect); Graphics.CompositingMode := CompositingModeSourceCopy; Rect.Offset(0, 20 + Rect.Height); Graphics.FillRectangle(Brush, Rect);
end;
CompositingQuality 测试:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject);
var Graphics: IGPGraphics; Image: IGPImage; Rect: TGPRectF; Brush: IGPSolidBrush; i: Integer;
begin Graphics := TGPGraphics.Create(Handle); Image := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(10, 10, Image.Width * 0.75, Image.Height * 0.75); Brush := TGPSolidBrush.Create($800000FF); for i := 0 to 4 do begin Graphics.CompositingQuality := TGPCompositingQuality(i); Graphics.DrawImage(Image, Rect); Graphics.FillRectangle(Brush, Rect); Rect.Offset(Rect.Width + 10, 0); if Rect.X + Rect.Width > ClientWidth then begin Rect.X := 10; Rect.Offset(0, Rect.Height + 10); end; end;
end; procedure TForm1.FormResize(Sender: TObject);
begin Repaint;
end;
PixelOffsetMode 测试:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject);
var Graphics: IGPGraphics; BrushBack: IGPHatchBrush; Brush: IGPSolidBrush; Rect: TGPRectF; i: Integer;
begin Graphics := TGPGraphics.Create(Handle); BrushBack := TGPHatchBrush.Create(HatchStyleCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(BrushBack, TGPRect.Create(ClientRect)); Rect.Initialize(0.34, 1, 5.1, 1.3); Brush := TGPSolidBrush.Create($80FF0000); Graphics.ScaleTransform(27.3, 17.3); for i := 0 to 4 do begin Graphics.PixelOffsetMode := TGPPixelOffsetMode(i); Graphics.FillRectangle(Brush, Rect); Rect.Offset(0, Rect.Height + 1); end;
end;
另外在补充一个万一老师的GDI+的学习文章列表地址,虽然是用Delphi写的,但是还是有参考意义:
http://www.cnblogs.com/del/category/113557.html
【转】Graphics 关于呈现质量与合成模式的更多相关文章
- JAVA设计模式之合成模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
- 合成模式(Composite)-结构型
原理 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 有时候又叫做部分-整体 ...
- 设计模式_Composite_合成模式
形象例子: Mary今天过生日.“我过生日,你要送我一件礼物.”“嗯,好吧,去 商店,你自己挑.”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买.”“喂,买了三件了呀,我只答应送一件礼物的哦 ...
- Java设计模式-合成模式
合成模式有时也叫组合模式,对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 "部分/ ...
- java设计模式---合成模式3
实例 下面以一个逻辑树为例子,以上面的原理图为蓝本,看看如何实现并如何使用这个树,这个结构很简单,但是如何去使用树,遍历树.为我所用还是有一定难度的. 这里主要用到树的递归遍历,如何递归.如何控制 ...
- java设计模式---合成模式2
合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 ...
- 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性. 树形结构介绍 为了便于理解, ...
- Java设计模式(六)合成模式 享元模式
(十一)合成模式 Composite 合成模式是一组对象的组合,这些对象能够是容器对象,也能够是单对象.组对象同意包括单对象,也能够包括其它组对象,要为组合对象和单对象定义共同的行为.合成模式的意义是 ...
- 《JAVA与模式》之合成模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
随机推荐
- (面试)Statement和PrepareStatement有什么区别
(1)Statement用于执行静态sql语句,在执行时,必须指定一个事先准备好的sql语句.PrepareStatement是预编译的sql语句对象,sql语句被预编译并保存在对象中.被封装的sql ...
- Keras 2.0版本运行
Keras 2.0版本运行demo出错: d:\program\python3\lib\site-packages\ipykernel_launcher.py:8: UserWarning: Upda ...
- hibernate显示完整的sql(转)
不完整的SQL Hibernate: /* insert com.test.bean.User */ insert into user (username, password, email, sex) ...
- js日期操作,某天的N天后,一个月后的日期
var date = new Date(); var tomorrow = date.setDate(new Date().getDate() + 10); //10天后的日期 console.log ...
- Create rolling monthly, weekly and daily Logstash indices
在刚刚开始接触ELK的时候我们习惯把每一个index都按照day来切割.但是我们会发现我们的shards 会很多. 其实我们一该把那些小的index按照一周或者一个月来rolling,来减少我们的sh ...
- MySQL 自定义函数CREATE FUNCTION实例
分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...
- nginx configure fastdfs + SSL
./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ ...
- Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx
Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...
- Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别
Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别 通常来说函数调用要用到的两条基本的指令:”CALL”指令和”RET”指令.”CALL”指令将当前的指令指针(这个指 ...
- ios获取文件的MD5值
一般我们在使用http或者socket上传或者下载文件的时候,经常会在完成之后经行一次MD5值得校验(尤其是在断点续传的时候用的更 多),校验MD5值是为了防止在传输的过程当中丢包或者数据包被篡改,在 ...