在mfc中的picture控件上顯示圖片

程序如下
只需調用該函數ShowMatImgToWnd(CWnd* pWnd, cv::Mat img)就可以將所需的圖片顯示在picture控件上了,其中CWnd* pWnd參數中輸入picture控件的句柄,可使用GetDlgItem(IDC_picture)等方法獲取(IDC_picture爲picture控件的ID),Mat img參數即爲你要顯示Mat格式的圖片
void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img)
{    
    if(img.empty())  
        return;  

    CRect drect;       
    pWnd->GetClientRect(&drect);    //(drect);  (&drect);  兩種方式均可    

    CClientDC dc(pWnd);
    HDC hDC =dc.GetSafeHdc();

    //內存中的圖像數據拷貝到屏幕上
    BYTE *bitBuffer           = NULL;
    BITMAPINFO *bitMapinfo = NULL;

    int ichannels =img.channels();
    if( ichannels == 1)
    {
        bitBuffer  = new BYTE[40+4*256]; 
    }
    else if( ichannels == 3)
    {
        bitBuffer  = new BYTE[sizeof(BITMAPINFO)]; 
    }
    else
    {
        return;
    }


    if(bitBuffer == NULL)
    {    
        return;
    }


    bitMapinfo = (BITMAPINFO *)bitBuffer;
    bitMapinfo->bmiHeader.biSize            = sizeof(BITMAPINFOHEADER);
    bitMapinfo->bmiHeader.biHeight            = -img.rows;  //如果高度爲正的,位圖的起始位置在左下角。如果高度爲負,起始位置在左上角。
    bitMapinfo->bmiHeader.biWidth            = img.cols;
    bitMapinfo->bmiHeader.biPlanes            = 1;      // 目標設備的級別,必須爲1    
    bitMapinfo->bmiHeader.biBitCount        = ichannels *8;     // 每個像素所需的位數,必須是1(雙色), 4(16色),8(256色)或24(真彩色)之一
    bitMapinfo->bmiHeader.biCompression        = BI_RGB; //位圖壓縮類型,必須是 0(不壓縮), 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
    bitMapinfo->bmiHeader.biSizeImage        = 0;      // 位圖的大小,以字節爲單位
    bitMapinfo->bmiHeader.biXPelsPerMeter    = 0;      // 位圖水平分辨率,每米像素數
    bitMapinfo->bmiHeader.biYPelsPerMeter    = 0;      // 位圖垂直分辨率,每米像素數
    bitMapinfo->bmiHeader.biClrUsed            = 0;      // 位圖實際使用的顏色表中的顏色數
    bitMapinfo->bmiHeader.biClrImportant    = 0;      // 位圖顯示過程中重要的顏色數

    if(ichannels == 1)
    {
        for(int i=0; i<256; i++)
        {    //顏色的取值範圍 (0-255)
            bitMapinfo->bmiColors[i].rgbBlue  =bitMapinfo->bmiColors[i].rgbGreen =bitMapinfo->bmiColors[i].rgbRed   =(BYTE) i;
        }

        bitMapinfo->bmiHeader.biClrUsed            = 256;      // 位圖實際使用的顏色表中的顏色數
    }
    SetStretchBltMode(hDC, COLORONCOLOR);

    
    StretchDIBits(hDC,
        0,
        0,
        drect.right,        //顯示窗口寬度
        drect.bottom,        //顯示窗口高度
        0,
        0,
        img.cols,           //圖像寬度
        img.rows,           //圖像高度
        img.data,            
        bitMapinfo,            
        DIB_RGB_COLORS, 
        SRCCOPY
        );

    delete []bitBuffer;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章