得到显示作为色的RGB图象的单色图象

时间:2015-07-08 17:38:54

标签: 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 = Void指向像素阵列的指针。(仅原始像素数据!每像素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;

假设输出是附件文件左侧的数字。但是我得到了一个蓝色调的图像,如右图所示(更不用说缩放和完全匹配问题,把图像描绘成问题)。

MismatchImage

如果我知道RGB值如何以16位存储,那将会非常有用!

1 个答案:

答案 0 :(得分:1)

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

您正在使用BITMAPINFOHEADERbitBitCount = 16创建biCompression = BI_RGB。根据{{​​3}},如果您按这种方式设置字段,则:

  

位图数组中的每个 WORD 代表一个像素。红色,绿色和蓝色的相对强度用每个颜色分量的五位表示。蓝色的值是最低有效的五位,后面是绿色和红色各五位。最重要的一点未使用。

这与您的源数据格式不同,并且您没有进行任何转换,因此您会遇到垃圾邮件。请注意,您选择的位图格式只能表示2 ^ 5 = 32个灰度,而不是65536,因此您在转换过程中会遇到质量损失。