在MFC中显示8位灰度位图

时间:2017-01-03 20:55:45

标签: c++ opencv winapi bitmap mfc

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

CImage myImage;
wchar_t* wcharPointer=(_T("C:\\TestPic.bmp"));
myImage.Load(wcharPointer);
myImage.StretchBlt(dc.m_hDC,0,0,
                     myImage.GetWidth(),myImage.GetHeight(),SRCCOPY);

Mat m1(294,456,CV_8UC3,((unsigned char*)myImage.GetBits())-(293*456*3));    
//-(293*456*3) Because bitmap is Bottom up,still, image displayed is     
 //inverted 
Mat  arrayOf3[3];
split(m1,arrayOf3);

现在,当我想将指向8位灰度图像的指针传回MFC以在应用程序中显示时,我似乎遇到了问题。由于CImage将m_pBits decalres为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?

dc.BitBlt(10,0,456,294,&安培; memdc,0,0,SRCCOPY); //但这会导致空白屏幕
   //方法1失败..不确定为什么......也许DDB不是DIB被创建

So Onto Approach2,我创建了一个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),我想避免,因为这个操作是时间敏感的。 我该如何生成Colortable?另外,我应该怎么办呢? 提前谢谢..

0 个答案:

没有答案