0

这是我目前在我的应用程序中加载图像的方法:

auto b = ::FreeImage_Load(type, path.c_str());
void *bits;

auto hbmp = CreateDIBSection(
    dc,
    FreeImage_GetInfo(bitmap),
    DIB_RGB_COLORS,
    &bits,
    0,
    0
);

std::memcpy(bits, FreeImage_GetBits(b), size);

它工作得很好,但我想避免两次分配内存 -::FreeImage_Load已经以适合 dib 的方式存储数据。有没有一种调用方式CreateDIBSection可以阻止分配并强制以这种方式创建的 dib 使用我提供的缓冲区?如果没有,是否有另一种方法可以做到这一点?

似乎提供NULL而不是**ppvBits阻止分配 - 以后有没有办法修改缓冲区地址?我也尝试过修改hSection参数,但以这种方式创建的 dib 不正确。

4

1 回答 1

0

我想我没有弄错你的想法。

也许您可以使用CreateDIBitmapFreeImage图像转换为HBITMAP.

FIBITMAP *dib = FreeImage_Load(type, path.c_str());
// ...
HBITMAP bitmap = CreateDIBitmap(hDC, FreeImage_GetInfoHeader(dib),

CBM_INIT, FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);

// ...
FreeImage_Unload(dib);

相关链接:如何将 FreeImage 图像转换为 HBITMAP ?

如果要使用CreateDIBSection,可以使用非空hSection参数并使用CreateFileMappingandMapViewOfFileEx()来创建该部分,后者lpBaseAddress应该指向您的位。

请记住完全初始化 和 中的MapViewOfFileEx参数CreateFileMapping

这里有一个类似的讨论,你可以参考:How to create an HBITMAP wrapping an existing byte buffer?

于 2019-06-21T07:57:09.350 回答