你没有说你是如何进行收缩的,但如果你正在调整 JPEG 图像的大小,你必须使用 libjpeg 加载时收缩以获得良好的性能。
例如,在这台机器 (2012 imac) 上,我看到 10,000 x 10,000 像素 RGB jpeg 图像和 IM 7.0.5-5:
$ /usr/bin/time -l convert wtc.jpg -resize 500x500 x.jpg
6.87 real 6.06 user 0.51 sys
1269547008 maximum resident set size
大约 7s 和 1.2GB 内存。如果我使用加载时收缩,你会提示 jpeg 加载器你需要什么像素尺寸,我看到:
$ /usr/bin/time -l convert -define jpeg:size=1000x1000 wtc.jpg -resize 500x500 x.jpg
0.32 real 0.27 user 0.02 sys
34181120 maximum resident set size
低至 0.3 秒和 34MB 内存。
这仅适用于 JPEG 文件,但它确实有很大帮助。您需要提示两倍于最终输出的大小,否则您会看到锯齿。
要提高其他文件类型的性能,您需要查看其他图像大小调整程序。我帮助维护libvips,一个流式图像处理库。它可以作为连续的像素流进行解码、处理和重新编码,因此不需要将整个图像保存在内存中。
使用 30,000 x 30,000 JPEG 和 转换,我明白了:
$ /usr/bin/time -l convert -define jpeg:size=1000x1000 big.jpg -resize 500x500 x.jpg
3.08 real 2.92 user 0.14 sys
300138496 maximum resident set size
3.1s 和 300MB 内存,但使用 vipsthumbnail 我明白了:
$ /usr/bin/time -l vipsthumbnail big.jpg --size 500x500 -o x.jpg
2.38 real 2.31 user 0.06 sys
28385280 maximum resident set size
2.4s 和 28MB 内存。
对于没有加载收缩系统的 TIFF 等格式,差异会变得更大。我看到了 10,000 x 10,000 RGB TIFF:
$ /usr/bin/time -l convert wtc.tif -resize 500x500 x.jpg
5.81 real 4.97 user 0.60 sys
1503449088 maximum resident set size
5.8s 和 1.5GB 内存,对比:
$ /usr/bin/time -l vipsthumbnail wtc.tif --size 500x500 -o x.jpg
1.43 real 0.47 user 0.08 sys
42360832 maximum resident set size
1.4s 和 42MB 内存。
有一个非常不错的 node.js 图像调整包,名为 sharp,它基于 libvips,应该部署在 lambda 上,或者如果你想使用 Java 的命令行 vipsthumbnail 程序,有各种构建器,例如:
https://github.com/stechstudio/libvips-lambda
这里有一篇介绍vipsthumbnail的博文:
https://libvips.github.io/libvips/API/current/Using-vipsthumbnail.md.html