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("保存图像文件失败!"));
【参考】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?