windows - 单色图像显示为彩色RGB图像

标签 windows image visual-c++ bitmap mfc

位图由像素数据(纯像素数据)构成。通过正确设置位图参数(例如hieght,width,bitcount等)来完成构建。位图实际上是使用CreateDIBsection构建的。然后将位图加载到具有Bitmap属性的CStatic对象上。

正在以适当的宽度和内容显示图像。但是唯一的区别是内容颜色是彩色的,而不是灰度的。例如,图像是黑色Bground上的白色H字母,而不是显示为白色,而是显示蓝色的H字母。类似的颜色变化适用于不同的图像。此外,有时除了彩色变化外,垃圾彩色数据似乎会偏离图像的原始内容。

位图是一个16位的位图。

请参阅下面的代码,用于创建BitMap。

HDC是CStatic变量的设备上下文,在其中加载了创建的位图;
我使用setbitmap函数将下面函数返回的BitMap直接设置为此变量。 CStatic varibale还将BitMap作为其属性之一。有关用于创建位图的函数,请参见下文。

功能参数定义。
PixMapHeight =像素矩阵中的行数。
PixMapWidth =像素矩阵中的列数。
BitsPerPixel =为一个像素存储的位。
pPixMapBits =指向像素数组的空指针。(仅原始像素数据!每个像素16位)。
DoBitmapFromPixels(HDC Hdc,UINT PixMapWidth,UINT PixMapHeight,UINT BitsPerPixel,LPVOID pPixMapBits)

    BITMAPINFO *bmpInfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
    BITMAPINFOHEADER &bmpInfoHeader(bmpInfo->bmiHeader);
    bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
    LONG lBmpSize = PixMapWidth * PixMapHeight * (BitsPerPixel / 8);
    bmpInfoHeader.biWidth = PixMapWidth;
    bmpInfoHeader.biHeight = -(static_cast<int>(PixMapHeight));
    bmpInfoHeader.biPlanes = 1;
    bmpInfoHeader.biBitCount = BitsPerPixel;
    bmpInfoHeader.biCompression = BI_RGB;
    bmpInfoHeader.biSizeImage = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biClrImportant = 0;
    void *pPixelPtr = NULL;
    HBITMAP hBitMap = CreateDIBSection(Hdc, bmpInfo, DIB_RGB_COLORS, &pPixelPtr, NULL, 0);
    if (pPixMapBits != NULL)
    {
        BYTE* pbBits = (BYTE*)pPixMapBits;
        BYTE *Pix = (BYTE *)pPixelPtr;
        memcpy(Pix, ((BYTE*)pbBits + (lBmpSize * (CurrentFrame - 1))), lBmpSize);
    }
    free(bmpInfo);
    return hBitMap;

假定的输出是附件左侧的数字。但是我得到的是正确的蓝色调的图像(不必担心缩放和精确匹配问题,请使用图像来描述问题)。

而且,如果我知道RGB值如何以16位存储,这也将非常有帮助!

最佳答案

您从未真正说过pPixMapBits是什么格式,但是我猜它包含16位值,其中0代表黑色,32768代表灰色,65535代表白色。

您正在使用BITMAPINFOHEADERbitBitCount = 16创建一个biCompression = BI_RGB。根据the documentation,如果您以这种方式设置字段,则:

Each WORD in the bitmap array represents a single pixel. The relative intensities of red, green, and blue are represented with five bits for each color component. The value for blue is in the least significant five bits, followed by five bits each for green and red. The most significant bit is not used.



此格式与源数据的格式不同,并且不进行任何转换,因此会出现垃圾。请注意,您选择的位图格式只能表示2 ^ 5 = 32个灰色阴影,而不能表示65536,因此在转换过程中会遭受质量损失。

关于windows - 单色图像显示为彩色RGB图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299834/

相关文章:

windows - 事件 ID 与事件查看器中显示的内容不匹配

windows - 异步 WCF 调用在客户端中处理不当

android - 9 补丁背景图像的布局问题

html - 如何显示大于实际div尺寸的背景图片?

windows - 为什么 Visual Studio 2008 找不到 afxcontrolbars.h?

c++ - WM_TIMER 在 ATL ActiveX 控件中突然停止

c++ - 文件属性对话框中的自定义选项卡

java - 指纹图像的图像分割

c# - 在带有 Visual Studio 的 Windows 上混合 C# 代码和非托管 C++ 代码

c++ - 切换到非调试运行时/MT 导致链接错误