繁体   English   中英

使用MFC或Win32显示内存缓冲区中的所有位图类型

[英]Displaying all Bitmap Types from a Memory Buffer with MFC or Win32

目的是显示存储在内存缓冲区中的位图。 内存缓冲区的内容与磁盘存储的.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文件结构的内存缓冲区的内容,并验证了它们与磁盘存储的.bmp文件相同,这些文件在加载LoadBitmap()时可以正确显示。

需要强调的是,上述方法仅适用于每像素24位的图像。 但是,它不适用于每像素8位的图像。

提前致谢。

问题是带有DIB_RGB_COLORS CreateDIBSection()期望每个像素(即24位)的RGB值,并且您的8位位图包含作为RGB调色板中8位索引的像素,该像素存储在bi-bmiColors

因此,您可以选择在预处理步骤中将8位位图转换为24位-例如,通过为RGB值分配内存并在原始调色板中执行查找以填充这些值。 这样,您可以使用相同的代码显示结果。 或者,您可以使用原始数据创建HBITMAP,然后将其选择到内存DC中,然后将其BitBlt()移至显示窗口。

除GDI或GDI +外,其他选项可能是考虑使用WIC(Windows映像组件)和/或Direct2D。

汉斯正确地说bi.bmiColors没有得到正确处理。 相反的处理bi.bmiColors直接表,只是点pBitmapInfo到合适的偏移BITMAPFILEHEADER和演员。 这会自动处理颜色表。 是的, pBitmapInfopBitmapInfoHeader确实指向同一位置。 他们指向的内容在每种情况下的用法都不同。 CreateDIBitmap()函数需要这两个指针。

pBitmapFileHeader = (LPBITMAPFILEHEADER)buf1;
pBitmapInfoHeader = (LPBITMAPINFOHEADER)(buf1+sizeof(BITMAPFILEHEADER));
pBitmapInfo = (LPBITMAPINFO)(buf1+sizeof(BITMAPFILEHEADER));
pPixels = (buf1+pBitmapFileHeader->bfOffBits);

然后在OnPaint()中执行以下操作:

g_hBmp = CreateDIBitmap(dcPaint, pBitmapInfoHeader, CBM_INIT, (VOID *) pPixels, pBitmapInfo, DIB_RGB_COLORS);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM