C++矢量图形库系列(转)
转自: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)——矢量图形库乱谈
C++矢量图形库系列(转)的更多相关文章
- C++矢量图形库系列(1)——矢量图形库乱谈(转)
转自:http://blog.sina.com.cn/s/blog_4265e1760100lg03.html 本系列篇章的主要内容是讲解矢量图形库的编译.开发和使用.并不对他们周边的内容做过多的描述 ...
- 强大的矢量图形库:Raphael JS 中文帮助文档及教程
Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库.它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操作 DOM 来轻松创建出 ...
- Raphael:JS矢量图形库
Raphael:JS矢量图形库 2016-08-29 http://dmitrybaranovskiy.github.io/raphael/
- C++基于矢量图形库cairo画图图形
//sudo apt-get install libcairo2-dev //pkg-config --cflags --libs cairo //-I/usr/include/cairo -I/us ...
- Open系列相关概念汇总
最近接触了Android OpenGL ES 和 OpenCL ES,然后就很想知道除了这两个之外到底还有几个Open系列的API集.搜集的结果如下(纯为自己科普): 1. OpenGL(OpenGr ...
- gRaphael——JavaScript 矢量图表库:两行代码实现精美图表
gRaphael 是一个致力于帮助开发人员在网页中绘制各种精美图表的 Javascript 库,基于强大的 Raphael 矢量图形库.你只需要编写几行简单的代码就能创建出精美的条形图.饼图.点图和曲 ...
- [深入浅出iOS库]之图形库CorePlot
一,前言 Core Plot和s7Graph都是可在iOS平台下使用的开源矢量图形库,s7Graph功能相对比较简单一些,在此就不介绍了.Core Plot 功能强大很多,我们可以利用它很方便地画出复 ...
- cairo 图形库
简介 提到cairo,估计很少知道这还是一个图形库的名字(http://cairographics.org),Linux的两大流行桌面环境KDE和Gnome,其对应的基础组件是QT和GTK+,相对于框 ...
- ECharts教程
ECharts 特性 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等) 底层依赖轻量级的矢量图形库 ZRender 丰富的可视化类型 常规的折线图.柱状图 ...
随机推荐
- python基础(18):初识模块、re模块
1. 认识模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用python编写的代码(. ...
- Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王翔 清风Python PS:如有需要Python学习资料的小伙伴 ...
- Python中使用requests和parsel爬取喜马拉雅电台音频
场景 喜马拉雅电台: https://www.ximalaya.com/ 找到一步小说音频,这里以下面为例 https://www.ximalaya.com/youshengshu/16411402/ ...
- 4-1-JS数据类型及相关操作
js的数据类型 判断数据类型 用typeof typeof "John" // alert(typeof "John") 返 ...
- iOS 常用算法之设计一个算法,验证某字符是否为合法IPV4字符
浅析 : 一个IPV4字符由3个大于0小于255的数字 以及 3个点构成, 所有我们需要判断小数点数量是否满足条件, 以及小数点隔开的每部分是否满足条件即可. 思路: 1. 校验是否有3个小数点; 2 ...
- Linux中的硬链接和软链接的概念、区别及用法
概念: 硬链接(hard link): A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指 ...
- itest(爱测试) 3.5.0 发布,开源BUG 跟踪管理& 敏捷测试管理软件
v3.5.0 下载地址 :itest下载 itest 简介:查看简介 V3.5.0 增加了 9个功能增强,和17个BUG修复 ,详情如下所述. 9个功能增强 : (1)增加xmind(思维导图) 转E ...
- UML类图基础说明
UML类图主要由类和关系组成. 类: 什么具有相同特征的对象的抽象, 具体我也记不住, 反正有官方定义 关系: 指各个类之间的关系 类图 类就使用一个方框来表示, 把方框分成几层, 来表示不同的信息, ...
- 7. Vue - 组件
一.组件分类 1. 定义 组件是可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义元素.特点为:代码重用,提高开发效率,让网页结构更清晰. 2. 局部组件 只能在定义它的el中 ...
- Linux学习(四) 忘记密码解决方法
很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3 ...