创建与设备无关的位图,而无需分配内存

时间:2019-06-21 02:21:05

标签: winapi gdi freeimage hbitmap

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

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参数,但是以这种方式创建的dibs是不正确的。

1 个答案:

答案 0 :(得分: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);

相关链接:How do I convert a FreeImage image to a HBITMAP ?

如果您想使用CreateDIBSection,则可以使用非空hSection参数,并使用CreateFileMappingMapViewOfFileEx()创建节,后者是{{1 }}应该指向您的位。

记住要完全初始化lpBaseAddressMapViewOfFileEx中的参数。

以下是您可以参考的类似讨论:How to create an HBITMAP wrapping an existing byte buffer?