开始学习AGG
发现一个很“帅”的二维图形库----AGG(Anti-Grain Geometry),汗……其实这是“老”的库了。自己目前还没有深刻的把握,但非常喜欢 AGG 的风格,近期有时间的时候都在看它的源码和网上的一些资料,刚刚开学学还没什么自己的总结,先把我目前的一些信息放上来吧,免得五月份的博文交了白卷。
先把下面一段文字借过来,对 AGG 做一些简单的介绍吧(来自这里):
曾计划用AGG做文档编辑软件的图形内核,读过一段时间它的代码:设计精巧,结构清晰,颇有学术风格,对模板的理念和应用不亚于STL。
(我说:很多人说 AGG “师承” boost,对模板的使用如何如何,但初看过源码之后,觉得 AGG 的代码虽然的确用了很多模板类,但都是非常基本地中规中矩地使用模板,没有任何“技巧”性的代码,模板参数完全是为了作为 Policy 来使用,这点倒更像是师承 loki,正是因为如此,AGG 才有了非常强大和灵活的拆装组合能力,当然也使其更加强以驾驭)
AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,我至少在Windows、Wince、Linux三个台平上测试通过。
AGG 的特点:
- 支持ALPHA、GAMMA等变色处理,以及用户自定义的变色处理;
- 支持任意2D图形变换;
- 支持SVG和PostScript描述,适于网上图形生成;
- 支持高质量的图形处理,支持反走样插值等高级功能;
- 支持任意方式的惭变色处理;
- 支持所有颜色格式;
- 支持对位图的多种处理;
- 支持直线的多种处理,类似于GDI+;
- 支持GPC,即通用多边形裁剪方法;
- 支持多种字体输出,包括汉字的处理;
(关于 AGG 的效果,我这里只放一个例子,其它的请到官网上观看)
看看同时利用亚像素精度和反锯齿,获得更好的显示效果。
这三个螺旋形可以近似的看成是由短的直线段组成的。左边的那幅图采用的是正常的Integer Bresenham方法(使用Windows GDI的LineTo和MoveTo函数也可以得到类似的效果)。中间的图采用了改进后的精度为1/256像素的Integer Bresenham方法。而右边的图同样使用了1/256像素的精度,但是同时还使用了反锯齿。请注意,将线段中亚像素真实定位的能力非常重要。如果我们对正常像素坐标使用反锯齿,那么螺旋形看起来会更平滑,但仍然同左边的图一样难看。
(我说:像这样类似的“惊喜”在 AGG 里还有很多。)
AGG 的官方网在这里:http://www.antigrain.com/index.html
里面最有价值的当然是可以下载到的源码、各种 Examples,还有一些介绍性的文档。它的例子是很酷的,可以下到所有例子的 Exe 文件,直接就可以看到效果。重点推荐要看的是一篇 introduction,把 AGG 的功能以及技术方面的特点都提到了,可以初步体会它的高品质(亚像素描画、奇好的抗锯齿效果、各种颜色空间支持等等),博客园有一份相应的中文版(也就是上面“借用”的文字来源,嘿嘿),好像不是完全的翻译,但重点都已经提到了,翻译的质量很高,值得一看。另外值得一看的就是它的 reference manual 啦,把比较重点的几个库的功能介绍了一下,特别是对于 Span 这个 AGG 里非常重要的元素有相应的图文介绍,在其它地方很难找到。
中文资料里,C++ 编程网的一份教程写得非常捧,它的链接在这里,这篇教程分四个部分,(一)对 AGG 进行了大体的介绍,并讲了如何进行编译的使用,写得很详细,给了一个可以运行的例子,(二)则对于基本的描画类别进行了逐一地分析,(三)讲到了对于图像的处理,最后在 (四)里讲如何用 AGG 显示文字。作者毛毛应该是个强人,呵,在 C++ 编程网中还有一个他写的对于 CImg 的教程,也很好。唯一的“缺点”便是文章网页不是很清爽,广告和其它的链接太多。
虽然 AGG 从 07 年开始就没有更新了,而且听说还有没有解决的 bug ,但我对于这个库的设计非常喜欢,会好好地研究一下,后面我会把自己学习 AGG 的一些笔记和心得也放到博客上来,希望能和有兴趣的朋友进行交流。