这是我当前在应用程序中加载图像的方法:
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是不正确的。
答案 0 :(得分:0)
我想我没有弄错你的想法。
也许您可以使用CreateDIBitmap
将FreeImage
图像转换为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
参数,并使用CreateFileMapping
和MapViewOfFileEx()
创建节,后者是{{1 }}应该指向您的位。
记住要完全初始化lpBaseAddress
和MapViewOfFileEx
中的参数。
以下是您可以参考的类似讨论:How to create an HBITMAP wrapping an existing byte buffer?