C++矢量图形库系列(1)——矢量图形库乱谈(转)

转自:http://blog.sina.com.cn/s/blog_4265e1760100lg03.html

本系列篇章的主要内容是讲解矢量图形库的编译、开发和使用。并不对他们周边的内容做过多的描述,如性能对比等。本人博客所有文章全部都是个人原创,并保留一切权利。不是原创的内容本人一定会注明“转载”字样。所以如果您需要转载,请注明来源,谢谢。

矢量图形,这是一个非常熟悉但是又让人觉得陌生的东西。熟悉是因为听得太多了,Flash就大量应用了矢量图形技术,得以让一段完整的动画文件体积相比以逐帧图片流的媒体格式要小得多,并且画质无损,这也是在早期的互联网上快速传播开去让用户接受的基础(文件体积不能太大,否则谁也没有心思等着一点点的下载……)。陌生则是因为很多人搞了若干年的Win32软件开发,翻来覆去就是MFC/GDI/Socket……,似乎啥时也没有矢量图形技术的事情。

但是,不得不承认,Win32的GDI不论是在速度上还是在功能上,都已经是脱离时代了,所以GDI 满有信心的出来了。有些人可能搞不太清楚GDI和GDI 的关系,我也经常听到一些程序说用GDI 取代GDI。实际上的情况是:GDI 不过是一套C 的库,其底层仍旧与GDI有那么点千丝万缕的联系。如果说GDI能在不同的显示设备上依据驱动而获得加速的话,GDI 就只能是依据不同的CPU平台的运算速度而获得加速了——因为他是一套硬件无关的C 图形库,大量的图形算法是其核心的内容。

尽管GDI 出来已经有些年头了,但是似乎使用者却不多(至少我没有看见我身边的朋友什么的使用过)。我曾为这个问题做过一些调查,有人说他用过GDI ,但是感觉速度好像很慢,还不如自己写的代码。也有人说感觉用不上,又不天天做画图软件。还有人说GDI用习惯了,GDI 用着别扭也没发现啥优势…………的确,这些感觉我也曾经存在过,所以我也不是太喜欢用GDI ,速度也的确不是太快——至少我自己做的GDI 画图板,在我的电脑1920*1080分辨率下全屏双缓存连续填充图形的时候,性能的确是不高(已经尽可能的优化)。如果再用上ColorMatrix的话,我那可怜的四核也跟过了时的机器一样,跑得实在困难。

所以,我需要给各位介绍一些新的大牛了,其实也不是什么新的东西,有些都是N久的名牌,稳定工作很多年,用于过很多的项目了。这些大牛们跟GDI 的功能上都极其类似(一般还是会要多一些东西的),功能类似的意思是GDI 有的,他们都可以实现,他们有的,GDI 也都可以搞出来。但在性能上或者图像质量上却有着各不相同的表现了。比如大名鼎鼎的Cairo、AGG以及Google放出来的Skia(这三个从知名度上来讲基本可以算是三足鼎立了,呵呵),另外还有一些不太知名的(不知名不意味着他不强大),比如商业库DISLIN,还有PHP用的GD等,甚至还有一些联系并不紧密的CImg(这个准确来讲应当是属于图形处理库,而不是矢量图形库了,但是很多网站都喜欢把他们列举到一起,严格来说的话,不太好理解)。

不过本系列篇章的主要目的,是说适量图形库,所以多余的就不说了,我们从Cairo开始说起。

大名鼎鼎的Cairo,官网:http://www.cairographics.org,开源社区的精品项目之一,已经基本上成为了Linux下的图形标准。Firefox的底层绘图就是用的Cairo。关于Cairo更多的东西,Google一下吧,会比我说得更详细,呵呵。

AGG,官网:http://www.antigrain.com/,也是比较出名的矢量绘图库了,仅仅只是看官方站上的下载的Demo,都会有点酷酷的感觉:)。使用起来与Cairo最大区别就是AGG更像是一堆未紧密联系的class,属于弱藕合状态,并且大量的使用了C 模板技术,从使用者的角度来看,AGG的难度是不小的,因为他只是给你提供了一系列的功能块,怎么组合使用,还全在用户自己,而Cairo则提供了相对比较简单明了的C函数接口。因此也就出现了AggPlus项目,他的目的就是把AGG包装一次,并且是使用的仿GDI 类似接口。如果使用AggPlus的话,有GDI 相关经验的就容易使用了,不过貌似性能也就有了不小的下降。

关于Cairo和AGG的性能对比,Google一下就能找到详细的内容,但是简单的说一下,就绘图方面的速度来看,我的经验是Cairo的速度会比AGG快,尤其是Cairo已经出了1.9版,提速较大。AGG则完全依赖C ,没有硬件加速。他比较聪明的一个地方就是在光栅的时候使用了整数运算而不是浮点数运算。AGG在官网上宣称其生成的图像质量要比GDI 高,从我的实际使用经验来看也的确是这样的。这个Google也能找到实例,本处不再多说。

最后是Skia。其实Skia是原本应该是商业项目,让Google收购之后给开源了,官网:http://code.google.com/p/skia/,授权形式是Apache 2.0,这个授权形式比较的爽,呵呵。Skia的速度不在Cairo和AGG之下,而接口形式的复杂度相对Cairo稍微高一点,比AGG要容易。功能则基本上没有太大的差别。不过如果要说代码的清晰度的话,Skia也是这3个项目中最好的,我很快就能熟悉Skia的代码并对其做出我所需要的修改。所以目前我个人是比较喜欢Skia的。从Cairo转到AGG再转到Skia,现在就一直使用Skia了。

在这些矢量图形库里,有一些东西是大家一般都支持但是GDI 没有的,比如对于SVG或PostScript的支持,比如大家都可以跨平台但GDI 不可以等等。另外,Cairo还有一个很明显的优点是其它一些库所不具备的,就是Cairo支持数量众多的Backends,其实就是BackBuffer或者叫DrawTarget的东西,Cairo可以直接把要绘制的内容画到Win32 GDI Bitmap/DC、PDF、SVG、PostScript、OpenGL、Printer等众多的Target上,这是Cairo的一大特色,据说也是Firefox选择Cairo的一个重要理由。如果你的应用程序是需要将图形内容绘制到各种各样不同的Target的时候,选择Cairo的确可以省掉不少的事情。

好了,乱谈就到此为止吧。本篇是开篇,下一篇,我们将一起来尝试使用VC来编译Cairo(1.8.x版),这是一切使用的大前提嘛,毕竟用VC在Win32上做软件开发的还是多数的。但是编译Cairo就让不少人碰到了问题。所以我们先解决了编译的问题,包括再下一篇我计划讲解Skia在VC上的编译。编译出了Lib/DLL,使用起来才能自由嘛

C++矢量图形库系列(1)——矢量图形库乱谈(转)

时间: 2024-07-30 07:33:56

C++矢量图形库系列(1)——矢量图形库乱谈(转)的相关文章

[ES6系列-04]再也不乱“哇”了:用 let 与 const 替代 var

[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 今天的内容是,关于 JavaScript 中定义变量的变化(其实不确切,函数,常量表示被冷落). 首先,回顾下 var 定义存在的问题 1. 哇..var 好乱.. 1.1 可以重复定义 /* eg.0 * multi-definition of var-variable */ //----------------------------------

QString乱谈(2)

QString乱谈(2) 长期以来,很多人都清楚,一旦C++源码中直接使用了中文,这样的源码想要跨平台(I18N)会非常困难. 随着: Windows下:MSVC2010成为主流 Linux下:GCC升级到4.6 C++中的中文问题 才算有了一个比较优雅的.跨平台的Workaround. (本文讨论编译器范围:GCC4.6+, MSVC2010sp1+ .本文属于QString系列,但暂不涉及QString) C++ 中文问题 要在C++中正确使用中文,必须要了解下面两个概念: 源码字符集(th

微软ASP.NET技术“乱谈”

微软ASP.NET技术“乱谈” 2014新年了,顺手写的一点文字,主要谈谈我对当前微软ASP.NET技术的看法,比较随意,大伙儿随便看看吧. 1 当前微软Web平台技术全貌 从2002年发布.NET 1.0和Visual Studio.NET,到2013年.NET 4.5.1和Visual Studio 2013发布时,微软.NET平台己有11年的历史,其Web技术几经变迁,当前演化为以下的主要技术子领域: 一张图了解微软Web平台技术全貌 时至今日, ASP.NET底层的基础架构基本没太大变化

一周乱谈(第八周) - 中文分词

中文分词 NLP(Natural language processing)自然语言处理一直都是比较热门的领域,现在不管是搜索,推荐神马的基本都需要和nlp打交道,而中文的nlp处理的第一步就是分词了,所以中文分词一直扮演者举足轻重的角色.当然了,分词的算法也是层出不穷,从最初的字典匹配到后来的统计模型,从HMM到CRF,分词精度都在不断提高,下面我就简单介绍下基本的分词算法. 字典匹配 最简单的分词就是基于字典匹配,一个句子“乱谈中文分词”,如果字典中我有这三个词“乱谈”“中文”“分词”那么我自

乱谈Qt事件循环嵌套

本文旨在说明:QDialog::exec().QMenu::exec()等开启的局部事件循环,易用的背后,还有很多的陷阱... 引子 Qt 是事件驱动的,基本上,每一个Qt程序我们都会通过QCoreApplication或其派生类的exec()函数来开启事件循环(QEventLoop): int main(int argc, char**argv) { QApplication a(argc, argv); return a.exec(); } 但是在同一个线程内,我们可以开启多个事件循环,比如

IT人论房价 (七) 城市置业乱谈

我去过的地方不多,但是可以稍微吐槽下各个城市. 我在南京呆过2年,发现南京房价比较奇葩,人均3k的平均工资,6k属于高收入了,但是但是房价都他娘贵的一比,鼓楼这里还算正常毕竟市区吧2-3w,河西地区均价在4-6w,你说你开过奥运会房价就应该翻倍吗?租售比过1000的泡沫啊. 但是后来游玩了一圈发现,南京是三面环山一面是长江,超过这个区域的投资基本上没有,所以江苏省附近的资本包括安徽马鞍山这里的资本都一股脑儿投到了这个么一个省会,所以导致了土地稀缺房价畸形.过了长江自然有很多的地方可以圈地,但是南

小小换行符乱谈(文本文件vs二进制文件)

使用 C 语言的 fopen 打开文件时,可以指定的 mode 有 12 个,其中 6 个包含  "b" 使用 C++ 的 fstream 打开文件时,可用的模式组合有 24 个(?),其中 12 个包含  "binary" 使用 python 的 open 打开文件,除了可以使用 C 中的 12 个模式外,还可以使用  "U" 或 "rU" 使用 Qt 库的 QFile 打开文件时,可以指定  QIODevice::Text

杂言乱谈,以后的日志很辉煌?

?? 1)这个世界变化很快,扁平化,全球化,天天在变化,但人群之间的差异其实没变化: 2)有些人看起来蠢,有些人看起来聪明,这都不能认真,因为大家都在掩饰自自己得位置,都在装: 3)底层有疆界,贵族无国界,物以类聚,人以群分,很多问题不要激动,因为谁是朋友,谁是敌人,谁是自己人,这真的都是问题: 4)快人一步是先锋,快人两步只能把烈士封: 5)大大们爱国,你也爱国,问题是每个人爱的都是自己心中的国,很可能此国非彼国: 6)谁是带路党?你不是,我也不是,哪些拿反对当事业的更不是,那到底谁是?怀揣着

数据库CAP乱谈

今天有人问我cap,找了https://my.oschina.net/lilw/blog/169776这片文字, 下面是cap那篇文字的解释: 所谓CAP理论,即: Cosistency       数据的一致性 Availability      高可用性 Tolerance to newowrk Partitions    分区容忍性 一个数据存储系统不可能同时满足上述三个特性,只能同时满足其两个特性,也就是: CA,CP,AP.可以这么说,当前所有的数据存储解决方案,都可以归类的上述三种类