`
isiqi
  • 浏览: 16498160 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用 cairo 实现跨平台图形

阅读更多

用 cairo 实现跨平台图形

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

级别: 中级

cairo 的目标是以跨平台的方式在打印机和屏幕上产生相同的输出,它正在成为 Linux® 图形领域的重要软件。GNOME、GTK+、Pango 等许多软件已经使用了它提供的 2D 功能。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

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 是一个矢量绘图(vector drawing)库,因此绘图需要对图形进行几何描述,而不是描述位图中填充的像素。在采用位图绘图(bitmap drawing)时,按照预先决定的布局用预先决定的颜色填充一系列像素,而且图形的质量与位图的大小成正比。

在放大或修改位图图像时,位图绘图方法的效果就会变差。图像常常会变得模糊,就像是近距离观看背投电视或其他大屏幕电视时的效果。在某一距离上,图像可能看起来很清楚,但是靠近之后就会看到许多离散的点。因为数据无法定义预先定义的像素之间应该是什么,所以放大时会很明显地损失清晰度。

计算机绘图系统和体系结构很早就出现了,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 环境选择画笔和笔画宽度。如示例代码所示(见 下载),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 示例应用程序

我编写了一段绘制 IBM 徽标的 cairo 代码。可以从下面的 下载 一节下载这段代码。运行它应该会产生以下输出:


图 1. 用 cairo 生成的 IBM 徽标
用 cairo 生成的 IBM 徽标

请注意代码中的 cairo_stroke (cr) 行,这一行出现在绘制字母之后,但在添加注册标志之前。如果不设置笔画,cairo 就不绘制任何东西。忘记设置笔画是初学者经常犯的错误。





cairo 的发展过程

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

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

摘自:http://www.ibm.com/developerworks/cn/linux/l-cairo/index.html
分享到:
评论

相关推荐

    cairo参考手册 API

    Cairo是一个跨平台的2D图形库,广泛用于创建高质量的图形输出,如在GUI应用程序、PDF文档、SVG图像以及X11和Windows系统上绘制。 1. **Cairo简介** - Cairo旨在提供一个可移植的、高性能的2D渲染引擎,支持多种...

    vc2105编译cairo图形库说明以及vc工程文件

    在IT行业中,图形库是开发可视化应用不可或缺的部分,Cairo是一个跨平台的2D图形库,广泛用于创建高质量的图像输出。本篇文章将详细介绍如何在Visual Studio 2015 (vc2105)环境下编译Cairo图形库,并使用提供的项目...

    DirectFB和Cairo的嵌入式图形开发实践

    为了满足跨平台和多语言的需求,Cairo可以使用DirectFB作为后端来进行2D图形操作。 ##### 2.2 Cairo与DirectFB结合的优势 将Cairo与DirectFB结合使用可以充分利用DirectFB的硬件加速能力以及Cairo的强大渲染功能。...

    基于wayland的cairo

    Cairo则是一个跨平台的2D图形库,广泛用于绘制矢量图形、文本和位图。将Cairo与Wayland结合,可以实现高性能的图形渲染。 1. **Wayland基础** Wayland的核心理念是将窗口管理和图形渲染分离,使得每个应用程序可以...

    cairo-1.6.4.zip

    总的来说,Cairo是一个强大的2D图形库,对于需要高质量图形渲染的应用程序开发,特别是在跨平台场景下,Cairo是一个不可或缺的工具。在Windows上使用GTK+开发应用程序时,Cairo扮演着至关重要的角色,提供图形渲染...

    cairo-1.8.0.tar.gz

    在计算机图形处理领域,Cairo是一个广泛使用的2D图形库,它提供了跨平台的接口,支持多种输出目标,如屏幕显示、PDF文件、PostScript以及SVG等。本文将深入探讨Cairo 1.8.0版本,基于提供的cairo-1.8.0.tar.gz压缩包...

    cairo-1.10.2

    1. **跨平台**:Cairo 可以在多种操作系统上运行,提供一致的接口来处理图形,使得开发者无需关注底层细节。 2. **矢量图形支持**:Cairo 支持创建和操作矢量图形,这意味着图形可以在放大或缩小时保持清晰,不受...

    cairo-example(cairo库的一个例子,C语言编写,含有makefile文件)

    "cairo"是一个跨平台的2D图形库,广泛用于Linux、Windows和Mac OS X等操作系统。"makefile"是项目构建系统的一部分,用于自动化编译和链接过程。 **cairo库详解** cairo库是一个开源的二维图形渲染库,它提供了...

    Cairo_1.5-3.zip

    总的来说,Cairo是一个强大的2D图形库,是许多跨平台应用和框架的基础组件,特别适合需要高质量图形输出和多平台兼容性的开发者使用。通过深入学习和掌握Cairo,开发者可以创建出精美、高性能的2D图形应用。

    Cairo 1.14.2最新版

    Cairo是一个跨平台的2D图形库,支持多种操作系统,如Windows、Linux、Mac OS X等,以及多种渲染后端,如OpenGL、X11、Quartz、Direct2D等。在本文中,我们将深入探讨Cairo 1.14.2这个版本,特别是它在Windows 7 32位...

    cairo-1.8.6.tar.gz

    它的设计目标是提供一个跨平台的API,使得开发者能够创建高质量的图形输出,如矢量图形、光栅图形以及PDF和SVG等格式的文件。在本文中,我们将深入探讨Cairo库的1.8.6版本,了解其安装过程,并探讨其在实际开发中的...

    Cairo

    Cairo的核心设计目标是提供一个跨平台的底层绘图引擎,支持硬件加速,以实现高效、流畅的图形渲染。 在Cairo中,"字体"是一个重要的概念。Cairo库支持多种字体格式,包括FreeType(用于TrueType和OpenType字体)、...

    UE4Cairo:将Cairo图形库集成到虚幻引擎4中

    Cairo是一个跨平台的2D图形库,支持多种输出设备,包括屏幕、打印机、PDF文件等。它提供了矢量图形的绘制功能,这意味着无论放大多少倍,图像都能保持清晰,这对于游戏中的UI设计、动态艺术或复杂的图形界面非常有用...

    cairo-1.2.6.tar.gz

    4. **游戏开发**:部分2D游戏使用Cairo进行图形绘制,尤其是跨平台的游戏。 总结,Cairo-1.2.6是一个强大的图形库,它提供了丰富的图形绘制功能,且具有良好的跨平台兼容性和性能。无论你是图形界面开发者,还是...

    cairo_win编译代码

    Cairo是一个广泛使用的开源图形库,它提供了跨平台的API,用于在多种操作系统上创建高质量的2D图形,包括Linux、Windows和Android。本文将深入探讨在Windows环境下编译Cairo库以及将其移植到Android系统的过程。 ...

    Node.js-Nodecanvas一个Cairo支持NodeJS的Canvas实现

    Cairo 是一个跨平台的2D图形库,它提供了矢量图形绘制的能力,可以用于创建高质量的图像、PDF 文档、SVG 输出等。通过 NodeCanvas,开发者可以在 Node.js 中利用 Cairo 的强大功能进行图形处理和渲染。 NodeCanvas ...

    WebKit.NET-0.5-bin-cairo

    这个版本0.5-bin-cairo包含了Cairo图形库的支持,Cairo是一个跨平台的2D绘图库,用于提高WebKit在各种操作系统上的渲染质量,特别是在矢量图形和文本布局方面。 使用WebKit.NET,开发者可以创建自定义的浏览器应用...

    CairoTestMac:一个简单的示例应用程序,它使用跨平台的 Cairo 图形库绘制成 Cocoa NSView

    这是一个小型测试应用程序,它使用 Cocoa 应用程序内部的跨平台 Cairo 图形库。 它在窗口中创建一个新视图,并在该视图的 -drawRect: 方法中为该视图创建一个开罗表面和上下文,然后在该视图内绘制一个矩形。 安装/...

    cairo-1.2.2.tar.gz

    Cairo是一个跨平台的二维图形库,专为创建高质量的2D图形而设计。它的名称来源于阿拉伯语,意为“胜利”,在IT领域中代表着它在各种操作系统上实现图形绘制的卓越性能。这个名为“cairo-1.2.2.tar.gz”的压缩包包含...

    C语言绘图包,Cairo包的Windows编译文件

    C语言绘图包Cairo是一个强大的跨平台图形库,它被设计用来提供高质量的2D渲染功能。Cairo支持多种输出目标,包括PNG、PDF、SVG等文件格式,以及X11窗口系统、Windows GDI、Quartz 2D、OpenGL和DirectFB等显示后端。...

Global site tag (gtag.js) - Google Analytics