介绍两个 2D 图形库

  最近的项目需要找到一款跨平台的 2D 图形库,最好能在使用接口上兼容 MicroSoft 的 GDI+,经过一番搜寻跟对比,总结了一些这方面的信息放在这里做个笔记。

  首先介绍一下 Cairo 库,没听说过没关系,FireFox 总听说过吧?!FireFox 的 render 引擎用的就是这个库。Cairo 是一个跨平台的 2D 图形库,支持很多 GDI+ 的高级特性,比如 Anti-alias,矩阵变换等等,但是据说 Cairo 的效率不是很好,跟其它库有一定的差距。

  用 Cairo 最爽的地方在于有个跟它相配合的 libGDIPlus 库,这个库对 Cairo 进行了封装,对外提供了一个 GDI+ Flat API 兼容的使用接口,这样就为把 Windows 平台下的 GDI+ 代码移植到 Unix 或者 Mac 平台下提供了一条捷径。

  下面要介绍的是 AGG(Anti-Grain Geometry),这个库貌似效率很好,可以去它的 Demo 展示页面去看看,里面的小例子都非常的酷!

  AGG 也有一个类似于 libGDIPlus 那样的封装,叫做 AggPlus。但是美中不足的是 AggPlus 对 GDI+ 接口的封装充其量只实现了 20%,基本上没有实用价值,但是拿来跟 GDI+ 做性能比较测试还是比较方便的。其实在 AggPlus 的下载包里面就有这么个性能测试程序,在某些基本图形的 render 测试中 AGG 居然比 GDI+ 快 10 倍以上!

  Cairo 跟 AGG 都是非常不错的 2D 图形库,虽然我始终没办法在 Cairo 跟 AGG 之间做性能测试,但是貌似 AGG 比 Cairo 的性能要好;在特性方面,他俩似乎不分伯仲,GDI+ 1.0 里有的 feature 几乎都能在这两个库里找到对应物;在 interface 方面,Cairo + libGDIPlus 是一对黄金搭档,只要你熟悉 GDI+ 的 Flat interface,很快就能把 Cairo 加到自己的项目里面;AGG 的 interface 比较另类,完全基于 C++ Template 写就,基本上属于看了文档还感觉很晕的那种,有人说要想把 AGG 用起来,要有比较好的图形学知识,深以为然!

  从跨平台和编译上比,AGG 全面胜出,在 Windows/Unix/Mac 三个平台下都轻松通过,Cairo 就稍差一点点,在 Windows 平台下需要经过一定的修改(当然首先要熟悉一下才能修改)。在 Windows 下编译 libGDIPlus 貌似就是不可能完成的任务,至少我花了一些时间后放弃了这个念头。

  在跟同事解释 Cairo + libGDIPlus 和 AGG 的最显著区别时我打了个比方,前者就像是一辆整装待命的国产车,后者就像是一堆精致的进口汽车配件。把前者用起来比较容易,但是可能性能一般;把后者用起来需要花很多时间,还要有专业知识,但是一旦跑起来那就很爽!

23 Responses to “介绍两个 2D 图形库”

  1. raenoll Says:

    好深奥。不懂的说。。

  2. 2ndboy Says:

    呵呵,术业有专攻嘛,其实只是一篇浅显的介绍性 post 而已。

  3. kiki Says:

    哥们,偶最近在对agg进行封装,主要就是做成gdi+的接口。目前基本2维图形绘制已经完成。下面还有image,文字等需要完成。有兴趣的话一起讨论:)
    redcoder@163.com

  4. 2ndboy Says:

    呵呵,当然有兴趣啊,但是我对 AGG 的了解有限,跟你学习一下也不错啊:) 已经给你 mail 了。

  5. delphidoc Says:

    agg好象不支持中文

  6. delphidoc Says:

    不过感觉agg真的很强,就是用起来太麻烦了,需要花一定的时间才能掌握!

  7. 2ndboy Says:

    我们的程序里对文字部分有其它的特殊处理,所以还真没发现这个问题。是的,看看 demo 就觉得很强!不过现在在 Windows 下用 GDI+ 了,没对 AGG 深入研究,这是个有时间就值得下功夫研究的东西!

  8. 安义佬的大白话 » Blog Archive » WinCapture 9.0 的开发手记 - 0002 Says:

    […] 在WinCapture 9.0中,图形编辑器将重写。为了跨平台,我考虑使用2个跨平台 2D 图形库中的一个:Cairo 或 AGG(Anti-Grain Geometry)。在读到介绍两个 2D 图形库 的内容后,我得到最后的方案: […]

  9. jiangjq Says:

    我以前用Aggplus做了个矢量图形项目,自己也进行了一些扩充,但感觉有点慢,屏幕刷新如果结合OPENGL可能就好多了.Cairo的性能似乎要差一些.

  10. 2ndboy Says:

    是吗,一直都认为 AGG 的效率应该是不错的,但我还是比较相信实际的应用感受的,谢谢你的信息! Cairo 的性能似乎已经是公认的不行啦:)

  11. aggdip Says:

    单从图形光栅化速度来说,agg的速度要优于gdip。
    但是其他方面就难说了,这里有一个具体的比较:
    http://hi.baidu.com/aggcn/blog/item/635b053a7cab15ef15cecb81.html

  12. delphidoc Says:

    to jiangjq:
    我测过测试,AggPlus确实要比Agg慢了许多,至少有三倍吧,因为Pascal里没有模板的概念,所以作者用其它的方式来实现的。。

  13. delphidoc Says:

    Google的Skia出来了,看来又多了一个选择
    http://code.google.com/p/openskia/

  14. 2ndboy Says:

    谢谢 delphidoc 的信息,我去看看这个 Skia :)

  15. cloudage Says:

    发现Libgdiplus仿佛是MONO的一部分,也就是说要用它的话,客户机上必须装一套MONO?(因为Libgdiplus没有单独提供下载)

  16. 2ndboy Says:

    不用的,可以单独下载

  17. cloudage Says:

    是我表述错误了,我其实是想说“没有单独提供binary下载”。它的源码的确可以获取到,但我发现靠我自己完全不知道该怎么编译,我只会visual studio……
    请问,你知道该如何编译么?在win32环境下

  18. 2ndboy Says:

    呵呵,注意我上面倒数第二段的最后一句话“在 Windows 下编译 libGDIPlus 貌似就是不可能完成的任务,至少我花了一些时间后放弃了这个念头”。

    我当初也没有成功,因为只是想简单评测一下,所以后来就放弃了。

  19. cloudage Says:

    那算了,我也放弃了。
    另外,这段时间我还在sourceforage上找到一个东西,名为aggoo,貌似是用agg实现的一套gdi+。遗憾的是,这个项目还是一人团,更新频度似乎是每年一次,最近一次更新好像是今年8月。它其它部分的实现我不知道怎么样,反正它的Font和文本渲染没有实现,不过却额外实现了一套载入swf的机制……

  20. 2ndboy Says:

    今天终于把 AggOO 下载完了,用了 n 天,看样子实现的 feature 比 AggPlus 要多,但是作者自己在 readme 里也说了,他只优先实现他自己用得上的部分,其它他很少用得上的部分不知哪天才能实现:D

  21. moor Says:

    看看这个怎么样?功能很强,使用很简单 http://picasso-graphic.googlecode.com/files/picasso_0.8_pre_alpha.zip

  22. 2ndboy Says:

    谢谢,改天研究下,看来还是这个 post 人气旺啊 :D

  23. moor Says:

    好像已经更新了
    http://code.google.com/p/picasso-graphic/

Leave a Reply