用于产生一致输出的矢量绘图库——cairo

来源:互联网 发布:网络借贷平台排行榜 编辑:程序博客网 时间:2024/06/05 21:12

写在文章前面:cairo 的目标是以跨平台的方式在打印机和屏幕上产生相同的输出,它正在成为 Linux® 图形领域的重要软件。GNOME、GTK+、Pango 等许多软件已经使用了它提供的 2D 功能。

本文参考自IBM技术主题

CAIRO的优点和用途:
cairo 是一个免费的矢量绘图软件库,它可以绘制多种输出格式。cairo 支持许多平台,包括 Linux、BSD、Microsoft® Windows® 和 OSX(BeOS 和 OS2 后端也正在开发)。Linux 绘图可以通过 X Window 系统、Quartz、图像缓冲格式或 OpenGL 上下文来实现。另外,cairo 还支持生成 PostScript 或 PDF 输出,从而产生高质量的打印结果。在理想情况下,cairo 的用户可以在打印机和屏幕上获得非常接近的输出效果。

本文将向您介绍 cairo,以及它对应用程序的意义。本文的示例将产生一个 pdf、ps、png、svg 和 gtk 窗口,显示的图形是 IBM 徽标。

cairo 的一项主要设计目标是提供尽可能接近的输出。这种一致的输出使 cairo 非常适合 GUI 工具集编程和跨平台应用程序开发。使用同一个绘图库打印高分辨率的屏幕和绘制屏幕内容,这种功能具有显著的优点。
另外,在支持的每种目标平台上,cairo 尝试智能化地使用底层硬件和软件支持。高质量矢量图形和高性能的结合使 cairo 成为优秀的 UNIX® 绘图系统。

cairo 是用 C 编写的,但是为大多数常用的语言提供了绑定。选用 C 语言有助于创建新的绑定,同时在进行 C 语言调用时可以提供高性能。应该特别注意 Python 绑定,它支持快速原型开发,而且降低了学习 cairo 绘图 API 的门槛。

计算机绘图系统和体系结构很早就出现了,cairo 的设计借鉴了 PostScript 和 PDF 模型的许多经验。cairo 之所以借鉴 PostScript 和 Portable Document Format(PDF)方法是因为,它们都使用数学语句定义图像。由于用几何方法表示图像,所以可以在任何时候在一定范围内计算几何描述,从而重新创建整个图像(或一部分图像)。图形的几何性质被表示为点、曲线和直线(这些元素构成了矢量)。
因为可以通过重新计算数学描述来重新绘制图像或其组成部分,所以在对图像进行放大、缩小或变换时不会出现分辨率损失。但是,矢量绘图也有一些限制。例如,如果对矢量图像进行极高比例的缩放,超出了大多数人实际需要的范围,就可能导致失真。在放大时,由于计算中要对误差进行舍入,所以某些直线可能看起来不正确。在缩小时,某些直线可能会无法看到或难以分辨。

cairo 采用矢量绘图还有一个优点:矢量图像往往比较小。这是因为用相当简单的数学表达式就可以表达大量信息。矢量绘图的优点是绘图过程相当简单。由绘图库负责将点、线以及相关表达式转换为用户可以看到的东西。

描述曲线的表达式称为 Bezier 曲线或路径,这个名称源自数学家 Pierre Bezier。Bezier 曲线由至少两个锚点(anchor point)组成,在锚点之间还有一个或多个点,这些点称为控制点(handle)。移动控制点就可以改变曲线的形状。如果您用过 Photoshop 或 GIMP 这样的工具,那么可能熟悉这种曲线。但是,在使用那些工具时,最终保存的图形格式可能是位图!文件的格式决定是否保留 Bezier 路径信息,还是在给定的范围内计算它并以位图格式保存计算结果。

到编写本文时,可用的 cairo 绑定包括 C++、Ruby、Perl、Java™ 语言和 .Net/mono 等等。这些绑定处于不同的开发状态,成熟度各不相同;可以通过 cairo 项目主页了解它们的最新情况(参考 官方网站 )。目前,Python 和 C++ 绑定似乎在开放源码社区中得到了广泛采用。

正如前面提到的,一些图形工具集也为 cairo 提供了绑定,这使 cairo 开发更加简便了。2.8 之后的 Gtk+ 版本包含对 cairo 的完整支持,而且以后的 GTK 版本一直选用 cairo 作为基本绘图系统。另外,GNUstep 和 FLTK 等工具集已经开始支持用 cairo 来满足图形呈现需求。

如果您打算进行任何跨平台开发,而且需要对绘图操作和组合进行低层控制,那么选用 cairo 作为绘图 API 是非常合适的。如果需要跨平台功能,但是不需要低层绘图控制,那么可以使用在 cairo 之上构建的一些绘图库。


为什么要学习一种新的绘图模型?

坦率地说,我认为目前的开放源码解决方案在几个方面存在欠缺。xprint 的优点是提供了统一的显示和打印 API,但是它通常作为单独的服务器进程运行,而且它的 API 很糟糕。libgnomeprint 提供单独的打印和显示模型,但是打印和绘图 API 的分离使屏幕和打印机的呈现效果产生差异。

cairo 从以前的绘图库借鉴了许多经验,而且从一开始就以实现统一 API 为设计目标。


cairo 呈现目标
cairo 可以呈现以下输出格式:

  • X Window System(如果可能的话,会利用 Render 扩展)
  • OpenGL(使用 glitz 后端)
  • In-Memory Images(pixbuffs 等等)
  • PostScript(适用于打印)
  • PDF(Portable Document Format)文件
  • SVG(Scalable Vector Graphics)格式

但是,并非所有呈现目标都产生相同的效果。尽管 cairo 力求在各种后端上产生相同的输出,但是每种后端各有优势。例如,PDF 后端会尽可能使用矢量计算(只在必要时生成图像),而 PostScript 后端实际上会为每个页面生成一个大图像。

cairo 中的呈现模型受到许多原有技术的影响。cairo 采用了 PostScript 中的路径、笔画(stroke)和填充(fill)概念,还实现了 PDF 和现代 X 服务器实现的呈现扩展中的 Porter-Duff 图像组合技术。另外,cairo 还实现了剪切、蒙板和渐变等补充特性。


cairo 的实际应用情况
许多有影响力的开放源码项目已经采用了 cairo,cairo 已经成为 Linux 图形领域的重要软件。已经采用 cairo 的重要项目包括:

  • Gtk+,一个广受喜爱的跨平台图形工具集
  • Pango,一个用于布置和呈现文本的免费软件库,它主要用于实现国际化
  • Gnome,一个免费的桌面环境
  • Mozilla,一个跨平台的 Web 浏览器基础结构,Firefox 就是在这个基础结构上构建的
  • OpenOffice.org,一个可以与 Microsoft Office 匹敌的免费办公套件

用 cairo 进行概念性绘图
在用 cairo 进行绘图时,最简单的操作就像手工绘画时一样:选择绘图介质,选择画笔,选择颜色,考虑线条的布局,然后进行实际绘制。cairo 文档通过与画家的作画过程进行类比来介绍 cairo 操作,下面的说明也采用这种方式。

对于画家来说,最容易的事儿通常是选择空白的绘图介质。在现实世界中,艺术家可以选择在纸上、画布上甚至墙上作画。在 cairo 中,也必须选择空白的绘图介质。在用 cairo 进行绘图时,需要设置一个 cairo 上下文,这是主对象。在这个上下文中,可以选择目标外表,比如 PostScript 文件、PDF 文档或屏幕图像。这样就可以选择我们要在什么东西上进行绘图。

现在考虑画家的下一项任务:选择画笔。画家往往花费相当长的时间来选择形状和大小合适的画笔。在 cairo 中,也有画笔形状的概念,这由笔画宽度来表达。不同的笔画宽度会产生不同粗细的线条。
接下来,cairo 用户需要以精确的坐标来表达绘图操作,这一点与现实世界中的绘画过程不同。艺术家只需将画笔放在纸上的大概位置,但是计算机必须知道进行绘图的 x 和 y 坐标。
设置了画笔和开始绘图的位置之后,就需要想像笔画的形状。简单的图形可能由直线组成,但是与现实的画家一样,也可以绘制曲线和弧线。

最后,必须定义笔画终止的位置。同样,这个位置也要用一对 (x,y) 坐标来指定。
另外,还可以给绘制的对象涂上颜色。按照 cairo 术语,这称为填充(fill)。对于上面描述的每种操作,cairo 中都有对应的简便的 API 实现。后面会介绍其中一些 API。

这些基本操作可以帮助您构建一些非常复杂的图形。甚至可以使用 cairo 执行画家无法轻松完成的工作,比如对现有的图形进行放大等转换,或者将图形移动到虚拟纸张上的其他地方。

GIMP 或 Photoshop 也允许执行其中的许多操作,但是 cairo 是不同的:cairo 是一种编程式绘图方式。GIMP 和 Photoshop “在幕后” 使用 cairo 这样的工具来实现绘图。在用这些工具进行绘图时,通过鼠标操作自动设置坐标点和工具类型(比如方框),并通过 GUI 环境选择画笔和笔画宽度。如IBM给出的示例代码所示(链接),cairo 需要显式的交互,比如 “使用笔画宽度 1 绘制一个弧线,半径为 10,中心在位置 z”。


正确的 cairo 术语

在讨论任何技术时,都要使用正确的术语。cairo API 的术语分为三类:核心绘图术语、外表术语和与字体相关的术语(更多细节见 参考资料)。

首先,cairo 有一个绘图上下文(drawing context),这相当于画家的画布。上下文是 cairo_t 类型的,要呈现图形,就必须有一个上下文。在绘图上下文上的常见操作是绘制 Bezier 图形、直线和曲线。表示一系列曲线和相关数据的 cairo 术语是路径(path)。可以绘制这些路径,并设置笔画宽度或填充。
使用一个非常简单的 API 将坐标转换为路径。这个 API 非常有意义,因为它使我们不必考虑线性代数或图形学课本中讨论的复杂的转换矩阵。可以对 cairo 绘图操作执行任何转换,包括对图形或部分图形进行剪切、缩放或旋转。通过指定点来绘制每条路径。cairo 按照将点连接起来的方法执行操作。在后面将提供一个示例。

接下来,讨论各种 cairo 外表类型。有几种 cairo 外表类型,它们分别对应一种输出目标。cairo 外表(surface)是执行绘图的位置。具体地说,有用于图像(内存缓冲区)的外表、用于 Open GL 的 glitz 外表、用于呈现文档的 PDF 和 PostScript 外表以及用于直接执行绘图的 XLib 和 Win32 外表。这些外表类型都派生自外表基类型 cairo_surface_t

在 cairo 中,模式(pattern)是一种可以读取的内容,它用作绘图操作的源或蒙板。cairo 中的模式可以是实体模式、基于外表的模式甚至逐变模式。

到目前为止,我们只谈到了笔画路径。但是,笔画路径一般只能产生不怎么有趣的线条图。实际上,简单的线条笔画只是 cairo 中的 5 种基本绘图操作之一。这 5 种操作是:

  • cairo_stroke
  • cairo_fill
  • cairo_show_text/cairo_show_glyphs
  • cairo_paint
  • cairo_mask

尽管简单的线条绘图很方便,但是它们的表达能力不够强,不足以表示字体这样的复杂图形。cairo 为字体提供了一个基类 cairo_font_face_t。cairo 支持可缩放字体,其中包含给定字体大小的缓存标准。另外,可以用各种字体选项控制如何显示给定的字体。在使用 cairo 时,在 UNIX 上常用的字体是 Freetype 字体,在 Windows 平台上使用 Win32 字体。


cairo 的发展过程
cairo 的版本号采用与 Linux 内核相似的规则 —— 也就是,奇数版本是实验性的开发版本,不适合在生产环境中使用。偶数版本是稳定版本:最初的 1.0 版本主要关注顺利地向用户提供 API 和产生高质量输出。1.2 API 完善了几个开发不太完整的后端,当前的 1.4 系列主要关注优化和添加新功能。

cairo 的开发人员提供了一些出色的示例代码片段,演示了 cairo API 的各种功能(参考官方示例)。所以不必等待 cairo 的下一个版本了,现在就下载并试用当前版本!

提供一些参考资料:

  • cairo官方网站
  • cairo参考手册
  • cairo官方示例
  • cairo 最新的语言和工具集绑定列表
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 环亚在线微交易亏了钱怎么办 钢管舞报了教练班觉得学不会怎么办 微信上聊天被外国人给骗了该怎么办 微信冒充朋友骗走我钱怎么办 凉皮调料水鸡精味精放多了怎么办 吃了地屈孕酮后月经不干不净怎么办 藕片用热水炒后变色了怎么办? 外汇延期收款忘了报告了怎么办 怀孕不小心吃了马生菜怎么办 高压锅的皮圈很容易坏是怎么办 华为应用市场账号密码忘记了怎么办 业主对我们提出批评意见时怎么办 向环保局投诉被公司发现了怎么办 在政务大厅上班被群众投诉怎么办 政府下发的文件通知不履行该怎么办 给私人老板开车不给工资怎么办 给个体老板开车不给工资怎么办 户口转走在人才市场的档案怎么办 外来媳妇转上海户口没有档案怎么办 公务员考试笔试差9分面试怎么办 想从事人事方面的工作没经验怎么办 教师资格考试后户籍转走认定怎么办 总经理离职了作为高管的我怎么办 企业换总经理想换供应商应该怎么办 换了晶振时间还快怎么办 职场两个人都想要你的情况下怎么办 造价起步工资太低又结婚了怎么办 3d保存时写入文件出错怎么办 无经验想在工地承包点小活怎么办 一级建造师挂靠后中标后怎么办 用360对系统修补漏洞很慢怎么办 如果美国和俄罗斯开战中国会怎么办 戴牙冠前临时补牙材料掉了怎么办 设备间在业主家里每次上锁怎么办 成都安全员证原件丢了并过期怎么办 记不施工员证书号了怎么办 优易学车学员版登录不了怎么办 先科移动dvd主板坏了怎么办 离职单位不出劳动解除书怎么办 离职后一级建造师注册证怎么办 京牌货车报废挂靠公司不给办怎么办