3

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

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

我的问题是太慢了(~1920X1080 为 250 毫秒)。这需要 3X 保存为 JPG 的时间,大约 9X 保存为 BMP 的时间。

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

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

Java 库可以很快地做到这一点,但出于某种原因,微软的库就像乌龟一样慢。

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

4

2 回答 2

1

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

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

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

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

于 2012-07-30T02:18:30.833 回答
0

It's very easy to compile libpng yourself. I just did it myself before typing this resposne out. It took about 90 seconds.

  1. Download zlib from http://zlib.net/ Either in source or precompiled form such that you have zlib.h

  2. Download libpng from http://sourceforge.net/projects/libpng/files/libpng15/1.5.12/lpng1512.zip/download

  3. Unzip the contents of libpng zip file.

  4. Open a command shell.

  5. "cd /d d:\projects\libpng" (cd into whatever directory you just unzipped the libpng sources from)

  6. "copy scripts\libpng.h.prebuilt libpng.h"

  7. Create a new Visual Studio C++ project (static library) in the libpng directory

  8. Add all the *.c files from the libpng directory to the project

  9. Add your zlib project directory to the project's include path. (Wherever it can find zlib.h)

  10. Build your project. It should compile the png code library just fine. Done.

于 2012-07-29T23:56:34.050 回答