通过文件对话框导入图像问题

通过图像对话框导入图像的时候存在一个问题,就是图像路径的类型转换问题,因为在MFC中的文件路径的格式是CString类型的,而我们利用OpenCV打开图像的路径是string类型,所以就需要转换,在这期间试了很多方法,包括一开始用强制类型转换都发现有错误,到后来发现是编码问题,一个是现在的Unicode,一个是多字节,但是把项目设置成多字节编译不通过,所以放弃这种方法,还是要在Unicode下把类型转换过来。

在MFC中对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符;

对于多字节的编码属性,CSTring被定义为CStringA,其内部是char单字节字符。在网上找了一些资料如下:

//注意!CA2TCT2A是与编码方式有关的宏定义

       cstring=CA2T(stdString.c_str());//std::string->CString

       stdString=CT2A((LPCTSTR)cstring);//CString->std::strin

cstingA=stdString.c_str();//std::string->CStringA

       stdString=(LPCSTR)cstringA;//CStringA->std::string

       cstringA=CW2A(stdWString.c_str());//std::wstring->CStringA

       stdWString=CA2W((LPCSTR)cstringA);//CStringA->std::wstring

       cstringW=CA2W(stdString.c_str());//std::string->CStringW

       stdString=CW2A((LPCWSTR)cstringW);//CStringW->std::string

       cstringW=stdString.c_str();//std::string->CStringW

       stdWString=(LPCWSTR)cstringW;//CStringW->std::wstring

上面的这些转换与工程的编码格式无关,其中 CStringA std::string CStringW std::wstring  是相对应的,可以直接提取其内部的字串指针进行转换。而对于内部字符编码不一致的我们通过 CW2A CA2W 进行转换

void CMy_OpencvDlg::OnBnClickedLoadPic()
{
	// TODO:  在此添加控件通知处理程序代码.
	TCHAR szFilter[] = _T("PNG图片(*.png)|*.png|JPG图片(*.jpg)|*.jpg|所有文件(*.*)|*.*|");
	CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, szFilter, this);
	CString strFilePath;
	if (IDOK == fileDlg.DoModal())
	{
		strFilePath = fileDlg.GetPathName();
	}

	/**********************将CString的文件路径转换为string类型的路径*****************/
	string pathName = CT2A((LPCTSTR)strFilePath);
	/*******************在图像控件中绘图***************************/
	m_mat = imread(pathName);
	CDC* pDC = GetDlgItem(IDC_PIC)->GetDC();
	HDC hDC = pDC->GetSafeHdc();
	m_img = m_mat;
	CvvImage cimg;
	cimg.CopyOf(&m_img);
	CRect rect;
	GetDlgItem(IDC_PIC)->GetClientRect(&rect);
	cimg.DrawToHDC(hDC, &rect);
	ReleaseDC(pDC);
}
上面是在MFC中实现的代码,下面是效果图




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值