目标是显示存储在内存缓冲区中的位图。内存缓冲区的内容与磁盘存储的 .bmp 文件相同。出于性能原因,将这些缓冲区写入磁盘然后显示它们不是一种选择。GDI+ 也不是一个选项。目前,我可以根据需要从内存缓冲区显示每像素 24 位的位图。但是,当我尝试显示每像素 8 位的位图时,图像以错误的颜色显示(即图像中的数字是可识别的;缩放、方向等都是正确的,但一切都是错误的颜色)。
这是我初始化位图标题结构的方法:
bfh = *(tagBITMAPFILEHEADER*)buf1;
bih = *(tagBITMAPINFOHEADER*)(buf1+sizeof(tagBITMAPFILEHEADER));
rgb = *(RGBQUAD*)(buf1+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER));
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;
pPixels = (buf1+bfh.bfOffBits);
然后,我尝试了几种不同的方法来创建 HBITMAP,这里有一些:
g_hBmp = CreateDIBitmap(dcPaint, &bih, CBM_INIT, (VOID *) pPixels, &bi, DIB_RGB_COLORS);
或者:
g_hBmp = CreateDIBSection(dcPaint, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0);
SetDIBits(dcPaint, g_hBmp, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS);
我也尝试了不同的参数:
- NULL 而不是 CPaintDC 对象
- DIB_PAL_COLORS 而不是 DIB_RGB_COLORS
我已经转储了存储 .bmp 文件结构的内存缓冲区的内容,并验证了它们与使用 LoadBitmap() 加载时正确显示的磁盘存储的 .bmp 文件相同。
需要强调的是,上述方法适用于每像素 24 位的图像。但是,它不适用于每像素 8 位的图像。
提前致谢。