Linux 图形工具

作者:Michael J. Hammel
在开始之初...

自从我编写了我的第一个 Basic 程序,以窥探和戳刺的方式在 TRS-80 Model 1 上浏览一系列动画块状图形以来,我就对计算机在图形方面的应用产生了浓厚的兴趣。我通过修改我用其他语言编写的图形程序来学习每一种新语言。在高中和大学早期,这些程序都是简单的游戏——后来我了解了曼德勃罗集和朱利亚分形算法。这些算法相对容易编程,因此成为我学习新语言、新环境,更重要的是,学习图形系统的工具。

多年来,这种迷恋时而高涨,时而消退。毫不奇怪,当一些具有最新、最出色的特效的新电影上映时,我的兴趣会达到顶峰。星球大战上映时,我刚接触到 TRS-80,所以很自然地,我用 BASIC 编写了 X 翼战斗机躲避模拟十字线雷达的程序,尽管在雷达锁定时,X 翼的飞行员可能已经老死了。

1995 年末,我和一位同事开始为我们公司的网页工作。我做过自己的网页,但它们缺乏良好的图形效果。他确信他可以做图形,而我做 HTML。当他开始赞扬基于 MS-Windows 的图形工具(如 Adobe Photoshop)的优点,并滔滔不绝地说 Linux 和 Unix 总的来说缺乏此类工具时,他的热情变得令人恼火。由于我知道我在电影中看到的大多数特效都来自 Silicon Graphics 或其他 Unix 系统,所以我知道 Linux 上一定有类似的工具可用。

然后 玩具总动员 上映了。我被迷住了。我被迷住了。我完全着迷了。我开始寻找 Linux 工具,以便更新我的网页,并向世界展示在 Linux 机器上可以完成什么。

本文介绍了我找到的工具,讲述了我收集的信息如何发展成为 Linux 图形 mini-HOWTO(参见资源框),并探讨了图形领域在 Linux 上的发展。我假设读者是图形初学者,我专注于当前可用的工具。我只简要地介绍了用于进行图形编程的环境和库,因为这些需要更深入的讨论;但是,我也不想重复 Linux 图形 mini-HOWTO 的内容。阅读本文后,您可以查看 mini-HOWTO 以获得更多详细信息。

图形基础

归根结底,Linux 上可用的图形工具实际上只有四种类型

查看 - 显示图像但不更改图像的工具

创建 - 创建图像的工具

操作 - 更改现有图像的工具

转换 - 将图像转换为新格式的工具

每种类型都有各种工具可用。许多工具适合多个类别。类别之间的界限并不总是很明确,但类别的使用有助于组织图形 mini-HOWTO。

创建工具还提供两种基本功能之一:它们绘制或渲染图像。绘图工具提供交互式创建形状(称为图元)的能力,例如框、圆形、圆锥体或环面。创建工具还包括画图程序。渲染工具基于模型信息构建图像,即描述图元的形状及其在场景中关系的信息。区分这两者的最简单方法是,绘图程序通常处理 2D 图像,而渲染工具处理 3D 图像。这是一种过度简化,但对于本文来说已经足够了。

图像基本上就是图片,它们有多种格式。GIF、JPEG、PNG 和 TGA 是一些更常见的静态图像格式,但实际上还有数百种其他格式。没有一种格式是标准格式,因此没有一种格式是每种工具都支持的。GIF 和 JPEG 是 Web 浏览器最广泛支持的格式,但您可以期望很快在许多浏览器和其他工具中看到 PNG 支持。您使用哪种格式取决于您使用的工具以及您打算使用图像的方式。例如,GIF 不适合大型海报,因为它不支持每张图像超过 256 种颜色。另一方面,TGA 提供大范围的颜色,但 Web 浏览器不支持它。

静态图像(如照片)是独立的单张图片。动画图像可以是静态图像的字符串,也可以是由使用特殊语言或编程库编写的程序动态创建的图像。计算机图形学的许多兴趣是由动画图像的使用产生的;但是,对于新用户来说,在进入动画之前了解静态图像非常重要。因此,本文不讨论动画工具。

许多编程库可用于支持各种图形格式以及某些类型的图元、函数和算法。TIFF、JPEG、PNG 和许多其他图像格式的库已经存在,因此程序员不必在他们编写的每个新程序中都重新发明轮子。还有许多语言和编程接口可用于创建 2D 和 3D 图形以及运行时动画,包括 VRML、OpenGL 和 PHIGS。

图 1. AC3D 屏幕,带有导入的滑翔机 DXF 模型

图 2. GIMP 窗口

查看工具

在我在 Compuserve 的早期,GIF 文件很丰富,并且使用 picem 等程序查看,这些程序除了显示图像外几乎没有其他功能。今天 Linux 上可用的大多数工具的功能远不止查看图像。

仍然有一些工具的功能仅限于查看图像。xwud (X Window Undump) 是随 X11 客户端基本集一起交付的程序,用于显示使用名为 xwd (X Window Dump) 的配套工具创建的 X-Windows Dump 格式的文件。但是,这两个工具都不具备丰富的功能,我只在没有其他方法在 X 下进行窗口屏幕捕获时才使用它们。

创建工具

Linux 上可用的大多数图形工具都属于创建工具的范畴,允许您以交互方式或通过某种形式的场景描述语言来绘制或渲染图像。其中最广为人知的工具之一是 XPaint,这是一种风格类似于旧的 MacPaint 或 MS Paint 但功能不如它们的工具。该程序最近的更新通过提供额外的选项有所帮助,但 Photoshop 等工具的快速发展使得 XPaint 风格的工具不再那么有吸引力。XPaint 确实提供了一些基本功能,可用于为其他工具创建纹理贴图。例如,XPaint 的一个不错的功能是能够编辑图像中的单个位。

XPaint 和类似工具的一个缺点是,它并非旨在将像素作为组来处理,也不允许通过色调、饱和度或强度来修改像素。因此,XPaint 为您提供了一个可以在其上绘画的画布,但没有能力在绘画前混合颜色或在画布本身上混合颜色(或灰色阴影)。

在看过 玩具总动员 后,我发现的第一个工具是 POV-Ray,即 Persistence of Vision Raytracer。POV-Ray 是另一种形式的创建工具,它是一个 3D 照片级真实感渲染器(而不是绘图程序)。它的工作原理是读取描述要渲染的场景的文本文件。场景描述了由图元(框、圆锥体、环面、三角形和/或这些形状和其他形状的组合)组成的对象、放置在这些对象上的纹理的描述、场景内外的照明以及“相机”的视点。进行光线追踪的程序使用一种特定的方法来确定光线如何作用于对象,从而确定对象在查看者眼中的外观。这种方法跟踪光束穿过场景的路径;如何做到这一点对于除最有经验的光线追踪艺术家之外的所有人来说都无关紧要。计算场景中光线行为的其他方法是辐射度和 REYES 算法,这是制作 玩具总动员 时使用的方法。Linux 图形 mini-HOWTO 中讨论了使用这些方法的工具。

像 POV-Ray 这样的工具的缺点是缺乏用户交互。POV-Ray 是一种批处理程序——它处理一个文件并生成输出。POV-Ray 的任何功能都不允许您创建输入文件。输入文件必须手动创建或使用建模器创建。建模器(如 CAD 系统)使用其场景中对象的线框表示。线框的使用有助于从各个角度可视化场景,而无需添加纹理的开销(纹理通常需要很长时间才能计算,即使在相当快的系统上也是如此)。

Linux 上有三种建模器可用:SCED、Midnight Modeller 和 AC3D。SCED 以源代码形式提供,可在多个 Unix 平台上移植,并使用 Athena widget 集。我发现它的界面有点难以使用,但对对象进行分组的能力(称为 CSG(构造实体几何))非常好。Midnight Modeller 是一种从 MS-Windows 环境移植过来的工具。作者不发布源代码,因此该程序仅以二进制格式提供。该界面非常类似于 CAD,但颜色往往很刺眼,使得该程序难以使用。窗口功能(如菜单和对话框)非常像 DOS,我发现这在 X-Window 系统上是一种干扰。这些工具的质量都不如 MS-Windows 的一些更好的建模器。

AC3D 是一种新工具,具有非常好的 3D(类似 Motif)界面,它使用正面和侧面视图窗口,并且可以进行一些实时渲染。我在完成本文时才偶然发现了这个工具,所以我还没有时间对其进行适当的评测。在这三个工具中,它似乎是最用户友好的,界面也最直观。AC3D 是 Linux 的共享软件(约 15 美元),目前仅以二进制格式提供。

当我第一次开始收集有关图形工具的信息时,我主要使用 POV-Ray,因为我找到了 POV-Ray 网站及其大量的工具集合。但是,这些工具大多是 DOS/Windows 二进制文件,或者是 DOS/Windows 用户编写的,并且包含 C 源代码。由于我没有运行 DOS 或 Windows,并且关于哪些工具可以在 Unix 上运行的信息很少,所以我开始了 Unix Graphics Utilities 网页(此页面并非专门针对 Linux)。我使用我收集的信息作为编写 Linux Graphics mini-HOWTO 的基础和动力,因为我的所有测试都是使用 Linux 系统完成的。

许多其他工具可以归入创建类别。例如

  • BMRT 是一种符合 Pixar 发布的 Renderman 规范的工具。PRMan(用于创建 玩具总动员)是另一种符合 Renderman 规范的工具(尽管它在 Linux 系统上不可用)。

  • Rayshade - 另一种光线追踪实用程序。

  • TGIF - XPaint 的一个更复杂的版本,它允许将图元组织成组和层,类似于 Macintosh 的旧 MacDraw 工具。

  • HF-Lab 是一种用于创建 3D 景观的工具。

同样,您可以从 Linux Graphics mini-HOWTO 中获得有关这些工具的更多详细信息,包括在哪里获取这些工具。

图 3. POV-Ray 主页

操作工具

GIMP(通用图像处理程序)是一种在短时间内获得了相当多追随者的操作工具。GIMP 主要由加州大学伯克利分校的 Peter Mattis 和 Spencer Kimball 开发。该工具被设计为基于 Unix 的同类工具,可与其他操作系统上可用的 Photoshop 级工具相媲美,目前只有一组有限的基础功能;但是,该设计包括添加插件的能力,这些插件可以扩展程序的功能。这种设计理念的结果是,来自不断增长的开发者群体的插件数量非常庞大。我添加了我自己的插件,即基于 John Beale 的 Sparkle 实用程序的 Sparkle 插件。有教程以及技巧和窍门网页(参见资源框),并且相对努力地组织插件的注册、格式和分发。

GIMP 既提供用户交互,又提供通过各种混合技术(几乎所有这些技术都是通过插件完成的)组合图像的能力。通过组合两个图像,例如通过从另一个图像中减去一个图像,可以将 2D 黑白文本转换为全彩色 3D 图像,类似于从等离子场到发光管状果冻的任何事物。GIMP 是超越 XPaint 的基本框、圆形和填充功能的一大步。

组合图像是通过所谓的“通道操作”(通常称为通道运算)完成的。这些是对单个像素的操作,基于像素和/或周围像素的强度(亮度)或颜色。简而言之,通道操作是在一个或多个图像中混合颜色。通道运算是使 GIMP 比 XPaint 更具吸引力的图形艺术家工具的原因。(请注意,XPaint 的基本功能并非全部在 GIMP 中实现,因此 XPaint 仍然有用。)

GIMP 的缺点有两个:它处于早期开发阶段,并且它的 GUI 基础正在发生变化。对 Motif 的依赖正在被消除,并且已经开发了一个新的工具包 gtk(GIMP 工具包)。该工具包正处于早期测试阶段。基本 GIMP 功能和大多数插件都缺乏任何详细的文档。但是,这些问题相对较小,并且正在得到解决。GIMP 的优点是,目前,它是唯一免费提供的同类程序,并且它拥有来自插件开发和用户社区的庞大支持基础。

XV 是另一种广受欢迎的工具。XV 由 John Bradley 开发,是一个共享软件程序,支持大量用于读取(显示)和写入的文件格式。注册软件副本的用户可以获得大量印刷文档。虽然 XV 支持的用于操作图像的算法数量小于 GIMP 的插件库,但 XV 中控制图像颜色的能力要强得多。您可以比 GIMP 提供的方式更多地交互式控制色调、饱和度和 RGB(红色、绿色和蓝色)级别(尽管至少有一个 GIMP 插件允许在一定程度上进行这种控制)。

在我看来,GIMP 和 XV 之间的主要区别在于,后者是为科学图像处理而设计的,而前者是为艺术家而设计的。我确信有些人会争辩说,“但我看过 JPL 和 NASA 员工使用 XV 显示行星图像的电视采访。”

图 4. 使用 GIMP 插件生成的图像

动画工具

有几个动画工具值得一提。第一个是 mpeg_play,一个用于查看 MPEG 格式动画文件的工具。它的配套工具 mpeg_encode 创建 MPEG 文件。它还可以显示 XING 文件,该文件使用 MPEG 编码的变体。但是,mpeg_play 不会以可以保存回文件的方式操作图像——它仅修改显示的图像。

Xanim 类似于 mpeg_play,但支持更广泛的输入文件类型和动态调整图像大小的功能。

转换工具

使用图形工具时您会遇到的问题之一是对特定图像文件格式的支持。例如,在使用 GIMP 时,您可能希望使用 TGA 图像,因为 TGA 提供多达 24 位的颜色,而 GIF 格式仅提供 8 位的颜色。当您使用 GIMP 添加、减去、模糊或以其他方式操作图像时,具有更大的颜色范围可以实现非常平滑的颜色混合。但是,如果您创建的图像注定要用于网页,则需要将其转换为 GIF 或 JPEG 格式。如果 GIMP 没有提供执行此操作的方法(它确实提供了,但这只是一个示例),您将需要一个用于转换图像格式的工具。

PBMPlus 和 NetPBM 是一组用于在各种格式之间转换图像的工具。PBMPlus 工具最初由 Jef Poskanzer 编写,它将特定格式的一个图像文件作为输入,并将其转换为称为 PPM(便携式像素图)的中间格式。然后使用另一个 PBMPlus 工具将 PPM 格式转换为目标格式。例如,要从 TGA 转换为 GIF,您可以使用

tgatoppm input.tga | ppmquant 256 | \
    ppmtogif -interlace > output.gif

ppmquant 是 PBMPlus 中的另一种工具,它不用于将文件转换为另一种格式,而是以相同的方式更改图像。在 ppmquant 的情况下,输入图像从大量的颜色量化为 256 种颜色。这样做可以减小数据文件的大小,并且根据图像的不同,可能不会使外观发生太大变化以至于无法使用。您可能会选择减少颜色数量,因为计算机可以记录比人眼可以区分的更精细的颜色,并且在网页上,较小的数据文件可以加快加载速度。

PBMPlus 工具通过处理来自标准输入的数据并写入标准输出来工作,这允许用户将一系列工具串联成一系列管道(如上面的示例所示)。所有工具都旨在用于命令行,即,这些工具没有可用的图形界面。

NetPBM 是 PBMPlus 的后期版本,在 Jef 停止在该项目上工作后,另一个开发者团队接手了开发工作。但是,我相信 Jef 再次回到 PBMPlus 的工作。

另一个转换工具是 ImageMagick。这组工具具有图形前端,但它们也可以用作命令行工具,类似于 PBMPlus 工具。我没有过多使用这些工具,但我知道它们有很多支持者。

编程接口

编程接口实际上不是最终用户工具,但我想提一下几个,因为这些接口很可能成为下一代最终用户工具的基础。

最流行和最广泛的编程接口之一是 Silicon Graphics 的 OpenGL。OpenGL 是一种与硬件无关的编程接口,它提供命令和操作来生成 3D 交互式应用程序。这项技术相当新,需要在您的 X 服务器中提供支持,才能利用视频适配器提供的硬件加速。虽然使用 OpenGL 不需要硬件支持,但如果没有硬件支持或相对快速的计算机,OpenGL 应用程序的运行速度会有点慢。OpenGL 的免费版本 MesaGL 实现了大部分(如果不是全部)OpenGL 命令集。此外,OpenGL 具有非常底层的接口,很像 Xlib 对于 X-Windows;因此,更高级别的工具包(如 GLUT 或 aux)更适合编写应用程序。[有关 OpenGL/Mesa 的更多信息,请参阅本期其他位置的 Linux 进入 3D —ED。]

VRML 是虚拟现实建模语言,旨在提供使用类似于 HTML 的标记语言的 3D 界面。当前的 VRML 2.0 规范基于 Silicon Graphics Moving Worlds 规范。只有少数支持 VRML 的浏览器可用;但是,行业对这种语言非常感兴趣,我预计许多浏览器将在不久的将来支持它。C|Net 最近的一份报告指出,Netscape 3.0 和 MS Internet Explorer 都在某种程度上支持 VRML。

Java 并非专门面向图形;它的真正目的是提供一种与平台无关的编程语言。Java 因其通过万维网提供的一组图形应用程序和工具包而赢得了早期的声誉。我自己的网页使用了称为 JavaScript(来自 Netscape)的脚本语言。

comp.os.linux.announce 新闻组中宣布了许多其他编程库

  • SRGP - 简单光栅图形包,一个用于 计算机图形学:原理与实践 第二版(作者:Foley、van Dam、Feiner 和 Hughes)的工具包。

  • lib3d - 基于 X 的 3D 渲染库

  • EZWGL - 类似于 Motif 的 widget 库,其中包含一些 GL 支持

  • YGL - 模拟 X11 下 SGI 的 GL(图形语言)

网页

正如我在本文前面提到的,Web 浏览器支持 GIF 图像格式,以及一些 JPEG;现在大多数都支持这两种格式。在选择其中一种格式时,您应考虑以下事项

  • 图像以字节为单位的大小是多少?

  • 您希望图像的轮廓可见,还是希望背景透出来?

  • 您希望图像在周围文本显示时淡入视图,还是希望在文本之前显示图像?

这些问题的答案有助于确定要使用的图像格式。与 GIF 相比,JPEG 通常会压缩图像,而不会丢失太多图像的信息和外观。因此,如果您的图像占用大量磁盘空间(这是一个问题,因为我的 ISP 没有为私人网页提供太多磁盘空间),或者您不想强迫您的读者下载大型图像,那么 JPEG 图像可能更好。但是,如果您的图像具有您不希望显示的背景,但您希望页面的背景图像或颜色透出来,则需要使用 GIF 格式的图像,因为 JPEG 不提供图像中的透明度。

如果您希望图像在周围文本显示时淡入视图,则需要使用 GIF 图像。此技巧称为隔行扫描,JPEG 不支持隔行扫描。如果您有大型图像(不一定以字节为单位,而是占用大量屏幕空间的图像),则使用隔行扫描的 GIF 图像对用户更友好。

一旦您决定了要使用的图像类型,就可以开始创建它们了。有很多技巧和窍门,但对于初学者,我建议您掌握以下工具

  • XV

  • XPaint

  • GIMP

  • PBMPlus/NetPBM

您可以将这些工具与图像 CD-ROM(可从计算机软件商店轻松获得)一起使用,以创建您自己的小型网络世界。当您变得有冒险精神时,您可以尝试使用 POV-Ray 添加一些复杂的 3D 图像。如果您有兴趣在 GIMP 中使用特殊字体,我建议您寻找包含 Adobe Type 1 字体的软件包。获得这些字体后,您应该查看 typ1inst 软件包,该软件包将允许您安装字体以供您的 X 服务器使用。

未来

如您所见,关于图形工具的信息确实太多了,无法在一篇文章中涵盖。几乎所有这些工具都在不断发展,通过许多人的共同努力添加新功能和新特性。基于更强大的编程语言(如 Java 和 OpenGL)的工具即将问世,商业版本开始出现只是时间问题。某些 X 服务器可以支持实时视频捕获,并且即将支持硬件加速和视频捕获卡。我打算在 Linux Graphics mini-HOWTO 中介绍所有这些工具的演变过程。

可以在 Linux 系统上进行专业的图形艺术创作。工具是可用的,文档正在增长,用户社区提供了丰富的信息和帮助。最棒的是——您现在可以使用一个参考资料找到您需要的工具:Linux Graphics mini-HOWTO。

Michael J. Hammel (mjhammel@csn.net) 是一位不稳定的软件工程师,拥有从数据通信到 GUI 开发再到交互式有线电视系统的各种背景——所有这些都基于 Unix。他在计算机之外的兴趣包括 5K/10K 比赛、滑雪、泰国菜和园艺。他建议,如果您有任何认真的兴趣想更多地了解他,请访问他的主页:www.csn.net/~mjhammel。您会在那里找到比您真正想知道的更多的信息。他还请求图形系统的任何商业供应商与他联系,因为他希望将来将这些供应商包含在 mini-HOWTO 中。

加载 Disqus 评论