如何使用ImageMagick提高裁剪图像的性能?

问题描述 投票:2回答:2
convert image.png -crop 256x256 +repage +adjoin out_%d.png

需要大图像20000x8000 aprox 114秒。 (生成约4000 256x256个png)

是否有任何imagemagick选项来提高裁剪速度?

imagemagick crop imagemagick-convert graphicsmagick
2个回答
2
投票

如果您的原始图像具有8位样本,您可以做的一件事是确保使用ImageMagick的“Q8”版本而不是默认的“Q16”。每个像素占用8个字节(16位R,G,B,A),即使它只是一个黑白图。使用Q8减少了一半。您可以使用“-limit”选项更改行为,以使用更多内存而不是光盘。

-limit选项在ImageMagick的“选项”文档中进行了描述。

您可以使用“-quality 1”选择仅霍夫曼压缩和“子”PNG过滤器来提高PNG压缩的速度。如果您知道图像的颜色少于256种,则“ - 质量0”可能更有效(消耗的时间大致相同,但生成的文件会更小)。


1
投票

你也可以考虑libvips。它可以快速完成这种操作,而不需要占用太多内存。

我试过一个基准。在这台机器上有一个20,000 x 8,000像素的RGB PNG(四核/八线程i7)。我知道了:

$ vipsheader big.png 
big.png: 20000x8000 uchar, 3 bands, srgb, pngload
$ /usr/bin/time -f %M:%e convert big.png -crop 256x256 +repage +adjoin out_%d.png
2582228:61.78
$ echo out* | wc
      1    2528   31754

%M:%e表示显示峰值内存和经过的时间,因此2.5GB的RAM和62s的实时时间可以制作2528个PNG图块。

libvips有一个名为dzsave(DeepZoom save)的命令,可以并行编写一组tile,并将流式传输图像而不是将整个内容加载到内存中。通过几个选项,您可以使其生成与convert命令相同的输出。

我知道了:

$ /usr/bin/time -f %M:%e vips dzsave big.png x --depth one --tile-size 256 --overlap 0 --suffix .png
161952:9.20
$ echo x_files/0/*.png | wc
      1    2528   49450

所以161mb的ram和9.2s的实时制作相同的2528个文件。

有关dzsave的文档中有一章解释如何使用它:

https://libvips.github.io/libvips/API/current/Making-image-pyramids.md.html

正如格伦所说,大部分时间花在PNG编码和解码上。 libpng非常慢,它使用deflate压缩,这甚至更慢。如果你切换到TIFF,它会更快:

$ /usr/bin/time -f %M:%e vips dzsave big.tif x --depth one --tile-size 256 --overlap 0 --suffix .tif
163476:1.34

现在只有1.34秒。 JPG会更快(因为会有更少的IO),但我想这对于平面图来说效果不佳。

© www.soinside.com 2019 - 2024. All rights reserved.