这个是我第一次发文。非常遗憾的是,图片发不了,所以看不到对比效果。如果要看可以去官网http://www.antigrain.com/
本篇文章来源:http://www.antigrain.com/doc/introduction/introduction.agdoc.html
在这里就能看到图的对比效果了。
外国人的表达习惯和中国有很大的不同,平时我们骂书翻译的差,现在我是真的体会到,有些东西,很难用中国人的表达习惯表达出来。
这一篇是总述部分的第一部分。讲的是AGG的优点,AGG是一个高质量的图形库。它是用标准C和C++写的,所以是跨平台的,甚至可以用在嵌入式系统中。
它的设计上比较松散,不象GDI+之类的有个通用对象,是由一个个有些独立的功能组成的。
它比以往的图形库,质量更高,效果更好,设计上更合理。而且最关键的是它是开源的,我们可以看到它的实现 ,所以我们能学到它不管是设计,还是算法上的东西。比如用到java中,j2me中,虽然它是用C/C++写的。
序言
总述与基本概念
简述 一项新的创举
Anti-Grain Geometry (AGG) 是一个完全用标准和跨平台的C++写的一个图形工具。它可以用在很多需要高质量图形处理的软件中。比如你渲染地图,AGG就是必要的。AGG只使用了C++和标准C运行时函数,象memcpy, sin, cos, sqrt, 等等。 基础算法甚至没有使用C++标准库(Standard Template Library). 所以 AGG c可以用在很多程序中,包括嵌入式系统。
另一方面, AGG 允许你替换库中的任何一个不适合要求的部分. 或者增加其他你需要的颜色空间。这一切都是因为使用了C++的模板(C++ template)机制。
|
AGG不是一个紧密的图形库,而且它甚至不是特别容易使用。我认为IAGG 是一个““创造其他工具的工具”. 也就是说没有“Graphics”或者类似的对象。相应的, AGG 由很多松散的独立或者要联合使用的算法组成。所有的算法都有定义的很好的结口和尽可能最小的显式或隐式的独立性.
|
小评
大部分图形库有一个象GDI+中的 “Graphics”一样的对象,这种对象一般有上百甚至上千个函数。 这种对象可以独立存在,象OpenGL. 几乎所有的图形工具库,包括Java2D, DisplayPDF, SVG, 都有这样一个类。这样操作简单,而且在很多例子中是相当合适的,但是这样却给使用带来了限制.在简单的应用中,这样是合理的。我从来没有见到过一个图形库可以完全合我的需求。而且,所有的图形库都有一个通病。很多功能没什么用,而一些简单的功能反而没有实现。图形引擎(或者图形库)被设计的体积庞大。如果你使用过SVG viewer, ,会发现它的实现很简单而运行良好. 一旦你试图使用一些更先进的东西,比如用不同的图形技术过滤交互,你会发现很多内存泄露甚至挂机。那不是因为不好的设计,而是因为开始就设想把设计搞的很复杂。设计本身成为一个NP复杂问题, 用人脑已经无法解决。
|
建议
AGG 的主要目的是打破这些陈旧的传统,同时向你展示稳定,浅显,灵活,自由之美。基本观念初看上去和传统的很不同,但是却非常接近STL,. 当然,也有些区别STL是一个 C++ 工具 而 AGG 是 C++ 图形库. 你经常在程序中直接使用方便的STL工具. 但是用同样的方法使用AGG不是个好主意。 好的方法是封装AGG 去解决特定的问题. 那这样和GDI+ 有什么区别呢? 首先,你有对这个封装的东西有绝对的控制权。AGGju为你提供了基本算法的集合和灵活的设计。你可以定义接口,转换管道,输出形式。你甚至可以“冒充”已存在的图形接口.比如,你可以使用AGG rasterizer显示图形到屏幕上然后调用Windows GDI打印, 也就是把他们合并在一个API中. 不相信? 看一下GDI+ 和 AGG质量上的差别吧:
|
最关键的是你的程序变得可以移植,如果你设计的足够轻巧. AGG 可以将各种输出组合到同一个API. 特别的, 你可以使用 AGG 产生基于B/S的程序中的服务端中的raster images。它可以是支持多个平台的!
|
抗锯尺(Anti-Aliasing)和亚像素精确(Subpixel Accuracy)
抗锯尺是一种很好的技术,在低分辨率的设置中,它常被用来提高图片质量。 抗锯尺是建立在人类视觉特性上的。看一下下面的图片,想一想,那说明了什么 .
|
这是一个用抗锯齿技术写的字. 香农法则中,最大像素频率高于受限制频率。
|
Now 现在看一下正常尽寸的有相同字的图片,你可以很容易的认出这个单词 “stereo”.图片是完全相同的,第一个是第二个的放大版。看有锯尺的图时,我们根据平时经验,重建失去的内容。抗锯尺不是让你更容易看,可以更好的在你脑中重建失去的细节。这个成果是重要的,比如我们可以画更多的地图的细节。
|
人类视觉特性,不仅在AGG中应用,这也是我们用亚像素精确作图的基础,特别是画线时。让我们看一下用简单Bresenham 线 和我们用亚像素精确技术的比较 .下图反应了重要区别
|
A Bresenham Line Rendered with Subpixel Accuracy
|
比较(2) 和 (3).其中的黑色细线是我们需要的.如果我们使用亚像素精确,尽管线的开始和结束各自是在同一像素中的,我们仍会得到两种不同的像素组成的线(如((2)和(3)),而且重要的是线之间有不同的切线。 如果我们使用传统的Bresenham画法, 如果不使用亚精确像素, 我们会看到这样的结果 。如果不使用亚精确像素, 在所有的情况中我们会看到 (1) 那样的结果。 当我们用小短线组成曲线的时候 这就更重要了。如果我们使用亚象素精确,我们会看到更好的效果,比较一下下面的不同吧。
|
上面的三个螺旋都是用非常短的线拼接起来的。左边的是我们用一般的Bresenham算法画的, when the coordinates are rounded off to pixels (如果你使用Winwows GDI 的MoveTo/LineTo你会得到相同的效果). 第二个是用了改进的Bresenham 算法,这个 算法使用 一个象素的1/256 . 最右边的是使用相同的1/256的精确度, 但是使用了抗锯尺(Anti-Aliasing). 注意,线的分段是很重要的。如果我们使用常规的象素坐标,即使我们使用抗锯尺技术,但是看上去,还是会象第一个一样难持。
|
抗锯尺技术在控制线的宽度上,有更重要的作用。只有使用抗锯尺算法才能达到好的效果。在另一方面, 如果我们把线宽设成一个象素,那抗锯尺就没有意义了。抗锯尺和亚象素精度总是协同工作的 。
|
【AGG文档翻译(一)】
现代显示器最多有120的打印分辨率(DPI), 但亚象素技术可以达到300 DPI. 下面的图片显示 了线从0.3象素然后以0.3象素增长的状态
|
小狮子比大狮子虽然细节上有些失真,但是总体上还是保持着一致的。
|
推荐阅读