【转】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)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
随机推荐
- springmvc 自定义注解
1. 自定义一个注解 @Documented //文档生成时,该注解将被包含在javadoc中,可去掉 @Target(ElementType.METHOD)//目标是方法 @Retention(Re ...
- Android 上传文件,图片。以及服务器端接收相关。
前面一篇文章写了实现照相功能的一个例子,其实那个实现效果是个略缩图.要查看全图就要先指定照片的存放路径.以后我会修改那个文章.今天先说下图片,文件等上传的实现.接着拿照片说事,光照完了不行还得往服务器 ...
- jmeter响应信息unicode 编码转成中文
在jmeter 发送请求过程中,有时候后台返回的是unicode 代码,如: {"status":-1,"msg":"\u63d0\u4ea4\u65 ...
- Windows 平台下Myeclipse 10 中SVN 插件使用教程(TortoiseSVN)
1. TortoiseSVN 简介 版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许 ...
- laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到
laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...
- 微信小程序 开发过程中遇到的坑(一)
2124 1.我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 的时候在pages中写注释的时候回报错. 例如: { &quo ...
- shell - 常识
一.用户登陆进入系统后的系统环境变量: $HOME 使用者自己的目录 $PATH 执行命令时所搜寻的目录 $TZ 时区 $MAILCHECK 每隔多少秒检查是否有新的信件 $PS1 在命令列时的提示号 ...
- android sqlite3:数据库操作
1. 修改表名: alter table notification rename to notification_test 2. 修改数据库名称: 3. 复制一个表的数据到另外一个表中(表的字段一致) ...
- nginx configure fastdfs + SSL
./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ ...
- HTML5学习笔记(十八):闭包
高阶函数 JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,也可以返回一个函数,这种函数就称之为高阶函数. 函数作为参 ...