將opencv中的Mat居中顯示到MFC的picture控件上(通過StretchDIBits)

BOOL CXXXDlg::ShowMat(Mat image)
{
	if (image.empty())	return FALSE;
	CRect rect;
	int width, height;
	BITMAPINFO bitmapInfo;
	BITMAPINFOHEADER* bmiHeader;
	width = image.cols;
	height = image.rows;
	if (width % 4)
		width = (width + 3) / 4 * 4;

	cv::Size winSize(width, height);
	cv::Mat cvImgTmp(winSize, CV_8UC3);
	if (image.size() != winSize)
		cv::resize(image, cvImgTmp, winSize);
	else
		cvImgTmp = image.clone();
	if (cvImgTmp.channels()==1)
		cvtColor(cvImgTmp, cvImgTmp, CV_GRAY2BGR);
	GetDlgItem(IDC_STATIC_SHOW_MODE)->GetClientRect(&rect);

	bmiHeader = &bitmapInfo.bmiHeader;
	bmiHeader->biSize = sizeof(BITMAPINFOHEADER);
	bmiHeader->biWidth = cvImgTmp.cols;
	bmiHeader->biHeight = -cvImgTmp.rows;
	bmiHeader->biPlanes = 1;
	bmiHeader->biBitCount = 24;
	bmiHeader->biCompression = BI_RGB;
	bitmapInfo.bmiHeader.biSizeImage = 0;
	bmiHeader->biXPelsPerMeter = GetSystemMetrics(SM_CXSCREEN);
	bmiHeader->biYPelsPerMeter = GetSystemMetrics(SM_CYSCREEN);
	bmiHeader->biClrUsed = 0;
	bmiHeader->biClrImportant = 0;
	/*使圖片在控件中居中全部顯示*/
	int nWindowW = rect.Width();				//獲取窗口寬度 
	int nWindowH = rect.Height();				//獲取窗口高度  
	int nImageW = cvImgTmp.cols;				//獲取圖片寬度  
	int nImageH = cvImgTmp.rows;				//獲取圖片高度
	float fRatioW = (float)nWindowW / nImageW;
	float fRatioH = (float)nWindowH / nImageH;
	int nBeginW , nBeginH, nWeight, nHeight;
	if (fRatioW < fRatioH)
	{
		nBeginW = 0;
		nBeginH = (int)(nWindowH - (nImageH*fRatioW)) / 2;
		nWeight = nWindowW;
		nHeight = (int)(nImageH * fRatioW);
	}
	else
	{
		nBeginW = (int)(nWindowW - (nImageW*fRatioH)) / 2;
		nBeginH = 0;
		nWeight = (int)(nImageW * fRatioH);
		nHeight = nWindowH;
	}
	GetDlgItem(IDC_STATIC_SHOW_MODE)->GetDC()->FillSolidRect(0, 0, nWindowW, nWindowH, COLORREF(0));
	GetDlgItem(IDC_STATIC_SHOW_MODE)->GetDC()->SetStretchBltMode(COLORONCOLOR);
	StretchDIBits(GetDlgItem(IDC_STATIC_SHOW_MODE)->GetDC()->GetSafeHdc()
		, nBeginW, nBeginH, nWeight, nHeight
		, 0, 0, nImageW, nImageH,
		cvImgTmp.data, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
	return TRUE;
}

 

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