2

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

CImg看起来也是一个不错的选择,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 的帖子,我尝试了一下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
4

1 回答 1

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 张。

于 2015-05-28T10:39:33.437 回答