MFC在Picture控件上显示图像、保存图像_缩放



//选择图片
CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
//打开文件选择窗体
if (fileDlg.DoModal() == IDCANCEL) return; //如果点击“取消”按钮,直接退出
//获取图片路径(包含名称)
CString strFilePath = fileDlg.GetPathName();//既有路径又有文件名,如D:/lena.jpg
//CString strFileName = fileDlg.GetFileName();//只获取文件名,如lena.jpg
//判断路径不为空
if (strFilePath == _T(""))
{
return;
}
//使用CImage的Load、Draw函数显示图像
CImage image;
image.Load(strFilePath);

//int x = image.GetWidth(); //学习下CImage的属性,无其他意义
//int y = image.GetHeight();

//获取控件的矩形
CRect rectControl; //控件矩形对象
CWnd *pWnd = GetDlgItem(IDC_IMAGE); //Picture Control的ID为IDC_IMAGE
pWnd->GetClientRect(&rectControl);

//以控件为画布,在其上画图
CDC *pDc = GetDlgItem(IDC_IMAGE)->GetDC();
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);//绘图前必须调用此函数(设置缩放模式),否则失真严重

//画图(以下两种方法都可)
//image.StretchBlt(pDc->m_hDC, rectPicture, SRCCOPY); //将图片绘制到Picture控件表示的矩形区域
image.Draw(pDc->m_hDC, rectControl); //将图片绘制到Picture控件表示的矩形区域

image.Destroy();
pWnd->ReleaseDC(pDc);


显示与保存(显示与上述一样),m_PictureControl是PictureControl控件对应的变量。

显示



// **************** 获取图片
CFileDialog fileDlg(TRUE, _T("bmp"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
fileDlg.DoModal();
//获取图片路径和图片名称
CString strFilePath = fileDlg.GetPathName(); //"D:\1.jpg"
//CString strFileName = fileDlg.GetFileName(); //"1.jpg"
//判断路径是否为空
if (strFilePath == _T(""))
{
return;
}
//CImage image; //使用图片类,已放到头文件中(全局变量)
if(!image.IsNull())
image.Destroy(); //如果已有,先清空。否则重新加载会报错。
image.Load(strFilePath); //装载路径下图片信息到图片类
//******************* 图片缩放适应控件大小
CRect rectControl; //控件矩形对象
m_PictureControl.GetClientRect(&rectControl);//控件区域
//图片不缩放
//int imageWidth = image.GetWidth();
//int imageHeight = image.GetHeight();
//rectControl = CRect(rectControl.TopLeft(), CSize(imageWidth, imageHeight)); //显示未缩放原图,超出控件区域不显示

//显示
CDC *pDc = m_PictureControl.GetWindowDC();//获得显示控件的DC
SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE); //设置缩放,否则图片显示会失真
image.Draw(pDc->m_hDC, rectControl); //将图片绘制到Picture控件表示的矩形区域

//释放资源
ReleaseDC(pDc);


保存



if (image.IsNull()) 
{
MessageBox(_T("你还没有打开一个要保存的图像文件!"));
return;
}
CString strFilter;
strFilter = _T("位图文件|*.bmp|JPEG 图像文件|*.jpg|PNG 图像文件|*.png||");
CFileDialog dlg(FALSE,_T("bmp"),_T("untitled.bmp"),NULL,strFilter);
if ( IDOK != dlg.DoModal())
return;

// 文件名
CString strFileName;
strFileName = dlg.m_ofn.lpstrFile;// 如"D:\1.jpg"

// 图像保存
HRESULT hResult = image.Save(strFileName);
if (FAILED(hResult))
MessageBox(_T("保存图像文件失败!"));