【转】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)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
随机推荐
- 像网页开发一样调试ios程序
PonyDebugger https://github.com/square/PonyDebugger
- 安卓listview滚动时背景变黑的解决方法
ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉, 原因是,滚动时,列表里面的view重绘时,用的依 ...
- C++ error: passing 'const std::map<>]' discards qualifiers或pass-by-reference-to-const-map导致的“discards qualifiers”
产生问题的场景: int func(const map<int, string> &aMap) { string value = amap[0]; } 或者 int Test:: ...
- sublime 技巧与快捷键篇
技巧大全:https://www.zhihu.com/question/24896283 项目排除文件夹,更便于ctrl + p的搜索,比如可恶的node_modules "folder ...
- SpringApplication初始化
SpringApplication: private void initialize(Object[] sources) { if (sources != null && source ...
- Jackson(使用注解)
jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties此注解是类注解,作用是json序列化时将Java bean ...
- [svc][cpu][jk]cpu的核心查看及什么是cpu的负载
监控的时候我们会监控cpu的负载,那么什么是负载? 编程时候有多核多线程的概念,那么cpu内部如何运作的? 搞清多少bit cpu? 有几个物理cpu?每个cpu是几核的? 之前购买内存条时候,需要关 ...
- lua -- 清理数组
function UIBagController:ClearGoods( ) ,#self.itemArr do print("=======ClearGoods======" . ...
- Replace 在动态sql中的实现
set @stsqlReplace=' update ChgCfm set cfmdate=replace(cfmdate,'''''''',''''), cfmstatu=replace(cfmst ...
- C++ pair(对组)用法
类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类型,T2是第二个值的数据类型. 功能:pair将一对值组合成一个值, ...