将Opencv绘制图片显示在MFC Picture Control控件上

//将picture control控件type类型设置为位图Bitmp格式
//对图片进行格式转换使其能正确显示在控件上
void CMFCApplication1Dlg::OnBnClickedButton2()
{
		CRect rect;
		GetDlgItem(IDC_STATIC110)->GetClientRect(&rect);  // 获取picture control控件大小(控件ID:IDC_STATIC110)
		double mult1 = 0.0, mult2 = 0.0;
		cv::Size mults_size(imgTmp.size());//imgTmp为opencv绘制图片

		if (rect.Width() < imgTmp.size().width)//根据窗口大小转换图片显示比例,保证图片完整显示
        {
			mults_size.width = rect.Width();
			mult1 = (double)rect.Width() / (double)imgTmp.size().width;
			mults_size.height = imgTmp.size().height * mult1;
		}
		if (rect.Height() < imgTmp.size().height)
        {
			mult2 = (double)rect.Height() / (double)mults_size.height;
			mults_size.width = mults_size.width * mult2;
			mults_size.height = rect.Height();
		}
		cv::resize(imgTmp, imgTmp, mults_size);// 缩放
		// 转换格式
		switch (imgTmp.channels())
		{
		case 1:
			cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY单通道
			break;

		case 3:
			cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA);  // BGR三通道
			break;

		default:
			break;

		}
		int pixelBytes = imgTmp.channels()*(imgTmp.depth() + 1); // 计算一个像素多少个字节
		// 制作bitmapinfo(数据头)
		BITMAPINFO bitInfo;
		bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;
		bitInfo.bmiHeader.biWidth = imgTmp.cols;
		bitInfo.bmiHeader.biHeight = -imgTmp.rows;
		bitInfo.bmiHeader.biPlanes = 1;
		bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
		bitInfo.bmiHeader.biCompression = BI_RGB;
		bitInfo.bmiHeader.biClrImportant = 0;
		bitInfo.bmiHeader.biClrUsed = 0;
		bitInfo.bmiHeader.biSizeImage = 0;// biWidth' * biHeight' * biBitCount'   (上述公式中的biWidth’必须是4的整倍数(不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241,biWidth’=244)。 )
		bitInfo.bmiHeader.biXPelsPerMeter = 0;//是现实世界中每米包含的像素数 设为3780即可
		bitInfo.bmiHeader.biYPelsPerMeter = 0;
		// Mat.data + bitmap数据头 -> MFC

		CDC *pDC = GetDlgItem(IDC_STATIC110)->GetDC();
		::StretchDIBits(
			pDC->GetSafeHdc(),
			0, 0, rect.Width(), rect.Height(),
			0, 0, rect.Width(), rect.Height(),
			imgTmp.data,
			&bitInfo,
			DIB_RGB_COLORS,
			SRCCOPY
		);
		ReleaseDC(pDC);
}

你可能感兴趣的:(opencv,mfc,opencv,c++)