【问题标题】:Fastest C/C++ image resizing library [closed]最快的 C/C++ 图像大小调整库 [关闭]
【发布时间】:2010-10-26 19:34:45
【问题描述】:

我正在编写一个需要调整大量图像大小的应用程序......这是我的要求:

  • C/C++
  • 至少支持 jpeg/png
  • 快速
  • 跨平台

目前我的选择是:

  • OpenCV
  • CImg
  • ImageMagick
  • GraphicsMagick(据说速度很快)
  • 恶魔
  • 来自 Boost 的 GIL
  • CxImage
  • Imlib2(据说速度很快)
  • 还有其他人吗?

所有这些都可以完成工作,但我在这里寻找最快,我无法找到任何关于它们性能的基准。

【问题讨论】:

  • 调整大量图像(例如上个月的整个 flickr 上传)听起来像是一个高度专业化的应用程序,所以我想知道为什么跨平台如此重要?如果您可以依赖特定的硬件,您可能能够在扩展部分上走得如此之快,以至于您必须认真考虑如何以足够快的速度读取/写入所有数据。
  • “我无法找到任何基准”:您可以随时进行基准测试,然后在此处分享您的发现 :-)
  • @chris 我意识到这是一个老问题,但是使用通用 CPU 和本地磁盘上的图像调整大小几乎肯定会成为一个计算受限的问题。现在,如果您的意思是专门的(例如 CUDA)而不是特定的硬件,您可能能够使其 IO 绑定。

标签: c++ c image resize


【解决方案1】:

看看VIPS。这是迄今为止我发现的最快的,并且可以免费用于商业用途。

https://github.com/libvips/libvips/wiki/Speed-and-memory-use

在该基准测试中,它比 Pillow-SIMD 快 2 倍,比 imagemagick 快 5 倍,比 opencv 快 6 倍,比 freeimage 快 8 倍,等等。它的内存使用量也大大降低:例如,比 imagemagick 少 10 倍以上。

【讨论】:

【解决方案2】:

如果IPP 执行what you need(例如第 12 节中的 Resize 函数),那么我怀疑您会在其他任何地方找到明显更快的 x86 代码。请记住,在 AMD CPU 上运行时,它可能会退回到较慢的“参考实现”。

如果 CPU 不能满足您的性能要求,您可以考虑使用 OpenGL 将调整大小推送到 GPU(使用纹理映射的最简单实现将受益于硬件插值器,对于更复杂的过滤使用 GLSL 着色器代码)。 GPU 做这种事情的能力比 CPU 快一百倍(给或取零)必须与相对较慢的数据传输进出卡(通常每秒千兆字节或两千兆字节)进行权衡最多)。

【讨论】:

    【解决方案3】:

    @Chris Becke 的评论:

    “想一想那句话。在一个(复杂的)步骤中执行它的哪一部分会使其更快?图像解码例程仍然需要解码每个像素,以便过滤器例程过滤它们。”

    情况并非总是如此。例如,在解码 JPEG 时,您可以要求 JPEG 库为您提供 1/2、1/4、1/8 大小的图像(或类似的东西;我已经有一段时间没有详细看过了),它可以由于JPEG的工作方式,根本不需要解码额外的细节。它可以比完全解码 + 缩放快得多。

    (显然,如果较小的图像不是您想要的确切尺寸,您可能需要在之后稍微缩放。)

    (对不起,由于没有声誉,我只能将此回复作为评论发布。我第一次尝试在这里发布任何内容。如果有人想重新发布此或类似评论并删除我的答案,请随意! )

    【讨论】:

    • 有道理,缩放算法会在更多数据的情况下提供更好的结果(仅在某个小水平上没关系)但是你需要通过所有不同的压缩方法(BMP,GIF)工作,PNG,JPEG)并编写特定版本。
    • 我认为 JPEG 是唯一可以通过这种方式优化的格式。它的结构可以在完全解码之前分离不同级别的细节。
    • 分块工作也意味着您可以重叠解码和重新编码。例如,libvips(参见@bithive 的答案)将并行传输图像、运行解码、处理和重新编码。对于许多操作,解码/重新编码是一个单线程限速步骤,因此可以提供很大的加速。
    【解决方案4】:

    如果您正在寻找开源,那么 FreeImage 怎么样?对于商业内容,我使用 Snowbound。两者都非常快,并且能够支持多种不同的图像格式和大小调整算法。

    【讨论】:

    • FreeImage 公共许可证不阻止商业用途。
    【解决方案5】:

    如果您正在寻找免费的东西,并且想快速完成操作,请尝试开发一个 Gimp C 编译插件:这很容易,而且我认为 Gimp 在调整大小方面做得很好:

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

    看看there

    【讨论】:

    • 或者通过 Python 插件调用调整器。
    • Gimp 是一个 GUI。我认为问题是关于可以从 C/C++ 使用的库。我知道 Gimp 可以通过脚本进行控制,但这不会很快。
    • 您可能会认为它很慢,因为启动需要时间,但是使用 Gimp 调整大小非常快,如果您将其加载到内存中,也许这不是最快的,但它是免费的 并且非常快。自己测试你可能会感到惊讶;)
    【解决方案6】:

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

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

    【讨论】:

    • 如果图像被解码,IPP 是不错的选择。但是,通过单步解码和缩放可能会更快。不先解码1:1位图不知道怎么用IPP调整大小。
    • 想一想那句话。在一个(复杂的)步骤中完成它的哪一部分会使其更快?图像解码例程仍然需要解码每个像素,以便过滤器例程过滤它们。即使他们是一个一次性完成的库——我们对 IPP 例程的基准测试表明,使用 IPP 进行 2 遍可能会更快。
    • 可能是因为在第一次通过时它可以使用 cpu 缓存中已经存在的数据
    • @Chris:kcwu 可能是对的。我记得转换的手册页,其中包含参数 -size 的描述 - 以限制图像的解码分辨率,无论如何都要调整大小。来自手册页的粘贴:在此示例中,“-size 120x120”向 JPEG 解码器提示图像将被缩小到 120x120,从而避免返回全分辨率图像,从而使其运行得更快。跨度>
    • 如果图像很大,在内存中只需几条扫描线,一步完成可能会更快。 RAM 很慢,缓存也很小。
    猜你喜欢
    • 2010-11-14
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2013-04-08
    • 1970-01-01
    • 2018-05-18
    • 2012-06-23
    相关资源
    最近更新 更多