我有一个 24 位 BMP 文件加载到 RAM 中,我正在尝试为这个图像文件创建一个 HBITMAP。我找到了一些我一直在尝试的例子,但似乎无法奏效。基本上,我需要文件的 HBITMAP,以便我可以卸载文件并保留 HBITMAP,以后可以使用 DeleteObject() 处理它。由于这个位图是在我的应用程序中很早就加载的,所以没有应用程序窗口,因此没有 HDC。这是我到目前为止所拥有的:-
HBITMAP cBitmap; // This should be where my bitmap handle ends up.
mem; // This is a void* pointer to the loaded BMP file
tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)mem;
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(mem + sizeof(tagBITMAPFILEHEADER));
RGBQUAD rgb = *(RGBQUAD*)(mem + sizeof(tagBITMAPFILEHEADER) + sizeof(tagBITMAPINFOHEADER));
BITMAPINFO bi;
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;
UINT8* pixels = mem + bfh.bfOffBits;
void* ppv;
HBITMAP hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &ppv, NULL, 0);
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pixels, &bi, DIB_RGB_COLORS);
GetObject(hBitmap, sizeof(BITMAP), &cBitmap);
出于某种让我感到困惑的原因,cBitmap 最终为 NULL。还有一件事让我感到困惑...... DIB_RGB_COLORS 意味着 BITMAPINFO 有一个指向文字 RGB 值的指针,但它如何处理没有调色板的 24 位图像?