注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

慵懒的乌龟

——若有,且珍惜~

 
 
 

日志

 
 

VC|MFC实现打开BMP JPG或GIF图片  

2011-12-09 15:44:46|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
怎么利用MFC实现打开任意路径的图片:
  源文件下载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,即全屏显示。

好了,就这样吧,有问题请直接在评论里说明,希望能得到朋友们的反馈信息。


Form:http://hi.baidu.com/longchengjiang/blog/item/f02e310857e5ded962d98614.html


  评论这张
 
阅读(1713)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017