使用 ImageMagick 加速缩小大型 JPEG 图像的大小

问题描述

我有一个非常大的 JPEG 图像 (10800x7497),我想将其缩小到其分辨率的 50%。我已经使用 -define jpeg:colors=64 将图像颜色减少到 64 色,但是当我尝试调整图像大小时,ImageMagick 需要很长时间来处理图像,可能需要 20 分钟或更长时间(因为我在没有输出时停止了该过程图像在 20 分钟内保存,尽管任务管理器显示 ImageMagick 正在处理图像)。如何加快调整此大图像的大小?我已经尝试了以下代码,但仍然需要太长时间:

magick -define jpeg:size=10800x7500 "image1.jpg" -resize 5400x3750 "image1-resized.jpg"

magick -define jpeg:size=5400x3750 "image1.jpg" -resize 5400x3750 "image1-resized.jpg"

magick -depth 5 "image1.jpg" -resize 50% "image1-resized.jpg"

解决方法

听起来您的 imagemagick 正在交换到光盘。您可能需要调整您的 policy.xml

这是包含内存量和允许使用的磁盘魔法限制的文件。 magick docs have some notes,但请检查 /etc/ImageMagick-7/policy.xml 并查看诸如:

之类的行
  <policy domain="resource" name="memory" value="256MiB"/>

256mb 内存使用量太小了 -- 将其更改为:

  <policy domain="resource" name="memory" value="8GiB"/>

您会看到很多其他类似的线条,请调整它们以适合您的硬件。

我会简单地使用 resize-define 提示将打开 jpeg 加载时收缩,这会降低质量并导致(可能)明显的莫尔条纹。此外,缩小 50% 也不会带来速度优势。

$ identify big.jpg
big.jpg JPEG 10800x7497 10800x7497+0+0 8-bit sRGB 13.4733MiB 0.000u 0:00.000
$ /usr/bin/time -f %M:%e convert big.jpg -resize 5400x3750 x.jpg
1130340:0.92

使用 imagemagick6 需要 0.92s 和 1.1gb 的内存。 imagemagick7 通常大约是速度的一半和内存使用量的两倍,所以我预计大约 2 秒和 2GB。

正如马克所说,vipsthumbnail 可能会更快。我看到了:

$ /usr/bin/time -f %M:%e vipsthumbnail big.jpg -s 5400 -o x.jpg
295460:0.69

所以 300mb 的内存和 0.7 秒。这台 PC 的内核数量很愚蠢(32!),而且您真的无法从基本的 JPEG 收缩中获得那么多的并行性,因此如果您减少线程数量,您会看到有用的加速和更低的内存使用:

$ /usr/bin/time -f %M:%e vipsthumbnail big.jpg -s 5400 -o x.jpg --vips-concurrency=3
77744:0.43

78mb 内存和 0.43 秒。