24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 245  |  回复: 1
当前主题已经存档。

yyxhhx

金虫 (小有名气)

[交流] 【转帖】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,即全屏显示。

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

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yyxhhx

金虫 (小有名气)

不要回帖了 本人退出了,没空
2楼2009-08-29 13:01:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 yyxhhx 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿北京化工大学材料与化工(085600)296求调剂 +12 稻妻小编 2026-03-26 12/600 2026-03-29 01:04 by 我是小康
[考研] 一志愿武汉理工,总分321,英一数二,求老师收留。 +7 nnnnnnn5 2026-03-25 7/350 2026-03-29 00:32 by 我是小康
[考研] 0856求调剂 +6 楒桉 2026-03-28 6/300 2026-03-29 00:31 by 544594351
[考研] 22408 359分调剂 +4 Qshers 2026-03-27 5/250 2026-03-28 21:26 by zhq0425
[考研] 生物学学硕,一志愿湖南大学,初试成绩338 +6 YYYYYNNNNN 2026-03-26 7/350 2026-03-28 20:52 by 唐沐儿
[考研] 311(085601)求调剂 +4 liziyeyeye 2026-03-28 4/200 2026-03-28 18:50 by 535743368
[考研] 321求调剂 +6 璞玉~~ 2026-03-25 7/350 2026-03-28 17:48 by 璞玉~~
[考研] 085600,材料与化工321分求调剂 +9 大馋小子 2026-03-28 9/450 2026-03-28 14:56 by 神马都不懂
[考研] 0703本科郑州大学求调剂 +3 nhj_ 2026-03-25 3/150 2026-03-28 13:24 by Iveryant
[考研] 311求调剂 +4 冬十三 2026-03-24 4/200 2026-03-28 13:17 by 唐沐儿
[考研] 299求调剂 +7 嗯嗯嗯嗯2 2026-03-27 7/350 2026-03-28 13:09 by 唐沐儿
[考研] 286求调剂 +4 丢掉懒惰 2026-03-27 7/350 2026-03-28 08:07 by baoball
[考研] 291求调剂 +6 HanBeiNingZC 2026-03-24 6/300 2026-03-28 07:55 by baoball
[考研] 275求调剂 +10 jjjjjjjjjjl 2026-03-27 10/500 2026-03-27 23:47 by barnett0632
[考研] 265求调剂 +8 小木虫085600 2026-03-27 8/400 2026-03-27 22:16 by 无际的草原
[考研] 324求调剂 +5 hanamiko 2026-03-26 5/250 2026-03-27 10:33 by wangjy2002
[考研] 求调剂323材料与化工 +7 1124361 2026-03-24 7/350 2026-03-27 10:22 by wangjy2002
[考研] 材料调剂 +8 匹克i 2026-03-23 8/400 2026-03-27 08:11 by hypershenger
[考研] 324求调剂 +8 hanamiko 2026-03-26 10/500 2026-03-27 08:06 by hypershenger
[考研] 一志愿吉林大学材料与化工303分求调剂 +4 为学666 2026-03-24 4/200 2026-03-25 11:27 by BruceLiu320
信息提示
请填处理意见