Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 调整大量图像文件大小的简单方法_Shell_Image Processing_Python Imaging Library - Fatal编程技术网

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

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 这将修改所有在位文件,将其大小调整为

我有一个文件夹,其中包含大约45000个jpeg图像。其中大多数是10KB-20Kb。
现在,我想编写一个脚本,将它们全部调整为固定大小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”问题的答案。