图像魔术

作者:Steve Whitehouse

自从第一台配备图形显示器的计算机问世以来,计算机编辑和图像转换一直是人们最受欢迎的应用领域之一。毫不奇怪,Linux 下有大量免费的图形软件可用。

许多可用的软件包都针对特定的应用:有许多图形库可供程序员使用,用于处理读取和写入特定文件格式。还有可用的图像查看器,也允许交互式编辑。ImageMagick 的不同之处在于,它提供了一套全面的工具,可以在 X Window 系统中交互使用,也可以通过命令行驱动。这些工具都基于一个通用的 C 语言库编写。

对于那些想要超越预编译程序功能的人(参见侧边栏“获取 ImageMagick”),该库是可扩展的,允许添加不同的图像文件格式。该库还可以通过其文档完善的 API 从您自己的程序中使用。此外,Perl 和 Python 接口都可用,允许从脚本进行图像操作。

如果您想试用 ImageMagick 工具的一些功能,其中许多工具可以通过位于 http://www.vrl.com/Imaging/ 的 Imaging Machine 在线使用。

像本文这样的文章不可能涵盖 ImageMagick 的方方面面;因此,我为每个主要程序编写了一个简短的描述。ImageMagick 网站上可以找到一套非常好的在线文档——它涵盖了使用和编程该系统的所有方面。

显示

图 1. 文件图像显示

display 程序从文件中加载图像并在屏幕上显示它们(参见图 1)。它有大量的命令行选项,使其非常灵活。Display 非常适合从脚本运行以进行演示或演示,并且将显示视频以及静止图像。图像可以通过多种方式进行操作,可以从命令行或交互方式进行。图 2 显示了一组图像(原始图像位于左上角),这些图像说明了一些可用的效果。在每种情况下,使用的设置都是该效果的默认设置。

图 2. 缩略图图像显示

display 程序与 John Bradley 的 xv 图像查看器非常相似。要显示图像,您可以从菜单中交互式选择一个图像(参见图 3),或者在提示符下键入命令

图 3. Image Magick 菜单

$ display image.gif

在我的研究中,我处理许多 YUV 4:1:1 原始格式的图像。这表示图像为若干字节。图像的 YUV 表示是图像中的亮度信息(黑白版本)(称为 Y 分量)和色度信息(将黑白图像转换为彩色图像所需的额外信息)(称为 U 和 V 分量)的组合。因此,Y 分量由图像中每个像素的一个无符号字节组成。由于人眼对颜色不如对亮度敏感,因此 U 和 V 分量(每个分量都由若干个有符号字节组成)以 Y 分量一半的速率包含在内。与更常用的 RGB 表示相比,这给出了一种相当原始的有损图像压缩形式,在 RGB 表示中,每个像素使用三个无符号字节。在本文的示例中,我将使用 176 x 144 像素的图像。为了显示这样的图像,可以使用以下命令

$ display -size 176x144\
image.yuv
此外,如果您的图像文件具有不受支持类型的标头,并且您知道该图像是 YUV 格式(这也适用于其他原始格式),如果您知道标头的大小,则可以显示它。例如,以下命令
$ display -size 176x144+16 image.yuv
显示带有 16 字节标头的原始 YUV 图像。
导入

Import 是一个 X 图像捕获程序。它捕获目标窗口的内容,可以通过多种方式指定目标窗口,并将其存储在文件中。然后可以使用以下工具查看和操作捕获的图像。

Animate,顾名思义,显示图像序列,可以是 MPEG 文件或多图像 TIFF 或 MIFF 文件。该程序在开始播放之前计算出显示序列所需的颜色数量,以便在整个过程中可以使用相同的调色板,以避免与 X Window 系统的配色方案发生交互。

Montage 将多个图像组合成一个图像。例如,它在为论文和杂志文章准备图表时非常有用。它具有用文本注释每个图像以及指定背景纹理和颜色以及边框大小的选项。图 2 是使用 montage 程序从各个图像创建的。平铺的布局和标签在命令行上指定,所有其他设置都保持其默认值。

Convert 允许从命令行将图像转换为多种不同的格式,以及从多种不同的格式转换图像。其最常见的用途是转换为 ImageMagick MIFF 格式和从 ImageMagick MIFF 格式转换。

Mogrify 提供了可以应用于图像的各种不同的转换。在 display 程序的菜单中提供了转换的命令行界面。

Identify 打印有关图像的各种有用信息,包括检查图像的完整性以及图像是否已损坏。以下是一些示例输出

$ identify image.gif
image.gif 106x80+0+0 PseudoClass 256c 13453b GIF 2s

在这种情况下,图像是 GIF 格式的图像,大小为 106 x 80 像素,具有带有 256 种颜色的 PseudoClass 调色板,大小为 13453 字节,处理时间为 2 秒。-verbose 选项打印更全面的信息列表,包括调色板。

Combine 允许您以各种不同的方式组合图像。它也可以用于从两个输入图像创建差异图像,以查看它们的差异。除了这两种方式之外,还有多种方式可以组合图像。

使用 ImageMagick 编程

虽然有许多软件包提供上述部分或全部功能,但 ImageMagick 的真正优势在于能够使用其库函数编写程序。

发行版中包含一个简单的程序,用于演示如何编写自己的图像操作程序。它加载 JPEG 格式的图像并创建 GIF 格式的缩略图。我稍微更改了该程序在其发行版中的形式,并在下面展示了它。缩略图版本看起来会像图 1 中的原始图像。

ImageMagick 库的 C API 通过一组网页进行文档化,这些网页也包含在发行版中。

要编译 列表 1 中的示例代码,您需要给出如下命令

gcc -o example example.c -lMagick\
        -lX11 -lXext -ltiff -lpng\<\n>
        -I/usr/include/X11/magick -L/usr/X11/lib

所需的库的确切数量以及库和包含文件的位置将取决于您的系统配置。此处给出的示例在我的 Red Hat 4.2 系统上有效,该系统是从 RPM ImageMagick 发行版安装的。

要使用该程序,请创建一个名为 image.jpg 的文件,并在同一目录中运行该程序。结果将是原始图像的缩略图大小版本,名为 image.gif。

使用包含的文档,很容易看出如何扩展和修改此示例,以形成各种不同功能的基础。也可以使用 PerlMagick 接口从 Perl 调用相同的调用。由于我不是 Perl 程序员,因此我没有研究过此接口。

结论

ImageMagick 是一个功能复杂的软件包,要充分利用其潜力;它也非常强大。它以灵活的方式提供了丰富的功能。无需担心可用的更深奥的选项,即可轻松使用基本功能。我怀疑许多人会根据自己的应用将基本选项与仅一两个更高级的选项结合使用。

对于任何需要从基本图像查看器到功能齐全的自定义图像操作系统的用户,我认为 ImageMagick 都是一个值得研究的软件包。

Alan Cox 的照片由 Justin Mitchell 提供,图 1 中的光线追踪背景图像由 David Beynon 制作。

图像文件格式

获取 ImageMagick

Magick with Images
Steve Whitehouse 在威尔士大学斯旺西分校计算机协会首次接触 Linux,当时他正在攻读电子工程学位。获得学位后,他现在继续在剑桥大学攻读“弹性错误图像压缩”的研究生,并由 Racal Radio Ltd. 赞助。如果您想就文章或他的研究主题与他联系,他的电子邮件地址是 SteveW@ACM.org。
加载 Disqus 评论