Win32 C / C ++从内存缓冲区加载映像

我想在Win32应用程序中加载一个图像(.bmp)文件,但是我不想从Windows API使用标准的LoadBitmap / LoadImage:我想从已经在内存中的缓冲区加载它。 我可以直接从文件中直接加载位图并将其打印在屏幕上,但是这个问题让我陷入困境。

我正在寻找的是一个这样的function:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height); 

没关系,我找到了我的解决方案! 这里是初始化代码:

 std::ifstream is; is.open("Image.bmp", std::ios::binary); is.seekg (0, std::ios::end); length = is.tellg(); is.seekg (0, std::ios::beg); pBuffer = new char [length]; is.read (pBuffer,length); is.close(); tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer; tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER)); RGBQUAD rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER)); BITMAPINFO bi; bi.bmiColors[0] = rgb; bi.bmiHeader = bih; char* pPixels = (pBuffer+bfh.bfOffBits); char* ppvBits; hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0); SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS); GetObject(hBitmap, sizeof(BITMAP), &cBitmap); 

尝试CreateBitmap()

 HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height) { return CreateBitmap(width, height, 1, 24, buffer); } 

CreateDIBSection可能有点复杂,但它可以做的一件事是创建一个设备无关的位图,并给你一个指向位图位缓冲区的指针。 当然,你已经有了一个充满位图位的缓冲区,但是至少你可以复制数据。

推测一下: CreateDIBSection也可以从文件对象创建位图,并且可能有一种方法可以让Windows给你一个表示一块内存的文件对象,这可能会使CreateDIBSection向你提供一个直接从你的缓冲区构建的位图。

不,但你可以在内存中创建一个与当前内存大小相同的新位图,并将内存结构写入其中。

您正在寻找CreateBitmap函数。 将lpvBits设置为您的数据。