C++ TIFF(原始)到 JPEG:比 ImageMagick 快?

C++ TIFF (raw) to JPEG : Faster than ImageMagick?

我需要每秒将许多 TIFF 图像转换为 JPEG。目前我正在使用 libmagick++ (Q16)。我正在编译 ImageMagick Q8,因为我读到它可能会提高性能(特别是因为我只使用 8 位图像)。

CImg also looks like a good option and GraphicsMagick 声称比 ImageMagic 更快。我还没有测试过其中任何一个,但我想知道是否有任何其他替代方法可以比使用 ImageMagick Q8 更快?

我正在寻找 Linux 唯一的解决方案。

更新宽度 GraphicsMagick 和 ImageMagick Q8

碱基比较(参见对 Mark 的评论):使用 ImageMagick Q16 时 0.2 秒

我用Q8成功编译了GraphicsMagick,但毕竟比ImageMagick慢了30%左右(0.3秒)

用Q8编译ImageMagick后,有大约25%(0.15秒)的增益。不错:)

更新宽度 VIPS

感谢 Mark 的 post,我试了一下 VIPS。使用 Ubuntu 可信存储库中的 7.38 版本:

time vips copy input.tiff output.jpg[Q=95]

real    0m0.105s
user    0m0.130s
sys     0m0.038s

非常好:)

我也试过 7.42(来自 ppa:dhor/myway),但它似乎有点慢:

real    0m0.134s
user    0m0.168s
sys     0m0.039s

我会尝试从源代码编译 VIPS,看看我是否能赶上那个时候。干得好马克!

更新:VIPS 8.0

从源代码编译,vips-8.0 获得与 7.38 几乎相同的性能:

real    0m0.100s
user    0m0.137s
sys     0m0.031s

配置命令:

./configure CC=c99 CFLAGS=-O2 --without-magick --without-OpenEXR --without-openslide --without-matio --without-cfitsio --without-libwebp --without-pangoft2 --without-zip --without-png --without-python

我有几点想法...

想法 1

如果您的输入图像是 15MB,并且为了论证,您的输出图像是 1MB,那么您已经使用 80MB/s 的磁盘带宽每秒处理 5 张图像——这已经是合理速度的 50% 左右磁盘可能会持续。我会做一个小实验,使用 RAMdisk 看看是否有帮助,或者如果你有一个 SSD。

想法 2

尝试从命令行使用 VIPS 来转换图像。我这样对它进行了基准测试:

# Create dummy input image with ImageMagick
convert -size 3288x1152! xc:gray +noise gaussian -depth 8 input.tif 

# Check it out
ls -lrt
-rw-r--r--@ 1 mark  staff  11372808 28 May 11:36 input.tif

identify input.tif
input.tif TIFF 3288x1152 3288x1152+0+0 8-bit sRGB 11.37MB 0.000u 0:00.000

使用 ImageMagick 转换为 JPEG

time convert input.tif output.jpg
real    0m0.409s
user    0m0.330s
sys     0m0.046s

使用 VIPS 转换为 JPEG

time vips copy input.tif output.jpg
real    0m0.218s
user    0m0.169s
sys     0m0.036s

嗯,好像快了点。当然是YMMV。

想法 3

根据您对磁盘速度的测试结果,如果您的磁盘不是限制因素,请考虑使用 GNU Parallel 一次处理多个图像(如果您有四核 CPU)。它使用起来非常简单,而且我一直都用它取得了很好的效果。

例如,这里我依次处理了32张如上创建的TIFF图像:

time for i in {0..31} ; do convert input-$i.tif output-$i.jpg; done
real    0m11.565s
user    0m10.571s
sys     0m0.862s

现在,我用 GNU Parallel 做同样的事情,一次并行 16 个

time parallel -j16 convert {} {.}.jpg ::: *tif
real    0m2.458s
user    0m15.773s
sys     0m1.734s

所以,现在是每秒 13 张图片,而不是每秒 2.7 张。