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

时间:2015-05-28 08:05:18

标签: imagemagick jpeg tiff vips

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

CImg看起来也是一个不错的选择,GraphicsMagick声称比ImageMagic更快。我还没有对其中任何一个进行过测试,但我想知道是否还有其他替代品可能比使用ImageMagick Q8更快?

我正在寻找仅限Linux的解决方案。

UPDATE width GraphicsMagick& ImageMagick Q8

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

我用Q8成功编译了GraphicsMagick,但毕竟它似乎比ImageMagick慢了30%(0.3秒)。

用Q8编译ImageMagick后,增益约为25%(0.15秒)。尼斯:)

UPDATE width VIPS

感谢Mark的帖子,我试试了VIPS。使用Ubuntu Trusty存储库中的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 个答案:

答案 0 :(得分:3)

我有几点想法......

思想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

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

例如,在这里,我按顺序处理如上创建的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张。