显示:将Mat图片居中显示到MFC的picture控件上(通过StretchDIBits)

学习MFC 同时被 2 个专栏收录
21 篇文章 0 订阅
5 篇文章 1 订阅
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;
}

 

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

Stone_石头

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值