convert image.png -crop 256x256 +repage +adjoin out_%d.png
需要大图像20000x8000 aprox 114秒。 (生成约4000 256x256个png)
是否有任何imagemagick选项可以提高裁剪速度?
答案 0 :(得分:2)
如果您的原始图像具有8位样本,您可以做的一件事是确保使用ImageMagick的“Q8”版本而不是默认的“Q16”。每个像素占用8个字节(16位R,G,B,A),即使它只是一个黑白图。使用Q8减少了一半。您可以使用“-limit”选项更改行为,以使用更多内存而不是光盘。
-limit选项在“options”文档中描述 ImageMagick的。
使用“-quality 1”选择仅霍夫曼压缩和“子”PNG滤波器,可以提高PNG压缩的速度。如果您知道图像的颜色少于256种,则“ - 质量0”可能更有效(消耗的时间大致相同,但生成的文件会更小)。
答案 1 :(得分: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保存),该命令可以并行编写一组图块,并且将流式传输图像而不是将整个内容加载到内存中。通过两个选项,您可以使其产生与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
正如Glenn所说,大多数时间都花在了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会更少),但我想这对于平面图而言效果不佳。