cv::Mat类型转为CImage,MFC传入窗口句柄显示CImage图片

原创 2017年06月20日 14:35:45
// 实现cv::Mat 结构到 CImage结构的转化
void MatToCImage(cv::Mat& mat, CImage& cImage)
{
	int width = mat.cols;
	int height = mat.rows;
	int channels = mat.channels();
	if (width <= 0)
	{
		return;
	}

	if (!cImage.IsNull())
	{
		cImage.Destroy();//这一步是防止重复利用造成内存问题
	}
	if (!cImage.Create(width, height, 8 * channels))
	{
		return;
	}

	uchar* ps;
	uchar* pimg = (uchar*)cImage.GetBits(); //获取CImage的像素存贮区的指针
	int step = cImage.GetPitch();//每行的字节数,注意这个返回值有正有负

	// 如果是1个通道的图像(灰度图像) DIB格式才需要对调色板设置  
	// CImage中内置了调色板,我们要对他进行赋值:
	if (1 == channels)
	{
		RGBQUAD* ColorTable;
		int MaxColors = 256;
		//这里可以通过CI.GetMaxColorTableEntries()得到大小(如果你是CI.Load读入图像的话)  
		ColorTable = new RGBQUAD[MaxColors];
		cImage.GetColorTable(0, MaxColors, ColorTable);//这里是取得指针  
		for (int i = 0; i<MaxColors; i++)
		{
			ColorTable[i].rgbBlue = (BYTE)i;
			//BYTE和uchar一回事,但MFC中都用它  
			ColorTable[i].rgbGreen = (BYTE)i;
			ColorTable[i].rgbRed = (BYTE)i;
		}
		cImage.SetColorTable(0, MaxColors, ColorTable);
		delete[]ColorTable;
	}

	for (int i = 0; i < height; i++)
	{
		ps = mat.ptr<uchar>(i);
		for (int j = 0; j < width; j++)
		{
			if (1 == channels)
			{
				*(pimg + i*step + j) = ps[j];
				//*(pimg + i*step + j) = 105;
			}
			else if (3 == channels)
			{
				*(pimg + i*step + j * 3) = ps[j * 3];
				*(pimg + i*step + j * 3 + 1) = ps[j * 3 + 1];
				*(pimg + i*step + j * 3 + 2) = ps[j * 3 + 2];
			}
		}
	}
	//string str = CString2StdString(_T("C:\\sample1020.bmp"));
	//imwrite(str,mat);
	//这句话就是用来测试cimage有没有被赋值
	//cImage.Save(_T("C:\\sample1024.bmp"));
}

//MFC传入窗口句柄显示CImage图片
void ShowPic(HWND hWnd, CImage &img)
{
int width = img.GetWidth();
int height = img.GetHeight();


CRect wndRect;
::GetWindowRect(hWnd, &wndRect);

HDC hdc = GetDC(hWnd);
HDC hDcImg = img.GetDC();

CDC tmpDC;
tmpDC.Attach(hDcImg);
tmpDC.Detach();

SetStretchBltMode(hdc, HALFTONE);
::StretchBlt(hdc, 0, 0, wndRect.Width(), wndRect.Height(), hDcImg, 0, 0, width, height, SRCCOPY);

img.ReleaseDC();
ReleaseDC(hWnd, hdc);
}




                    

opencv Mat显示到指定窗体 CImage实现

紧接着上一篇博文,因为direct2d的方式不够稳定,所以博主急需要找到其他的方法,实现把opencv的Mat显示到指定的窗体中。 本博文主要记录基于CImage类的实现。 1、要使用微软提供的C...
  • hust_bochu_xuchao
  • hust_bochu_xuchao
  • 2017年02月17日 17:21
  • 1232

CImage图像得到BYTE数组数据 - 8bit灰度图像

为了上一篇博文(《将图像BYTE(unsigned char)数组转换为VARIANT类型》)中得到CImage对象的数据的需求,也是找了各种资料。原来想使用CBitmap类来实现,虽然它只支持 .b...
  • xdg_blog
  • xdg_blog
  • 2016年11月16日 00:35
  • 1240

将Opencv2的Mat类型数据显示到MFC窗口上

1. 前言      在编写Opencv的相关程序的时候需要将Mat类型的图像数据显示在MFC窗口上,在本文中主要介绍两种方式的显示CImage类和CvvImage类。 2. 基于CImage...
  • m_buddy
  • m_buddy
  • 2016年10月30日 17:15
  • 1699

解决使用CImage类的Draw函数在显示图片时引起的图像失真问题

在VS2008以后,添加了一个很方便的可用于图像处理的CImage类。之前在项目中使用该类时,发现在某些情况下,图像缩小或放大显示后,出现明显的图像失真现象,以下为解决方案。 在调用Draw函数...
  • shishuiliu00
  • shishuiliu00
  • 2016年06月21日 15:30
  • 1652

应用CImage类用文件和流的方式显示图片和放大缩小图片

1.是MFC工程 2.创建默认工程:单文档工程 3.工程名:JPEGTest 4.1在CJPEGTestView类中添加 HANDLE    m_hFile; CImage m_Image;...
  • Templar1000
  • Templar1000
  • 2014年05月29日 01:39
  • 3372

MFC利用halcon以及cimage在picture control控件上面显示图片

本文为利用halcon做软件开发的新手,提供在picture control控件上面显示图片的两种简单方法 一、利用cimage 程序如下:        char* pcsun = "图片文件(*....
  • sinat_35570625
  • sinat_35570625
  • 2017年05月22日 11:14
  • 822

opencv Mat图像显示在MFC控件上,亲测有效。为原作者点赞!

opencv Mat图像显示在MFC控件上,亲测有效
  • melon1188
  • melon1188
  • 2017年03月09日 21:41
  • 1107

MFC中CImage类显示的半透明PNG存在的问题以及处理方法

在MFC中自己也做过很多关于如何
  • lixiang987654321
  • lixiang987654321
  • 2014年10月23日 08:56
  • 5092

MFC的CImage图形处理

CImage支持的图片格式有很多,像通常用的jpg, png, bmp,gif等都支持的不错。 按照我们常用的图片处理需求,一般是:图片加载、图片指定到控件、图片绘制、图片修改、图片转换、(图片创建)...
  • chunyexiyu
  • chunyexiyu
  • 2014年09月14日 21:02
  • 3119

(转)CImage显示透明背景的PNG图片

PNG透明背景显示之路    在VC7.1中 MFC图形处理类里有一个强大的成员---CImage,这个类提供了从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这...
  • kejzhao
  • kejzhao
  • 2014年11月12日 10:08
  • 1005
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cv::Mat类型转为CImage,MFC传入窗口句柄显示CImage图片
举报原因:
原因补充:

(最多只允许输入30个字)