【转】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)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
随机推荐
- 复杂对象类型的WebService高级部分
从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件. (1)定义一个对象实现了serializable 接口package cn.com.chenlly.s ...
- Python endswith() 函数
函数:endswith() 作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型 相关函数:判断字符串开头 startswith() 一.函数说明语法:string.endswith(st ...
- win10 docker 安装部署
Docker 安装教程: https://blog.csdn.net/hunan961/article/details/79484098 安装docker前需要首先开启虚拟服务:重启电脑-->F ...
- Java 8 – Period and Duration examples
Few examples to show you how to use Java 8 Duration, Period and ChronoUnit objects to find out the d ...
- extjs4学习-01-准备工作
想学习这个,在这里做个笔记. 创建了svn管理,路径http://ip:端口/repos/doc_jnfwz/liuzhenming/extjs4/extjs4 eclipse 中安装插件,支持在js ...
- WPF 4 Ribbon 开发 之 快捷工具栏(Quick Access Toolbar)
转自 http://www.cnblogs.com/gnielee/archive/2010/05/10/wpf4-ribbon-quick-access-toolbar.html 在Office 2 ...
- Android API 指南
原文链接:http://android.eoe.cn/topic/android_sdk Android API 指南 - Android API Guides 应用的组成部分 - Applicati ...
- SQL Server 的动态语句(SQLServer 的String.format用法)(SQLServer的调用SQL占位符的使用)
直接上代码好了: --建表语句if exists(select 1 from [你的测试数据库名字].sys.tables where name='TDepartment') BEGIN print ...
- Atitti python2.7安装 numpy attilax总结
Atitti python2.7安装 numpy attilax总结 1.1. easy_install 安装模式,没有 easy_install ,先手动安装1 1.2. 安装setuptools ...
- 在/etc/my.cnf未配置 [clIent] 导到mysql找不到socket
[root@DB mysql-5.6.16]# ./bin/mysql ERROR 2002 (HY000): Can't connect to local MySQL server through ...