使用 ImageMagick 操作图像

作者:Dave Taylor

在我的上一篇文章中,我饶有兴趣地研究了儿童游戏石头、剪刀、布,编写了一个简单的模拟器,并发现某些策略比其他策略更好。是的,我在同一句话中使用了“策略”和“石头、剪刀、布”!

因此,对于这篇文章,我认为深入研究一些更实用和务实的东西会很有趣:图像操作。普通的 shell 脚本往往不会对图像做太多处理,因为您无法从命令行显示任何内容。

但让我们坦诚地说。您在计算机终端上直接运行 Linux 或类似的命令行界面的可能性非常低。更有可能的是,您在 X11 系统上打开了一个终端窗口,或者像我经常做的那样,您在现代操作系统(如 Mac OS X)中运行命令行界面应用程序。这意味着,是的,您确实有能力显示图形,只是不是在终端应用程序本身中。

获取 ImageMagick 副本

第一步是下载并安装 ImageMagick 图形相关命令套件的副本。如果您幸运的话,可能已经安装了它:只需键入 convert -version,如果您已安装,您将看到类似于以下内容


$ convert -version
Version: ImageMagick 6.9.6-6 Q16 x86_64 2016-12-31
 ↪https://imagemagick.org.cn
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: https://imagemagick.org.cn/script/license.php
Features: Cipher DPC Modules
Delegates (built-in): bzlib djvu fftw fontconfig freetype gslib
 ↪jbig jng jp2 jpeg lcms ltdl lzma openexr png ps tiff
 ↪webp x xml zlib

如果您没有安装它,那么让它全部启动并运行可能是一项相当艰巨的任务。所有内容都位于此处,这是您想要开始的地方。

在 Linux 系统上,您可以使用您发行版的软件包管理器。您可以从站点获取压缩的 tar 镜像,也可以使用 rpm,如下所示


rpm -Uvh ImageMagick-7.0.4-1.x86_64.rpm

当然,还有更多内容,但这将帮助您入门。

在 Mac 上,您需要首先安装 MacPorts,在安装 Xcode(从 Apple 免费获取,通过 App Store 获取)之后才能执行此操作。安装 Xcode 和 MacPorts 后,您可以安装 ImageMagick,一切就绪。

当测试命令 convert -version 返回有意义的内容时,您就知道一切就绪了。与往常一样,当您安装新软件时,您需要注销并重新登录,以便 PATH 更改和 shell 命令行哈希包含所有最新的程序。

转换图像格式

ImageMagick 可以帮助您完成的最有用的任务之一是转换图像文件格式。它是一个非常出色的程序套件,可以读取或写入 200 多种不同的格式。不相信我?试试这个命令


convert -list format | more

在您日常计算机使用中实际会遇到的最常见格式中,包括以下几种

  • BMP:MS Windows 位图图像。

  • GIF:图形交换格式。

  • JPG:JPEG 图像格式。

  • PNG:渐进式网络图形格式。

  • TIFF:标签图像文件格式。

ImageMagick 也知道大量其他格式,包括所有主要的视频格式(MKV、MP4、AVI、MOV)。它还可以转换 EPSF(封装 Postscript)甚至 PDF(可移植文档格式)等内容,这在特定情况下可能很有用。

掌握了这些知识后,图像文件格式之间的转换实际上非常简单。假设您要将图像从 JPEG 转换为 PNG。就像这样简单


convert image.jpeg image.png

由于 ImageMagick 实用程序是全局识别的(也就是说,您可以使用通配符并指定多个文件名),您还可以使用 convert 命令或更轻松地使用其同类 mogrify 将一组 GIF 图像转换为 JPG


mogrify -format jpg *.gif

让我们用一个包含六个 GIF 图像的文件夹试一试,使用 ls 来显示变形(这是个词吗?)之前和之后的文件夹内容


$ ls -s
total 272
  8 add-to-google-reader.gif     24 blogger-1.gif
  8 dave.gif                    8 add-to-newsgator.gif
 24 blogger-2.gif                    176 manga.gif
 16 aw-logo.gif                   8 blogger-3.gif
$ mogrify -format jpg *gif
$ ls -s
total 752
  8 add-to-google-reader.gif     24 blogger-1.gif
  8 dave.gif                    8 add-to-google-reader.jpg
112 blogger-1.jpg                      8 dave.jpg
  8 add-to-newsgator.gif              24 blogger-2.gif
176 manga.gif                   8 add-to-newsgator.jpg
128 blogger-2.jpg                    168 manga.jpg
 16 aw-logo.gif                   8 blogger-3.gif
 24 aw-logo.jpg                  24 blogger-3.jpg

就这么简单。对单个图像使用 convert,对批量转换使用 mogrify。编写一个简单的脚本来区分这两种情况并使用正确的参数调用正确的命令也很容易。我将把它留给您!

检查图像尺寸

ImageMagick 套件的另一个有用功能是能够识别图形图像的尺寸。最新版本的 file 命令可以在某些系统上提供此信息


$ file manga*
manga.gif: GIF image data, version 89a, 358 x 313
manga.jpg: JPEG image data, JFIF standard 1.01,
 ↪aspect ratio, density 1x1, segment length 16,
 ↪baseline, precision 8, 358x313, frames 3
manga.png: PNG image data, 358 x 313, 8-bit/color RGB,
 ↪non-interlaced

但在大多数 Linux 系统上,其中一个或多个会排除实际尺寸。此外,仔细查看上面的输出,您会发现它非常不一致,如果您不为每种格式编码特定规则,则很难解析出尺寸——这,呃,很糟糕。

相反,您可以使用 identify 命令来收集图像尺寸,如下所示


manga.gif GIF 358x313 358x313+0+0 8-bit sRGB 256c 88.5KB
 ↪0.000u 0:00.000
manga.jpg JPEG 358x313 358x313+0+0 8-bit sRGB 85.4KB 0.000u
 ↪0:00.000
manga.png PNG 358x313 358x313+0+0 8-bit sRGB 266KB 0.000u
 ↪0:00.000

这样更好。它始终是第三个参数,这意味着一个简单的脚本可以剥离除图像尺寸之外的所有内容


$ for image in manga*; do   identify $image | cut -f1,3 -d\  ; done
manga.gif 358x313
manga.jpg 358x313
manga.png 358x313

很简单,请注意 cut 命令既使用空格作为默认字段分隔符调用,又指定您想要字段 1 和 3,但不想要其他字段。

下次再见...

好的,ImageMagick 很复杂。事实上,我在这里并没有真正深入研究脚本,但在我的下一篇文章中,我将解释如何将所有关于 convertmogrifyidentify 的知识转化为一些非常出色的脚本。下次见!

Dave Taylor 长期以来一直在 UNIX 和 Linux 系统上破解 shell 脚本。他是Learning Unix for Mac OS XWicked Cool Shell Scripts 的作者。您可以在 Twitter 上找到他,账号是 @DaveTaylor,您可以通过他的技术问答网站联系他:Ask Dave Taylor

加载 Disqus 评论