我需要每秒将许多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
答案 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张。