【问题标题】:Speed up reducing size of large JPEG image using ImageMagick使用 ImageMagick 加快缩小大型 JPEG 图像的大小
【发布时间】:2021-04-13 03:42:02
【问题描述】:

我有一个非常大的 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"

【问题讨论】:

  • 尝试运行magick identify -version 以查看您是否有 Q8 或 Q16。如果您有 Q16,您可以尝试安装/构建 Q8 版本以减少内存压力。如果您有可用的 SSD 和 NTFS 文件系统,您可以将 ImageMagick 临时路径环境变量指向它以加快磁盘访问速度。
  • 或者您可以安装 libvips 并可能在很短的时间内完成。
  • 在我的 PC (Core I5) 上调整大小(充满随机噪声)在 6 CPU 秒(使用 SSD 时经过 10 秒)内运行的图像大小。即使在慢速磁盘上交换,20 分钟也很多。您的系统监视器对 IM 进程有何看法?什么记忆?输入/输出率?什么是磁盘活动?请注意,减少输出大小的最佳方法是模糊图像,据我所知,减少颜色计数会增加最终大小。您还可以更改压缩质量和色度二次采样。
  • 如果你想尝试使用libvips,你可以使用vipsthumbnail big.jpg -s 5400 -o small.jpg,它在我的机器上使用了220MB的峰值内存,而ImageMagick使用了近2GB和1.6s而不是6 秒。
  • 检查您的 Imagemagick RAM 资源并在 policy.xml 文件中增加它们。

标签: command-line imagemagick image-resizing imagemagick-convert


【解决方案1】:

听起来您的 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 通常是一半的速度和两倍的内存使用,所以我预计大约 2s 和 2GB。

正如 Mark 所说,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 秒。

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2017-10-14
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多