【问题标题】:Saving BMPs as PNGs with C++ (VS 2010) FAST使用 C++ (VS 2010) FAST 将 BMP 保存为 PNG
【发布时间】:2023-03-15 14:07:01
【问题描述】:

我需要获取内存中的 BMP(存储为 HBITMAP 或 CImage,任你选择),并将其保存到磁盘上的 PNG 文件中。

这是我目前将图像保存为 png 的方式。 CImage img; img.Save("foo.png")

我的问题是太慢了(~1920X1080 需要 250 毫秒)。保存为 JPG 的时间是 3 倍,另存为 BMP 的时间是 9 倍左右。

我知道有很多用于 linux 的 g++ 库(例如 libpng)可以做到这一点,但是大多数支持 Visual Studio 的库只支持版本 6,而且我还没有找到具有基准的库,所以我我有点犹豫是否要让这些库运行,结果发现它们太慢了。

我不确定使用哪种类型的编码器窗口(它隐藏在 DLL 中),但肯定有更快的(我什至愿意牺牲一点磁盘大小,最多是两倍)。

Java 库执行此操作非常快,但出于某种原因,Microsoft 的库速度慢得像乌龟。

所以我想知道我有哪些选项可以在大约 100 毫秒内将屏幕大小的 PNG 保存到磁盘?

【问题讨论】:

  • 您可以使用设置为无损质量的 4:4:4(无色彩损失)JPG 编码器吗?
  • 是的,Microsoft 库中是否有一个内置的,可以很容易地从 HBITMAP/CImage 创建?
  • 我不知道有哪一个在我的脑海中,但我把它扔在那里以防你不必要地限制你的搜索空间,假设你有png。基于 DCT 的图像编码算法(jpg 等)具有一些出色的数据并行方面,并且可以通过 SSE 指令很好地加速,所以我认为您也应该注意体面的无损 JPG 代码。
  • 这是一些无损 jpeg 聊天:stackoverflow.com/questions/7895697/…

标签: c++ visual-studio-2010 encoding png libpng


【解决方案1】:

我敢打赌(但我没有基准)libpng 是最好的选择。

至少,我会寻找一个允许调整保存选项的库(CImage 没有)。有两个相关选项可供尝试:

  1. Zlib 压缩级别 (0-9):典型的默认值 (6) 通常没问题,使用较少的压缩很少会获得很大的速度

  2. Filter type。这可能更重要。如果我们想优化速度,我会预先选择一个独特的过滤器(通常是 PNG_FILTER_PAETH)。

【讨论】:

  • PNG_FILTER_NONE 是最快的,通常最适合颜色数量有限的图像。 PNG_FILTER_PAETH 的编码和解码速度较慢,但​​可以更好地压缩自然图像。
【解决方案2】:

自己编译 libpng 非常容易。在输入此响应之前,我只是自己做了。大约需要 90 秒。

  1. http://zlib.net/ 下载 zlib 源代码或预编译形式,以便您拥有 zlib.h

  2. http://sourceforge.net/projects/libpng/files/libpng15/1.5.12/lpng1512.zip/download下载libpng

  3. 解压libpng zip文件的内容。

  4. 打开命令外壳。

  5. “cd /d d:\projects\libpng”(cd 到您刚刚解压缩 libpng 源的任何目录)

  6. “复制脚本\libpng.h.prebuilt libpng.h”

  7. 在libpng目录下新建Visual Studio C++工程(静态库)

  8. 将libpng目录下的所有*.c文件添加到项目中

  9. 将您的 zlib 项目目录添加到项目的包含路径中。 (只要能找到zlib.h)

  10. 构建您的项目。它应该可以很好地编译 png 代码库。完成。

【讨论】:

  • 感谢您的帮助,但我不想弄清楚如何将 HBITMAP/CImages 转换为 libpng 接受的格式,除非我确定它会更快。
  • @JohnWalters - 只有一种方法可以确定 libpng 是否比 GDI+ 快...
  • 很抱歉,如果我表现得粗鲁,我很快就会有截止日期,我认为可能有另一个微软库可以做到这一点,或者至少是一个基准库,我相信你的步骤会有所帮助其他人在谷歌上搜索这个问题并且有更多的时间:)。
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2018-12-09
  • 2010-11-06
  • 2011-04-26
  • 2020-06-25
  • 1970-01-01
  • 2022-12-12
相关资源
最近更新 更多