显示:实现MFC下图像的读取显示与本地保存

读取显示

void CXXXDlg::OnBnClickedButtonLoad()
{
	TCHAR *szFilter = _T("image files (*.jpeg; *.jpg; *.bmp;*.png)|*.jpeg; *.jpg; *.bmp; *.png|image files (*.jpeg)|*.jpeg|image files (*.jpg)|*.jpg|image files (*.bmp)|*.bmp|image files (*.png)|*.png|All Files (*.*)|*.*||");
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if (IDOK == dlg.DoModal())
	{
		CString strName = dlg.GetPathName();
		CImage image;
		image.Load(strName);
		if (image.IsNull())
		{
			AfxMessageBox(_T("图片格式错误!"));
			return;
		}
		CImageToMat(image, m_RoiImage);
		BOOL bflag = ShowModeMat(m_RoiImage);
		if (!bflag)
		{
			AfxMessageBox(_T("显示图片失败!"));
			return;
		}
		m_strEditPath = strName;
		m_RoiSrcEx.SetZoom(0);
		::PostMessage(GetSafeHwnd(), WM_VALUE_CHANGE, 0, 0);
		UpdateData(FALSE);
	}
}

void CXXXDlg::CImageToMat(CImage& cimage, Mat& mat)
{
	if (true == cimage.IsNull())
	{
		return;
	}
	int nChannels = cimage.GetBPP() / 8;
	if ((1 != nChannels) && (3 != nChannels))
	{
		return;
	}
	int nWidth = cimage.GetWidth();
	int nHeight = cimage.GetHeight();
	//重建mat
	if (1 == nChannels)
	{
		mat.create(nHeight, nWidth, CV_8UC1);
	}
	else if (3 == nChannels)
	{
		mat.create(nHeight, nWidth, CV_8UC3);
	}
	//拷贝数据
	uchar* pucRow;									//指向数据区的行指针
	uchar* pucImage = (uchar*)cimage.GetBits();		//指向数据区的指针
	int nStep = cimage.GetPitch();					//每行的字节数,注意这个返回值有正有负
	for (int nRow = 0; nRow < nHeight; nRow++)
	{
		pucRow = (mat.ptr<uchar>(nRow));
		for (int nCol = 0; nCol < nWidth; nCol++)
		{
			if (1 == nChannels)
			{
				pucRow[nCol] = *(pucImage + nRow * nStep + nCol);
			}
			else if (3 == nChannels)
			{
				for (int nCha = 0; nCha < 3; nCha++)
				{
					pucRow[nCol * 3 + nCha] = *(pucImage + nRow * nStep + nCol * 3 + nCha);
				}
			}
		}
	}
}

BOOL CXXXDlg::ShowModeMat(Mat mImage)
{
	if (mImage.empty())	return FALSE;
	CRect rect;//定义矩形类  
	CWnd *pWnd = GetDlgItem(IDC_STATIC_SHOW_MODE);			//获取控件句柄  
	pWnd->GetClientRect(&rect);								//获取句柄指向控件区域的大小  
	CDC *pDc = pWnd->GetDC();								//获取picture的DC  
	int nWindowW = rect.Width();							//获取窗口宽度 
	int nWindowH = rect.Height();							//获取窗口高度  
	int nImageW = mImage.cols;								//获取图片宽度  
	int nImageH = mImage.rows;								//获取图片高度
	/*使图片在控件中居中全部显示*/
	float ratioW = (float)nWindowW / nImageW;
	float ratioH = (float)nWindowH / nImageH;
	CImage ImageCam;
	MatToCImage(mImage, ImageCam);
	pDc->FillSolidRect(0, 0, nWindowW, nWindowH, COLORREF(0));
	pDc->SetStretchBltMode(COLORONCOLOR);
	if (ratioW < ratioH)
		ImageCam.Draw(pDc->m_hDC, 0, (int)(nWindowH - nImageH * ratioW) / 2, nWindowW, (int)(nImageH * ratioW), 0, 0, nImageW, nImageH);
	else
		ImageCam.Draw(pDc->m_hDC, (int)(nWindowW - nImageW * ratioH) / 2, 0, (int)(nImageW* ratioH), nWindowH, 0, 0, nImageW, nImageH);
	ReleaseDC(pDc);
}

本地保存

void CXXXDlg::OnBnClickedButtonSave()
{
	if (m_mRoiImage.empty())
	{
		AfxMessageBox(_T("你还没有打开一个要保存的图像文件!"));
		return;
	}
	CString strFilter;
	strFilter = "BMP位图文件|*.bmp|JPEG 图像文件|*.jpg|GIF 图像文件|*.gif|PNG 图像文件|*.png||";
	CFileDialog dlg(FALSE, NULL, NULL, NULL, strFilter);
	if (IDOK != dlg.DoModal())
		return;
	// 如果用户没有指定文件扩展名,则为其添加一个
	CString strFileName;
	CString strExtension;
	strFileName = dlg.GetPathName();
	strExtension = dlg.GetFileExt();
	if (strExtension.GetLength() == 0)
	{
		switch (dlg.m_ofn.nFilterIndex)
		{
		case 1:
			strExtension = "bmp"; break;
		case 2:
			strExtension = "jpg"; break;
		case 3:
			strExtension = "gif"; break;
		case 4:
			strExtension = "png"; break;
		default:
			break;
		}
		strFileName = strFileName + '.' + strExtension;
	}
	// 图像保存
	std::string strName = CT2A(strFileName);
	if (!imwrite(strName, m_mRoiImage))
		AfxMessageBox(_T("保存图像失败!"));
	else
		AfxMessageBox(_T("保存图像成功!"));
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值