调整大量图像文件大小的简单方法
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
只使用一个处理所有文件的进程。如果您知道这些文件是以特定方式命名的,您可能能够更好地优化事情...
最后,您可能会发现 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
),从而分摊在大量文件上启动进程的成本。
我有一个包含大约 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
只使用一个处理所有文件的进程。如果您知道这些文件是以特定方式命名的,您可能能够更好地优化事情...
最后,您可能会发现 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
),从而分摊在大量文件上启动进程的成本。