在mfc中picture控件中显示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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小新识图

你的鼓励是我最大的分享动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值