【问题标题】:C++ TIFF (raw) to JPEG : Faster than ImageMagick?C ++ TIFF(原始)到JPEG:比ImageMagick更快?
【发布时间】:2015-08-10 14:42:44
【问题描述】:

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

感谢马克的帖子,我试试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

【问题讨论】:

  • TIFF 图像有多大 - 以字节和像素为单位?除了转换为JPEG之外,您是否对图像进行任何其他处理?图像的下游会发生什么?他们来自哪里?你的代码目前是什么样子的?你目前取得了怎样的业绩?您需要什么性能?
  • 谢谢马克。图像为 3288x1152。除了转换它们之外没有其他处理。然后将图像存储到 HDD 中。原始数据来自相机(裁剪)。这就是code looks like 的方式。在一台测试机(四核)中,在 0.2 秒内转换一个图像。在投入生产之前,我需要改善这段时间(长话短说)。
  • 请问原始图像的大小是多少?
  • 每个文件大约 15MB。
  • 您希望输出的 JPEG 质量级别是多少? JPEG 是否应该与 TIFF 具有相同的尺寸(我假设是)?是否所有 TIFF 都具有相同的尺寸?

标签: imagemagick jpeg tiff vips


【解决方案1】:

我有一些想法......

想法1

如果您的输入图像为 15MB,而输出图像为 1MB,则您已经在使用 80MB/s 的磁盘带宽来每秒处理 5 个图像 - 这已经是智能磁盘可能的 50% 左右支持。我会使用 RAMdisk 做一个小实验,看看是否有帮助,或者如果你有 SSD,我会做一个 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 张。

【讨论】:

  • 大家好,我是vips维护者,im_vips2jpeg是老vips7界面。试试time vips copy input.tif output.jpg,新的vips8语法,应该会快一点。
  • 您好,感谢您的意见 - 速度有点快。我已经相应地编辑了我的帖子。
  • @MarkSetchell:谢谢。是的,我测试它的方式是:time convert input.tiff -quality 95% output.jpg 我比较了我在 C++ 中编译的版本与 IM 二进制文件,时间几乎相同。
  • 关于“GNU Parallel”,我在我的应用程序中使用 boots::thread。技术上应该相似还是不相似?或许我应该提一下,在生产中,我们将使用 4 核(8 线程)的 Xeon E3-1271V3 来同时处理 4 个摄像头,存储在 4 个 HDD 上。我正在使用 RAMdisk 存储 TIFF 文件(放置在 /tmp/,因为 IM 也使用它来放置临时数据)以在它们达到 HDD 带宽之前将它们转换为 JPG。我所有的测试和数字似乎都还可以,但是我还没有测试那个处理器,这就是为什么我不能确保能够尽可能快地转换它们。我会测试VIPS
  • @lepe 我给你做了一个示例程序gist.github.com/jcupitt/279ac81956b864e03e6c VIPS C++ 文档在这里vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/… 如果你有问题,请在 vips 跟踪器上打开一个问题
猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2021-10-28
  • 2011-11-07
相关资源
最近更新 更多