Java跨平台,java应用程序如何跨平台

  Java跨平台,java应用程序如何跨平台

  用cairo实现跨平台图形

  用于生成一致输出的矢量图形库

  伊莱道

  发布于2007年9月24日

  开罗的优势和用途

  Cairo是一个免费的矢量绘图软件库,可以绘制多种输出格式。Cairo支持许多平台,包括Linux、BSD、微软Windows和OSX(BeOS和OS2后端也在开发中)。Linux画图可以通过X Window系统,Quartz,图像缓冲格式或者OpenGL context来实现。此外,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是矢量图形库,所以画图需要的是图形的几何描述,而不是位图中填充的像素。当使用位图绘制时,根据预定的布局用预定的颜色填充一系列像素,图形的质量与位图的大小成正比。

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

  计算机绘图系统和架构很早就出现了,cairo的设计借鉴了PostScript和PDF模型的很多经验。Cairo借用了PostScript和可移植文档格式(PDF)方法,因为它们都使用数学语句来定义图像。由于图像是用几何方法表示的,所以可以随时在一定范围内计算几何描述,从而再造整个图像(或图像的一部分)。图形的几何属性表现为点、曲线和直线(这些元素构成一个矢量)。

  因为可以通过重新计算数学描述来重新绘制图像或其组成部分,所以当图像被放大、缩小或变换时,不会有分辨率的损失。但是,矢量图有一些局限性。例如,如果矢量图像以非常高的比例缩放,超出了大多数人实际需要的范围,就可能导致失真。放大时,由于计算中的舍入误差,一些直线可能看起来不正确。缩小时,一些直线可能看不见或难以分辨。

  Cairo的矢量图还有一个优点:矢量图往往很小。这是因为大量的信息可以用相当简单的数学表达式来表达。矢量图的好处是绘图过程相当简单。图片库负责把点、线和相关的表达转化成用户看得见的东西。

  描述曲线的表达式称为贝塞尔曲线或路径,它来自数学家皮埃尔贝塞尔。贝塞尔曲线由至少两个锚点组成,锚点之间有一个或多个点,称为手柄。您可以通过移动控制点来更改曲线的形状。如果你用过Photoshop或者GIMP之类的工具,你可能对这条曲线比较熟悉。但是,在使用那些工具时,最终保存的图形格式可能是位图!文件格式决定了是保留贝塞尔路径信息,还是在给定范围内进行计算并将计算结果保存为位图格式。

  在撰写本文时,可用的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可以呈现以下输出格式:X Window System(如果可能,将使用Render扩展)

  OpenGL(使用glitz后端)

  内存中的图像(像素缓冲区等。)

  附言(用于打印)

  PDF(可移植文档格式)文件

  SVG(可缩放矢量图形)格式

  然而,并不是所有的展示目标都有同样的效果。尽管cairo努力在各种后端上产生相同的输出,但每个后端都有自己的优势。比如PDF后端会尽可能使用矢量计算(只在必要的时候生成图像),而PostScript后端实际上会为每一页生成一个大图。

  cairo中的表示模型受到许多现有技术的影响。Cairo在PostScript中采用了路径、笔画和填充的概念,在PDF和modern X server中也实现了Porter-Duff图像组合技术。此外,cairo还实现了裁剪、蒙版、渐变等补充功能。

  开罗的实际应用

  许多有影响力的开源项目都采用了cairo,它已经成为Linux图形领域的重要软件。采用cairo的重要项目包括:Gtk,一个流行的跨平台图形工具集。

  Pango是一个用于排列和呈现文本的免费软件库,主要用于国际化。

  Gnome,一个免费的桌面环境

  Mozilla,一个跨平台的网络浏览器基础设施,Firefox就是建立在这个基础设施之上的。

  Openoffice.org,一个可以媲美微软Office的免费办公套件

  开罗概念图

  用cairo画图的时候,最简单的操作就跟手绘的时候一样:选择画图的媒介,笔刷,颜色,考虑线条的布局,然后实际画。《开罗文献》通过类比画家的绘画过程来介绍开罗的操作,下面的描述也采用了这种方法。

  对于一个画家来说,最简单的事情通常是选择空白的绘画媒介。在现实世界中,艺术家可以选择在纸上、画布上甚至墙上作画。在cairo中,您还必须选择空白绘图介质。用cairo绘图时,需要设置一个cairo上下文,这是主对象。在这种情况下,您可以选择目标外观,如PostScript文件、PDF文档或屏幕图像。所以我们可以选择我们想画的东西。

  现在考虑画家的下一个任务:选择画笔。画家选择合适形状和大小的画笔往往需要很长时间。在cairo中,还有毛笔形状的概念,用笔画宽度来表示。不同的笔画宽度会产生不同粗细的线条。

  接下来,cairo用户需要用精确的坐标来表达绘制操作,这与现实世界中的绘制过程是不同的。艺术家只需要把画笔放在纸的大概位置上,但计算机必须知道X和Y坐标才能画图。

  设置好笔刷和开始绘制的位置后,你需要想象笔画的形状。简单的图形可能由直线组成,但像真正的画家一样,他们也可以绘制曲线和圆弧。

  最后,您必须定义笔画结束的位置。类似地,这个位置应该由一对(x,y)坐标来指定。

  此外,还可以给绘制的对象上色。按照cairo的术语,这叫填充。对于上面描述的每个操作,cairo都有相应的简单API实现。稍后将介绍其中的一些API。

  这些基本操作可以帮助你构建一些非常复杂的图形。你甚至可以使用cairo来执行艺术家无法轻松完成的任务,例如放大现有图形或将图形移动到虚拟纸上的其他位置。

  GIMP或者Photoshop也可以让你进行很多这样的操作,但是cairo不一样:cairo是一种程序化的绘制方法。GIMP和Photoshop使用类似cairo的工具“在幕后”实现绘图。使用这些工具绘图时,坐标点和工具类型(如框)由鼠标操作自动设置,画笔和笔触宽度由GUI环境选择。如示例代码所示(见下载),cairo需要显式交互,比如“画一条弧线,描边宽度为1,半径为10,圆心在位置Z”。

  正确的开罗术语

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

  首先,开罗有一个绘画语境,相当于画家的画布。Context的类型是Cairo _ T。要渲染图形,必须有一个上下文。绘图上下文中的常见操作是绘制贝塞尔图、直线和曲线。Cairo对一系列曲线和相关数据的术语是路径。您可以绘制这些路径并设置描边宽度或填充。

  使用一个非常简单的API将坐标转换成路径。这个API非常有意义,因为它使我们不必考虑线性代数或图形教科书中讨论的复杂变换矩阵。你可以在cairo绘图上执行任何转换操作,包括剪切、缩放或旋转图形或部分图形。通过指定一个点来绘制每条路径。开罗遵循连接点的方法。稍后将提供一个示例。

  接下来,讨论各种cairo外观类型。有几种cairo外观类型,每种类型对应一个输出目标。开罗的表面是绘画的地方。具体来说,有图像外观(内存缓冲区)、Open GL的glitz外观、用于呈现文档的PDF和PostScript外观,以及用于直接执行绘图的XLib和Win32外观。这些外观类型是从外观基础类型cairo _ surface _ t派生而来的。

  在cairo中,模式是一种可读的内容,用作绘制操作的源或遮罩。cairo中的图案可以是实体图案,基于外观的图案,甚至是可变图案。

  到目前为止,我们只讨论了笔画路径。然而,笔画路径通常只会产生不太有趣的线条画。实际上,简单的线条只是cairo的五种基本绘图操作之一。这五个操作是:cairo_stroke。

  开罗_填充

  开罗_ show _ text/开罗_show_glyphs

  开罗_油漆

  开罗_面具

  简单的线条画虽然方便,但表现力不够强,无法表现字体等复杂图形。Cairo为字体提供了一个基类cairo_font_face_t。Cairo支持可缩放字体,其中包含给定字体大小的缓存标准。此外,您可以使用各种字体选项来控制给定字体的显示方式。使用cairo时,UNIX上常用Freetype字体,Windows平台上使用Win32字体。

  Cairo示例应用程序

  我写了一个cairo代码来画IBM的logo。您可以从下面的下载部分下载这段代码。运行它应该会产生以下输出:

  图一。由cairo生成的IBM徽标

  请注意代码中的cairo_stroke (cr)行,它出现在绘制字母之后,添加注册标记之前。如果不设置笔画,开罗什么也画不出来。忘记设置笔画是初学者常犯的错误。

  开罗的发展进程

  cairo的版本号采用了与Linux内核类似的规则——,即奇数版本为实验开发版本,不适合在生产环境中使用。Even版本是一个稳定的版本:最初的1.0版本主要关注于向用户平滑地提供API和产生高质量的输出。1.2 API改进了几个开发不完整的后端,目前的1.4系列主要是优化和增加新功能。

  cairo的开发人员提供了一些优秀的代码片段,展示了cairo API的功能(参见参考资料一节中的链接)。所以不要等下一个版本的cairo,现在就下载并试用当前版本吧!

  下载绘制IBM徽标的cairo代码(cairo-example.tar 20kb)

  有关相关主题,请参考developerWorks全球网站上这篇文章的英文原文。

  cairo graphic project的主页包含cairo用户手册、演示cairo API各个部分的代码片段等。

  图像技术咨询服务(tasi)提供了常见的矢量图形术语和解释。

  在developerWorks Linux专区,您可以找到更多针对Linux开发人员的参考资料,以及最流行的文章和教程。

  用IBM试用软件构建您的下一个Linux开发项目,该软件可以直接从developerWorks下载。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: