Shell 调整大量图像文件大小的简单方法
我有一个文件夹,其中包含大约45000个jpeg图像。其中大多数是10KB-20Kb。Shell 调整大量图像文件大小的简单方法,shell,image-processing,python-imaging-library,Shell,Image Processing,Python Imaging Library,我有一个文件夹,其中包含大约45000个jpeg图像。其中大多数是10KB-20Kb。 现在,我想编写一个脚本,将它们全部调整为固定大小256x256。我想知道是否有任何简单的方法可以做到这一点,比如:对于in*.jpg do…。我使用的是8核CPU和8GB的RAM机器,运行Ubuntu 14.04,因此,如果进程需要很多资源,那么这是很好的您可以使用ImageMagick提供的mogrify工具 mogrify -resize 256x256 *.jpg 这将修改所有在位文件,将其大小调整为
现在,我想编写一个脚本,将它们全部调整为固定大小256x256。我想知道是否有任何简单的方法可以做到这一点,比如:
对于in*.jpg do…
。我使用的是8核CPU和8GB的RAM机器,运行Ubuntu 14.04,因此,如果进程需要很多资源,那么这是很好的您可以使用ImageMagick提供的mogrify
工具
mogrify -resize 256x256 *.jpg
这将修改所有在位文件,将其大小调整为256x256px。使用此命令之前,请确保对原始文件进行备份。您可以使用ImageMagick提供的
mogrify
工具
mogrify -resize 256x256 *.jpg
这将修改所有在位文件,将其大小调整为256x256px。在使用此命令之前,请确保对原始文件进行备份。我将使用GNU并行,如下所示,以充分利用这些核心:
find . -name \*.jpg | parallel -j 16 convert {} -resize 256x256 {}
如果文件较少,可以这样做,但命令行对于45000个文件来说太长:
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并行速度要快得多。不过,公平地说,这也浪费了资源,因为必须为每个输入文件创建一个新进程,而mogrify
只使用一个进程来处理所有文件。如果您知道这些文件是以特定的方式命名的,那么您可能能够更好地优化它们
最后,您可能会发现xargs
和mogrify
协同工作非常适合您,如下所示:
time find . -name \*.jpg -print0 | xargs -0 -I {} -n 100 -P 8 mogrify -resize 256x256 {}
real 0m20.840s
它允许多达8个mogrify
进程并行运行(-p8
),每个进程最多处理100个输入图像(-n100
),从而在大量文件上分摊启动进程的成本。我将使用GNU并行,这样可以充分利用所有这些核心:
find . -name \*.jpg | parallel -j 16 convert {} -resize 256x256 {}
如果文件较少,可以这样做,但命令行对于45000个文件来说太长:
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并行速度要快得多。不过,公平地说,这也浪费了资源,因为必须为每个输入文件创建一个新进程,而mogrify
只使用一个进程来处理所有文件。如果您知道这些文件是以特定的方式命名的,那么您可能能够更好地优化它们
最后,您可能会发现xargs
和mogrify
协同工作非常适合您,如下所示:
time find . -name \*.jpg -print0 | xargs -0 -I {} -n 100 -P 8 mogrify -resize 256x256 {}
real 0m20.840s
它允许多达8个mogrify
进程并行运行(-p8
),每个进程最多可以处理100个输入图像(-n100
),从而在大量文件上分摊启动进程的成本。谢谢。这对我来说非常有效@beerbajayCheers。Imagemagick是大多数“如何对大量图像执行X”问题的答案。谢谢。这对我来说非常有效@beerbajayCheers。Imagemagick是大多数“如何对大量图像执行X”问题的答案。