在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作为输出文件扩展名。