MFC opencv 在picture控件上动态显示图像

**写在前面Copy了别人的文章先留在这里,找不到原文章了,先跟作者说声抱歉,后续文章更新时重新致谢。
只需调用该函数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
	);
以上代码为调用的api函数,直接复制粘贴就可以。
以下是调用函数。
// 按钮响应函数
void CxxxDlg::OnBnClickedBtnOpenpic()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_PIC);
	Mat img = imread("C:\\Users\\Pictures\\1.bmp");
	ShowMatImgToWnd(pWnd,img);
}

模仿着上面按键响应函数写一下就行,Mat类型的图像可以用动态加载。

**写在最后:**不是正规的图像显示在picture控件的办法,是种偷懒的做法,并不正规。但是对于着急显示还是可以紧急使用一下的。后续有时间的话再更新一下正确的显示方式。

再次感谢代码的原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值