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

时间:2015-06-08 10:52:46

标签: shell image-processing python-imaging-library

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

2 个答案:

答案 0 :(得分:4)

您可以使用ImageMagick提供的mogrify工具

mogrify -resize 256x256 *.jpg

这将修改所有文件,将其大小调整为256x256px。在使用此命令之前,请务必备份

答案 1 :(得分:4)

我会使用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),从而摊销启动流程的成本超过更多的文件。