Contents

在Linux上批量转换图像格式

1. 概述

有时我们需要将图像从一种格式转换为另一种格式。可能是为了减小文件大小或满足特定目的的特定格式要求。

在本教程中,我们将检查如何将一组文件从一种格式批量转换为另一种格式。

2. 使用mogrify命令

**要将图像从一种格式转换为另一种格式,我们可以使用mogrify 命令。**这是ImageMagick 的一款出色工具,可满足我们所有的图像处理 需求。除了格式转换,它还支持对图像文件进行裁剪、调整大小、模糊、翻转、加入等操作。

用法是:

mogrify [options] input-file

让我们将 PNG 文件转换为 JPG 格式:

$ ls
Tracks1.png  Tracks2.png
$ mogrify -format jpg *.png
$ ls
Tracks1.jpg  Tracks1.png  Tracks2.jpg  Tracks2.png
$ file Tracks1.jpg 
Tracks1.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 800x718, frames 3

如上所示,我们有几个 PNG 文件。然后我们对它们运行mogrify命令。在该命令中,我们使用*-format选项将输出格式指定为 JPG。结果,我们可以看到新创建的 JPG 文件。此外,通过使用file*命令,我们验证了生成的文件是 JPG 格式。

**通常,mogrify 命令会在原地编辑文件。因此,始终建议在运行此命令之前备份现有文件。

3. 使用convert命令

**与mogrify命令类似,convert命令也支持不同的图像处理技术。**这是 ImageMagick 的另一个工具。 mogrify命令在原地编辑文件时,convert命令将结果放入一个新文件中。 用法是:

convert [input-options] input-file [output-options] output-file

让我们看看这个命令的实际效果:

$ convert *.png Tracks.jpg
$ ls
Tracks-0.jpg  Tracks-1.jpg  Tracks1.png  Tracks2.png
$ file Tracks-0.jpg 
Tracks-0.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 800x718, frames 3

在上面的命令中,我们将所有 PNG 文件作为输入。对于输出,我们提到了一个带有jpg扩展名的文件名。这样,它将创建新的 JPG 文件,其中Tracks作为前缀,从零开始的数字作为后缀。

结果,我们可以看到新创建的具有不同文件名的 JPG 文件。并且使用file命令,我们已经确认新生成的文件是 JPG 格式的。

mogrify命令在原地编辑文件的事实来看,它更有效,更适合批处理。

另一方面,convert命令将输入中的所有文件读取到内存并进行处理。因此,如果我们从包含大量文件的目录运行命令,可能会导致内存问题。

**但是,convert命令在允许我们为输出指定不同的目标或文件名方面更加通用。**此外,它更适合处理用于合成和动画的多个图像。

3.1.转换为 GIF 格式

**如果我们使用上述命令将图像文件转换为 GIF 格式,它将获取文件夹中的所有 PNG 文件并创建一个 GIF 文件。**对于大多数情况,这是意料之中的。但有时,我们可能需要将每个 PNG 文件转换为单独的 GIF 文件。

有了这个,我们还将看到convert命令的名称修饰功能,这在批处理操作中是必不可少的。 让我们检查一下:

$ convert *.png -set filename:fn '%t' +adjoin '%[filename:fn].gif'
$ ls
Tracks1.gif  Tracks1.png  Tracks2.gif  Tracks2.png
$ file Tracks1.gif 
Tracks1.gif: GIF image data, version 89a, 800 x 718

正如我们在上面的结果中看到的,它创建了单独的 GIF 文件。

让我们检查一下我们使用的不同选项:

  • -set : 指定一个设置
  • 文件名:我们正在做一个文件名设置。这最终用于创建输出文件名
  • fn : 标识标签
  • %t:这代表没有扩展名的文件名
  • +adjoin:此选项为每个输入文件创建一个单独的文件名
  • %[filename:fn].gif:这是生成最终 GIF 文件名的百分比转义

到目前为止,我们已经看到了使用mogrify命令或convert命令更改格式的不同方法。如果我们将这些与 Linux 中的其他命令结合起来,它将在处理文件时变得更加灵活。此外,使用 Bash 命令可以节省我们一些时间来学习复杂的convert命令。

让我们快速看一下其中的几个。

3.2. 使用for循环

让我们检查一下如何使用for循环进行批量转换:

$ for f in *.png ; do convert "$f"  "${f%.*}.jpg" ; done
$ ls
Tracks1.jpg  Tracks1.png  Tracks2.jpg  Tracks2.png

在上面的命令中,我们遍历了所有 PNG 文件。然后我们将文件一一传递给转换命令。最后,我们将所有文件转换为 JPG 格式。

3.3. 使用ls命令

我们可以使用ls 命令结合xargs命令执行批量转换。 让我们看一下:

$ ls -1 *.png | xargs -n 1 bash -c 'convert $0 "${0%.*}.jpg"'
$ ls
Tracks1.jpg  Tracks1.png  Tracks2.jpg  Tracks2.png

从上面的结果我们可以看到 JPG 文件是正确创建的。

3.4. 使用find命令

接下来,让我们检查一下如何使用find 命令:

$ find . -name '*.png' | xargs -n 1 bash -c 'convert $0 "${0%.*}.jpg"'
$ ls
Tracks1.jpg  Tracks1.png  Tracks2.jpg  Tracks2.png

这与上面的命令非常相似。我们使用find命令来获取文件,而不是ls命令。

3.5. 使用parallel命令

每当我们必须批量执行某些事情时, parallel  命令就派上用场了。

$ ls -1 *.png | parallel convert '{}' '{.}.jpg'
$ ls
Tracks1.jpg  Tracks1.png  Tracks2.jpg  Tracks2.png

在这里,我们也可以看到新创建的 JPG 文件。

4. 使用 FFMpeg

最后,让我们使用FFMpeg 将 PNG 文件转换为 JPG 格式。**众所周知,FFMpeg 用于执行各种多媒体任务 。**使用它,我们可以将图像从一种格式转换为另一种格式。

让我们运行它:

$ for i in *.png ; do ffmpeg -i "$i" "${i%.*}.jpg" ; done
$ ls
Tracks1.jpg  Tracks1.png  Tracks2.jpg  Tracks2.png
$ file Tracks1.jpg 
Tracks1.jpg: JPEG image data, baseline, precision 8, 800x718, frames 3

在这里,我们使用了一个for循环来遍历文件。然后,我们将文件一一传递给ffmpeg命令。最后,ffmpeg命令将它们转换为 JPG 格式,因为我们已将jpg作为输出文件扩展名。