读取显示
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("保存图像成功!"));
}