C++ 在MFC中显示8位灰度位图

C++ 在MFC中显示8位灰度位图,c++,opencv,winapi,bitmap,mfc,C++,Opencv,Winapi,Bitmap,Mfc,我正在创建一个应用程序,其中显示由MFC处理,图像处理由OpenCV处理。对于第一部分,我使用CImage->load()从内存中加载一个24 bpp的位图(颜色),使用StretchBlt()显示它,然后使用CImage的GetBits()函数将指向原始数据的指针移交给OpenCV Mat。这一半的作品伟大,因为我可以显示原版。my MFC应用程序中的彩色图像&随后可以使用OpenCV将彩色图像剥离为各种灰度格式(r、G、B Sobel)。(使用OpenCV->imshow()验证) 现在,当

我正在创建一个应用程序,其中显示由MFC处理,图像处理由OpenCV处理。对于第一部分,我使用CImage->load()从内存中加载一个24 bpp的位图(颜色),使用StretchBlt()显示它,然后使用CImage的GetBits()函数将指向原始数据的指针移交给OpenCV Mat。这一半的作品伟大,因为我可以显示原版。my MFC应用程序中的彩色图像&随后可以使用OpenCV将彩色图像剥离为各种灰度格式(r、G、B Sobel)。(使用OpenCV->imshow()验证)

现在,当我想将指向8位灰度图像的指针传递回MFC以在应用程序中显示时,我似乎遇到了问题。由于CImage将m_pBits标记为prvate,我不能只将cv::Mat->数据分配给CImage

方法1如下

CBitmap bitmap1;CDC memdc;
memdc.CreateCompatibleDC( &dc);
bitmap1.CreateBitmap(456,294,1,8,(void*)arrayOf3[0].data);
//这返回1,所以我假设从OpenCV到MFC成功切换

BitBlt(10,0456294,&memdc,0,0,SRCCOPY);//但这会导致出现空白屏幕
//方法1失败..不确定原因..可能创建了DDB而不是DIB

因此,在方法2中,我创建了一个bitmapInfo并填充所有必需的值

BITMAPINFO bitInfo={0};
    memset(&bitInfo, 0, sizeof(bitInfo));
    bitInfo.bmiHeader.biSize        =   sizeof(BITMAPINFOHEADER);
    bitInfo.bmiHeader.biWidth       =   456;
    bitInfo.bmiHeader.biHeight      =   -294; // top-down image 
    bitInfo.bmiHeader.biPlanes      =   1;
    bitInfo.bmiHeader.biBitCount    =   8;
    bitInfo.bmiHeader.biCompression =   BI_RGB; //Uncompressed image
    bitInfo.bmiHeader.biSizeImage   =   456*294;
    bitInfo.bmiHeader.biClrUsed     =   0;   
    bitInfo.bmiHeader.biClrImportant=   0;
我环顾四周&我对如何填充这种情况下的颜色表缺乏理解。 我看到的一种方法涉及将颜色表中的每个8位灰度图像放大到24 bpp(或32),我希望避免这种情况,因为这种操作是时间敏感的。
我应该如何生成我的颜色表?还有,在那之后我应该如何进行?
提前感谢..

“我应该如何生成我的颜色表?”--你是说如何生成灰度调色板?一个从0到255(包括)的简单循环,将所有三个颜色分量设置为相同的值。类似于此?
for(unsigned int I=0;I<256;I++){bitInfo.bmiColors[I].rgbreed=(unsigned char)arrayOf3[0]。data);bitInfo.bmiColors[i].rgbGreen=(无符号字符)arrayOf3[0]。数据);bitInfo.bmiColors[i].rgbBlue=*(无符号字符*)arrayOf3[0]。数据);}不完全正确。单通道图像中的像素是字节,其值从0(最低强度)到255(最高强度)。调色板提供这些值与RGB颜色之间的映射。假设您希望将其显示为灰色阴影。在这种情况下,0的值将映射到(0,0,0),127的值将映射到(127127),255的值将映射到(255255)。在这种情况下,您需要将
i
的值分配给调色板条目
i
的每个R、G和B组件。您不熟悉OpenCV,但是,您可以使用吗?将
bibibibitCount
设置为8意味着您使用的是索引图像(即紧跟在
bitmapinfo结构之后的颜色表)。这意味着您必须提供一个调色板。另外,您对
biSizeImage
的计算是错误的。它需要考虑步幅,步幅可能与宽度相同,也可能不同。对于
BI_RGB
最好将其保留在0,并让系统处理它。
BITMAPINFO bitInfo={0};
    memset(&bitInfo, 0, sizeof(bitInfo));
    bitInfo.bmiHeader.biSize        =   sizeof(BITMAPINFOHEADER);
    bitInfo.bmiHeader.biWidth       =   456;
    bitInfo.bmiHeader.biHeight      =   -294; // top-down image 
    bitInfo.bmiHeader.biPlanes      =   1;
    bitInfo.bmiHeader.biBitCount    =   8;
    bitInfo.bmiHeader.biCompression =   BI_RGB; //Uncompressed image
    bitInfo.bmiHeader.biSizeImage   =   456*294;
    bitInfo.bmiHeader.biClrUsed     =   0;   
    bitInfo.bmiHeader.biClrImportant=   0;