调整大量图像文件大小的简单方法

Simple way to resize large number of image files

我有一个包含大约 45000 张 jpeg 图片的文件夹。其中大部分是 10KB - 20Kb。 现在我想编写一个脚本来将它们全部调整为固定大小 256x256。我想知道是否有任何简单的方法可以做到这一点:for a in *.jpg do ...。我使用的是 8 核 CPU 和 8GB 内存的机器 运行 Ubuntu 14.04,所以如果进程需要很多资源也没关系

您可以使用ImageMagick

提供的mogrify工具
mogrify -resize 256x256 *.jpg

这会修改所有文件,将它们的大小调整为 256x256 像素。在使用此命令之前,请务必对您的原件进行备份

我会使用 GNU Parallel,像这样充分利用所有这些内核:

find . -name \*.jpg | parallel -j 16 convert {} -resize 256x256 {}

如果文件较少,可以这样做,但命令行对于 45,000 个文件来说太长了:

parallel -j 16 convert {} -resize 256x256 {} ::: *.jpg

此外,请注意,如果您希望文件完全变成 256x256,而不管输入尺寸和纵横比如何,您必须在 -resize 之后添加 !,就像这样 -resize 256x256!

正如汤姆所说,先备份!

这里有一个小基准...

# Create 1,000 files of noisy junk @1024x1024 pixels
seq 1 1000 | parallel convert -size 1024x1024 xc:gray +noise random {}.jpg

# Resize all 1,000 files using mogrify
time mogrify -resize 256x256 *.jpg

real    1m23.324s

 # Create all 1,000 input files afresh
seq 1 1000 | parallel convert -size 1024x1024 xc:gray +noise random {}.jpg

# Resize all 1,000 files using GNU Parallel
time parallel convert -resize 256x256 {} {} ::: *.jpg

real    0m22.541s

您可以看到对于此示例,GNU Parallel 要快得多。公平地说,这也是一种资源浪费,因为必须为每个输入文件创建一个新进程,而 mogrify 只使用一个处理所有文件的进程。如果您知道这些文件是以特定方式命名的,您可能能够更好地优化事情...

最后,您可能会发现 xargsmogrify 的协同工作非常适合您,如下所示:

time find . -name \*.jpg -print0 | xargs -0 -I {} -n 100 -P 8 mogrify -resize 256x256 {}

real    0m20.840s

允许最多 8 个 mogrify 进程并行 运行 (-P 8),每个进程最多处理 100 个输入图像 (-n 100),从而分摊在大量文件上启动进程的成本。