2009-05-17 110 views
18

我写一个需要调整图像的大量的一个应用程序......这些都是我的要求:最快的C/C++图像缩放库

  • C/C++
  • 支持JPEG/PNG至少
  • 快速
  • 跨平台

到目前为止,我的选择是:

  • OpenCV的
  • CIMG
  • ImageMagick的
  • GraphicsMagick工具(有人说是快)
  • 魔鬼
  • 从升压
  • CxImage的
  • Imlib2(有人说是快)
  • GIL
  • 其他?

所有这些将会把工作做好,但我期待的最快在这里,我是不是能够找到他们的任何性能基准。

+10

调整大量的图片(例如上个月的整个flickr上传)大量的图像听起来像是一个高度专业化的应用程序,所以我想知道为什么跨平台如此重要?如果你可以依靠特定的硬件,那么你可能能够在缩放部分上如此之快,以至于你不得不认真思考如何快速读取/写入所有数据。 – Chris 2009-05-17 06:27:46

+1

“我无法找到任何基准测试”:您可以随时替补,自己评估它们,然后在此分享您的发现:-) – lothar 2009-05-18 17:06:03

+0

@chris我意识到这是一个老问题,但带有通用CPU和本地映像磁盘大小调整几乎肯定会成为一个计算边界问题。现在,如果您的意思是专门的(例如CUDA),而不是特定的硬件,您可以将其设为IO绑定。 – Yaur 2013-03-19 20:47:59

回答

13

看看Intel IPP (Integrated Performance Primitives)(维基链接比英特尔更好......)它也适用于AMD,并具有调整图像大小(双线性,最近邻居等)的功能,适用于Linux和Windows。

它不是免费的(但它不会破坏银行),但它是你能找到的最快的。

+1

如果图像被解码,IPP是不错的选择。但是,单步解码和缩放可能会更快。我不知道如何在不解码1:1位图的情况下使用IPP来调整尺寸。 – kcwu 2009-05-17 07:08:18

+2

想了一下那个声明。在一个单一的(复杂的)步骤中做什么的一部分会使它更快?图像解码例程仍然需要对每个像素进行解码,以便过滤器例程对其进行过滤。即使他们是一次通过的图书馆 - 我们对IPP例程的基准测试表明,IPP 2pass可能会更快。 – 2009-05-17 07:41:27

+0

也许是因为在第一遍时它可以使用已经在cpu缓存中的数据 – CiNN 2009-05-17 23:18:30

0

如果您正在寻找免费的东西,并希望很快做的事情,尝试开发一个瘸子C-编译插件:这是很容易的,我认为瘸子做得很好,在调整:

这可能不是最快调整大小,但最便宜(免费)和最快的开发

看一看there

+0

或者通过Python插件调用resizer。 – 2009-07-13 08:13:22

+0

Gimp是一个GUI。我认为这个问题是关于一个可以在C/C++中使用的库。我知道Gimp可以通过脚本进行控制,但这不会很快。 – guettli 2011-09-22 07:32:03

+0

你可能会认为它的启动时间很慢,但使用Gimp调整速度非常快,如果你将它加载到内存中,也许这不是最快的,但它是免费的**和**速度非常快。自己测试你可能会感到惊讶;) – 2011-09-23 17:19:04

0

如果你正在寻找开源,FreeImage怎么样?对于商业用途,我使用Snowbound。两者都非常快速,并且具有许多不同的图像格式和调整算法的能力。

+1

FreeImage Public License不会阻止商业用途。 – darklon 2012-04-03 04:58:11

4

@克里斯贝克的评论:?

“认为只是一个有关声明时刻哪一部分在单(复杂)的步骤做的是要让它得更快的图像解码程序仍然需要解码每个像素以便过滤器例程对其进行过滤。“

情况并非总是如此。例如,在解码JPEG时,您可以要求JPEG库为您提供1/2,1/4,1/8大小的图像(或类似的东西;这是一段时间,因为我详细查看了它),它可以由于JPEG的工作原理,根本不需要解码额外的细节。它可以比完整的解码+比例更快。

(很明显,你可能需要事后缩放位,如果较小的图像是不是你想要的确切大小。)

(对不起,我只能发布此回复作为注释由于没有reputaton。第一次我试着在这里发表任何东西。如果有人想重新发布这个或作为注释类似的东西删除我的回答,请随时!)

+0

有意义的是,缩放算法会给更好的结果提供更多的数据(只有在某个小的层次上它并不重要),但是再次需要通过所有不同的压缩方法(BMP,GIF,PNG,JPEG)和写入一个特定的版本。 – 2009-05-18 06:20:58

+0

我认为JPEG是唯一可以这种方式进行优化的格式。它的结构使得不同级别的细节可以在完全解码之前分开。 – 2013-08-26 18:48:32

+0

分块工作还意味着您可以重叠解码和重新编码。例如,libvips(请参阅@ bithive的答案)将流式传输图像,并行运行解码,处理和重新编码。对于许多操作,解码/重新编码是一个单线程速率限制步骤,所以这可以提供很大的加速。 – user894763 2015-05-14 13:49:41

5

如果IPP确实what you need(例如,调整尺寸功能在第12节),那么我怀疑您会在其他任何地方找到速度更快的x86代码。请记住,在AMD CPU上运行时,它可能会回落到较慢的“参考实现”上。如果CPU不符合您的性能要求,您可以考虑使用OpenGL将调整大小推送到GPU上(使用纹理映射的最简单实现将受益于硬件插值器,对于更复杂的滤波使用GLSL着色器代码)。 GPU对于比CPU快上百倍的速度(给出或取零)的能力必须权衡卡与卡之间的相对较慢的数据传输量(通常是每秒十亿字节或每秒两千字节至多,最多)。

9

看看VIPS。这是迄今为止我发现的最快的一个。

+0

我自己没有使用过VIPS。但它似乎很快(和LGPL):http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use – guettli 2011-09-22 07:29:38