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