快速JPEG编码库

11

有没有人知道一个免费的开源JPEG编码库适用于C/C++?目前我正在使用ImageMagick,它很容易使用,但速度比较慢。我将它与Intel Performance Primitives评估进行了比较,并且IPP的速度非常快。不幸的是,它也需要花费200美元,而我只需要其中的1%。此外,它只能在Intel上快速运行。

有人做过什么测试吗?还有其他比ImageMagick更快的好库吗?

编辑:我正在使用8位版本的ImageMagick,应该会更快。


1
“慢”到底是什么意思?你能给出具体的数字吗? - lothar
目前为止还不清楚。我只知道当我让它编码一堆图片时,它的 CPU 使用率是多少。我会说 IPP 快了一个数量级。但我正在努力获取一些真实的数据。 - Budric
JPEG解码速度分析 http://www.briancbecker.com/blog/2010/analysis-of-jpeg-decoding-speeds/ - Gabriel
7个回答

7

我在我的维基上添加了一篇文章,介绍如何为各种架构构建它: http://www.virtualgl.org/DeveloperInfo/Libjpeg - DRC

3

我相信 Boost 中的 GIL 库包含一种将图像数据保存为 JPEG 格式的方法。我不知道它的速度如何,但考虑到该库是由 Adobe 赞助的,我认为做得非常好。


谢谢,虽然我使用boost,但我错过了那个。 - Budric
我不确定,但是GIL使用libjpeg来解码和编码JPEG,所以这里重要的是libjpeg的性能。 - Qubeuc
GIL是一个通用的图像处理库,它本身不实现任何I/O和压缩操作。正如Qubeuc所提到的,它依赖于第三方库。目前,GIL IO扩展已经针对使用libjpeg的JPEG和使用libpng的PNG进行了实现。也许TIFF(libtiff)也是可用的,但我不确定。 - mloskot

3

AMD提供Framewave,这是一个开源的IPP替代品。


从简要查看API来看,它似乎提供了JPEG的基础功能,如DCT变换,但我没有看到实际的写入函数可以给我一个有效的JPEG图像。你用过它吗?你能指点我正确的函数吗? - Budric
2
与IPP一样,Framewave是一个“可链式”的代码库,而不是完整的工具函数。您需要自己编写/读取二进制数据。话虽如此,在这里可以使用IPP来读写JPEG:http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-code-samplesFramewave与IPP“API兼容”,因此只需使用Framewave调用替换IPP调用即可。这些调用使用相同的命名,只是前缀不同(fwiEncodeHuffman8x8_JPEG_16s1u_C1与ippiEncodeHuffman8x8_JPEG_16s1u_C1)。 - Tobiesque

2

ImageMagick使用libjpeg(也称为独立JPEG组库)。如果您改进了libjpeg的速度,ImageMagick JPEG的速度将会提高。

有几个选项:

  1. 编译优化的libjpeg。如果您有现代gcc和至少Pentium 4,可以尝试-O3 -msse2并查看是否可以提高速度。然后,您可以使用LD_LIBRARY_PATH或其他一些方法加载您的libjpeg而不是系统的libjpeg。
  2. 尝试使用libjpeg-mmx。它已经没有维护,并且据说存在漏洞和安全问题,但在某些情况下可能会提高速度。

3
libjpeg-turbo非常稳定,现在大多数浏览器都在使用。不要费心使用IJG libjpeg。 - Lilith River

1

我对512x512的jpeg图像进行了一些时间编码,使用了100%的质量(我知道100%不是无损的)。基本上,ImageMagick只比libjpeg稍微慢一点。对于100张图片,差异大约在十分之一秒左右。然后我得到了带有SIMD扩展的libjpeg(http://cetus.sakura.ne.jp/softlab/jpeg-x86simd/jpegsimd.html#source),速度快了6-10倍。请注意,这实际上取决于图像的类型。黑色很多的图像非常快,到处都是细节的图像非常慢 - 我认为这是编码算法的问题。我可能需要尝试一下libjpeg-mmx,因为它看起来比我得到的日本版本更受关注,而且我甚至不知道许可证是什么。

我还尝试过让Framewave工作,但甚至无法启动它。头文件缺少某些结构的定义,论坛提供的支持绝对没有任何帮助。我简直不敢相信它是“由AMD赞助”的。


1

如果你四处寻找,可能会找到旧版本的英特尔JPEG库。它不是开源的,但速度很快。它足够快,可以在733MHz的P-III上获得25fps。


1
很遗憾,我不能做到。每个人都参考英特尔,但英特尔当然不再提供它了。如果你有链接,我想要它。 - Budric

1

还有独立JPEG组,它相当古老,我不能保证它的速度。但应该是稳定的。

通过此页面找到。


那就是我们使用的。对于我们使用它的目的来说,它完全可以胜任。 - David Thornley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接