| 查看: 229 | 回复: 1 | |||
| 当前主题已经存档。 | |||
[交流]
【转帖】VC实现打开BMP JPG或GIF图片
|
|||
|
VC实现打开BMP JPG或GIF图片(二)|VC/MFC/打开图片2008-07-18 13:06 之前写过一篇文章关于VC中打开图片文件的文章,那个不是很好理解,里面有些地方显得有点乱,这个版本的要容易理解一点,不多说了,我们开始吧。 源文件下载:ShowBitmap.rar 1、新建一个单文档的应用程序,项目名称为ShowBitmap 2、为CShowBitmapView类添加下述成员变量和成员函数:其中CImage m_MyImage需要头文件"atlimage.h"的支持,或者你可以用向导来加这个变量,那么头文件会自动添加的,我们这里手动在CShowBitmapView.h中加入#include "atlimage.h",一定要记得加这个。 //参数定义 public: CString strPicPath; //打开的图片文件文件名 CString extname; //打开的图片文件的扩展名 CBitmap m_bitmap; //创建位图对象 CImage m_MyImage; //用于读取与显示jpg等格式的图像文件 void ShowBitmap(CDC* pDC,CString strPicPath); //用来显示指定位图的函数 void ShowPic(CDC* pDC,CString picName); 3、为ID_FILE_OPEN消息添加响应函数(具体怎么加就不细说了),编写该函数(代码如下) void CShowBitmapView::OnFileOpen() { //CFileDialog dlg(TRUE,_T("BMP" ,_T("*.BMP" ,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP;*.jpg)|*.BMP;*.jpg|" );CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("图片文件(*.jpg;*.jpeg;*.gif;*.bmp)|*.jpg;*.jpeg;*.gif;*.bmp|位图文件(*.BMP)|*.BMP||" );if (IDOK==dlg.DoModal()) { strPicPath.Format(_T("%s" ,dlg.GetPathName());extname = dlg.GetFileExt(); //返回选定文件的扩展文件名 extname.MakeLower(); //将后缀名变成小写的 Invalidate(); } } 4、编写BMP图片显示函数 void CShowBitmapView::ShowBitmap(CDC* pDC,CString strPicPath) { HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strPicPath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); m_bitmap.Detach(); m_bitmap.Attach(hBitmap); CRect rect; GetClientRect(&rect); CDC dcImage; if (!dcImage.CreateCompatibleDC(pDC)) { return; } BITMAP bm; m_bitmap.GetBitmap(&bm); dcImage.SelectObject(&m_bitmap); //pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcImage,0,0,SRCCOPY); //图片保留原始大小 pDC->StretchBlt(0,0,rect.right,rect.bottom,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //图片拉伸显示,填满整个客户区 } 5、编写JPG等图片显示函数(此处未列出全屏查看图片的代码,需要这功能的话,请参看Draw函数的相关资料) void CShowBitmapView::ShowPic(CDC* pDC,CString strPicPath) { if(!m_MyImage.IsNull()) m_MyImage.Destroy(); HRESULT hResult=m_MyImage.Load(strPicPath); int iWidth=m_MyImage.GetWidth(); int iHeight=m_MyImage.GetHeight(); m_MyImage.Draw(pDC->m_hDC,0,0,iWidth,iHeight); } 6、修改OnDraw函数,实现图片的显示 void CShowBitmapView::OnDraw(CDC* pDC) { CShowBitmapDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; if (0 == extname.Compare(_T("bmp" )){ ShowBitmap(pDC,strPicPath); } else { if (0 == extname.Compare(_T("jpg" )||0 == extname.Compare(_T("jpeg" )||0 == extname.Compare(_T("gif" )){ ShowPic(pDC,strPicPath); } } 7、结束语: 感兴趣的朋友,可以把上面两个图片显示函数和OnDraw中的If语句部分合并成一个函数。希望本文能给你们带来点帮助,有什么问题的话也请指正。 8、补充: 程序中有点小问题就是,当图片拉伸显示的时候可能会出现失真的情况,一般是BMP格式的图片缩小、JPG文件拉伸时会失真,这时候在使用StretchBlt函数或者Draw函数前需要调用SetStretchBltMode函数,对于上面程序的修改方法是: 1)在ShowBitmap(CDC* pDC,CString strPicPath)函数中 pDC->StretchBlt(0,0,rect.right,rect.bottom,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);前面加入 pDC->SetStretchBltMode(STRETCH_HALFTONE); 2)在ShowPic(CDC* pDC,CString strPicPath)函数中 m_MyImage.Draw(pDC->m_hDC,0,0,rect.right,rect.bottom,0,0,iWidth,iHeight);前面加入 ::SetStretchBltMode(pDC->m_hDC,HALFTONE);或者 pDC->SetStretchBltMode(STRETCH_HALFTONE); 这里的Draw跟上面的有点不一样,这个实现了图片填满整个View,即全屏显示。 好了,就这样吧,有问题请直接在评论里说明,希望能得到朋友们的反馈信息 |
» 猜你喜欢
实验室接单子
已经有6人回复
假如你的研究生提出不合理要求
已经有11人回复
全日制(定向)博士
已经有5人回复
萌生出自己或许不适合搞科研的想法,现在跑or等等看?
已经有4人回复
Materials Today Chemistry审稿周期
已经有4人回复
参与限项
已经有3人回复
对氯苯硼酸纯化
已经有3人回复
求助:我三月中下旬出站,青基依托单位怎么办?
已经有12人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
2楼2009-08-29 13:01:46












,_T("*.BMP"
回复此楼