程序如下
只需調用該函數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;
}