我有一个包含大约45000个jpeg图像的文件夹。其中大多数是10KB - 20Kb。
现在我想编写一个脚本来将它们全部调整为固定大小256x256。我想知道是否有任何简单的方法可以做到:for a in *.jpg do ...
。我正在使用8核CPU和运行Ubuntu 14.04的8GB RAM机器,所以如果这个过程需要很多资源就可以了。
答案 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
只使用一个进程来完成所有文件。如果您知道这些文件是以特定方式命名的,那么您可以更好地优化文件......
最后,您可能会发现音乐会中的xargs
和mogrify
很适合您,例如:
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
),从而摊销启动流程的成本超过更多的文件。