Contents

使用ImageMagick命令行工具操作图像

1. 概述

ImageMagick 是一个强大的图像查看器和编辑工具,我们可以在 Linux 生态系统中使用。此外,我们可以使用 ImageMagick CLI 以多种方式处理来自 shell(如Bash )的图像。

在本教程中,我们将了解一些使用 ImageMagick 操作图像的最常见方法。

2. 安装

首先,让我们从安装 ImageMagick 开始,它 在大多数操作系统打包存储库中都可用。 **也可以直接下载二进制文件或从源代码 **构建它。

一旦我们安装了包,让我们通过检查我们安装的版本来验证安装:

$ magick -version
Version: ImageMagick 7.0.8-13 Q16 x86_64 2018-10-21 https://imagemagick.org
Copyright: © 1999-2018 ImageMagick Studio LLC
...

如果安装成功,我们将在控制台中看到版本和其他一些信息。

3.一个简单的花卉图像

在本教程中,我们将使用漂亮干净的花朵图像:

/uploads/imagemagick_edit_images/1.jpeg

在我们开始操作我们的图像之前,让我们首先使用identify选项检查我们的花的一些属性:

$ magick identify flower_original.jpeg 
flower_original.jpeg JPEG 400x400 400x400+0+0 8-bit sRGB 23693B 0.000u 0:00.000

这为我们提供了有关原始花卉图像的信息的一个很好的总结。我们默认看到的列是:

  • 文件名
  • 图像格式
  • 尺寸(以像素为单位)
  • 图像的几何形状
  • 我们图像的深度
  • 图像的色彩空间
  • 文件大小(以字节为单位)
  • 用户时间
  • 耗时

同样,我们也可以使用*-verbose*选项来获取更多信息。

4. 将图像转换为另一种格式

值得一提的是,ImageMagick 具有大量的特性和功能。我们的示例将侧重于使用convert命令进行图像处理。我们将处理一些简单实用的用例,但实际上,我们只是触及了这个工具的表面。

convert命令具有令人眼花缭乱的 237 个选项,提供了广泛的可能性。但是,让我们从最基本的一个开始:

$ convert flower_original.jpeg flower_original.png

如我们所见,此命令将单个文件flower_original.jpeg从JPG 转换为PNG 格式,而不更改原始文件。

如果我们检查新图像,我们会发现它除了格式之外是相同的,当然还有文件大小:

$ magick identify flower_original.png
flower_original.png PNG 400x400 400x400+0+0 8-bit sRGB 163499B 0.000u 0:00.000

同样,如果我们有一个图像目录,我们也可以将操作应用于目录中的所有图像:

$ convert *.jpg *.png

最后,我们可以检查我们可用的许多不同格式:

$ identify -list format
##    Format  Module    Mode  Description
      3FR  DNG       r--   Hasselblad CFV/H3D39II
      3G2  MPEG      r--   Media Container
      3GP  MPEG      r--   Media Container
...

这是一个特别好的功能,因为我们甚至可以将jpeg图像转换为pdf

5. 调整图像大小

另一个典型的操作是调整图像大小。我们可以通过使用convert命令的*-resize*选项来构建前面的示例:

convert flower_original.jpeg -resize 64x64 flower_64x64.jpeg

在此示例中,我们将原始花卉图像放入一个 64×64 像素大小的小方框中

/uploads/imagemagick_edit_images/1.jpeg /uploads/imagemagick_edit_images/flower_64x64.jpeg

同样,我们也可以在使用resize选项时指定百分比值。这将按指定的数量缩放图像:

convert flower_original.jpeg -resize 50% half_flower.jpeg

让我们检查结果:

/uploads/imagemagick_edit_images/1.jpeg /uploads/imagemagick_edit_images/half_flower.jpeg

对于我们大多数人来说,这种类型的缩放将非常好,但我们应该注意,图像的最终像素大小将四舍五入到最接近的整数。因此,实际比例可能与我们提供的比例因子不完全匹配,但会非常接近。

总结本节,通常,更改图像大小的最常见方法是将其缩小以适合所需大小。但是,使用我们已经介绍过的-resize*选项,当然可以完全地放大我们的图像。*

5. 翻转和旋转

现在让我们看看我们如何翻转和旋转我们的图像,这有时会很有用:

convert flower_original.jpeg -flip flipped_flower.jpeg

以及相应的结果:

/uploads/imagemagick_edit_images/1.jpeg /uploads/imagemagick_edit_images/flipped_flower.jpeg

正如我们所见,它就像使用-flip*选项一样简单,它将创建一个新的倒置镜像*。 现在,让我们看看如何使用*-rotate*操作旋转图像:

convert flower_original.jpeg -rotate 60 rotate_clockwise_flower.jpeg

我们的图像应该顺时针移动 60 度:

/uploads/imagemagick_edit_images/1.jpeg /uploads/imagemagick_edit_images/rotate_clockwise_flower.jpeg

如果我们提供负值,例如*-90*,则旋转将以逆时针方向发生。

6. 裁剪

能够裁剪图像是一项重要的操作技术,所以让我们继续看看我们如何做到这一点:

convert flower_original.jpeg -crop 180x170+50+50 cropped_flower.jpeg

运行此命令将切出图像的矩形区域

/uploads/imagemagick_edit_images/1.jpeg /uploads/imagemagick_edit_images/cropped_flower.jpeg

简单地说,-crop图像操作符将在当前序列中以我们使用几何参数指定的大小和位置剪切图像的一部分。

在此示例中,我们指定几何参数的宽度和高度,这将给出裁剪后剩余图像的大小 (180×170)。然后偏移量 (+50+50) 中的 x 和 y 为我们提供了裁剪图像的左上角相对于原始图像的位置。

7.色彩效果

现在让我们看看如何将一些简单但引人注目的色彩效果应用到我们的花朵图像中:

/uploads/imagemagick_edit_images/greyscale_flower.jpeg /uploads/imagemagick_edit_images/monochrome_flower.jpeg

从两幅图像的左侧开始,在第一幅图像中,我们明确地将色彩空间设置为Gray

convert flower_original.jpeg -colorspace Gray greyscale_flower.jpeg

这只会将颜色转换为灰色。事实上,我们可以列出所有可用的色彩空间:

$ convert -list colorspace
CIELab
CMY
CMYK
Gray
...

另一方面,在第二张图像中,我们使用*-monochrome选项将图像转换为真正的黑白。 我们还可以使用-negate*选项将每个像素替换为其补色:

/uploads/imagemagick_edit_images/negated_flower.jpeg /uploads/imagemagick_edit_images/charcoal_flower.jpeg

结果,我们图像的红色、绿色和蓝色强度被否定。白色变成黑色,黄色变成蓝色,等等。 在我们的最终图像中,我们模拟了一张炭笔画:

convert flower_original.jpeg -charcoal 1.2 charcoal_flower.jpeg

这个标志需要一个额外的相关因素。使用较小的数字通常会产生非常准确的输出。

8.添加边框

在倒数第二个示例中,我们将使用几个 CLI 的边框选项来查看一个简洁的功能

convert flower_original.jpeg -bordercolor yellow -border 5 flower_with_border.jpeg

在此示例中,我们使用*-border*选项将边框颜色设置为黄色并设置边框大小:

/uploads/imagemagick_edit_images/2.jpeg

正如我们所看到的,我们在原始花卉图像周围留下了一个充满活力的黄色边框。

9. 创建动画

假设我们有许多跨越一段时间的图像,我们希望将它们合并到一个动画 gif 中。假设我们有一些太阳图像, 大约每 2 秒捕获一次。

假设我们的图像按正确的时间顺序依次排序,它们是:

$ ls -1
20210601_170450_swap174_512.jpg
20210601_170640_swap174_512.jpg
20210601_170830_swap174_512.jpg
20210601_171020_swap174_512.jpg
...

我们可以运行命令从目录中的所有*.jpg图像文件生成动画

convert -loop 0 *.jpg sol.gif

输出看起来像一部太阳电影,非常酷:

/uploads/imagemagick_edit_images/3.gif

在此示例中,我们使用值为0的*-loop*选项。这会将迭代次数设置为零,因此动画将重复无限次

我们还可以使用*-delay [ticks]*选项在每个图像转换之间添加延迟。

因此,我们可以组合各种选项,包括*-resize以减小最终的gif*大小:

convert -delay 20 -loop 0 -resize 50% *.jpg sol.gif