24小时热门版块排行榜    

Znn3bq.jpeg
查看: 247  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 面上本子正文33页,违规吗?会被低分嘛? +7 1234567wang 2026-05-17 8/400 2026-05-18 15:07 by gy116024
[基金申请] 国自然上会要求 +3 无名者登山 2026-05-18 5/250 2026-05-18 14:16 by bnullh
[硕博家园] 考博自荐 +5 科研狗111 2026-05-13 6/300 2026-05-18 11:22 by 糊糊涂涂好
[基金申请] 青C资助名额大幅增加! +12 西葫芦炒鸡蛋 2026-05-13 16/800 2026-05-18 10:02 by Equinoxhua
[基金申请] 重磅!青年科学基金项目(C类)资助增幅预计超过50% +7 水和泥不是水泥 2026-05-13 10/500 2026-05-18 07:50 by 水和泥不是水泥
[公派出国] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 v9tggjlwd0 2026-05-15 5/250 2026-05-17 18:39 by Equinoxhua
[考博] 2026博士还有哪些学校有名额 +6 小王求读研 2026-05-15 7/350 2026-05-17 16:54 by 知音湖畔
[考博] 26/27博士推荐 +3 1木头人13949 2026-05-13 3/150 2026-05-17 09:41 by YuY66
[考研] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 v9tggjlwd0 2026-05-15 4/200 2026-05-17 08:11 by 11n4dfd8yn
[考博] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 7hlccowb3h 2026-05-15 4/200 2026-05-17 07:46 by 11n4dfd8yn
[考研] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 l7k6xnh0yc 2026-05-14 8/400 2026-05-17 07:26 by 11n4dfd8yn
[公派出国] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +6 l7k6xnh0yc 2026-05-14 6/300 2026-05-17 07:16 by 11n4dfd8yn
[公派出国] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 x0mp7owy2b 2026-05-15 4/200 2026-05-17 00:35 by ue3ir18jc3
[考博] 现在不知道怎么办,感觉很痛苦 +5 qweww 2026-05-11 6/300 2026-05-16 19:57 by Equinoxhua
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 x0mp7owy2b 2026-05-15 4/200 2026-05-16 17:45 by j6b2pdz07o
[有机交流] 求有机合成大神指点三硫酸乙烯酯(CAS:2793408-99-6)的合成路线 30+3 Leekmid 2026-05-13 10/500 2026-05-16 16:37 by czyzsu
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 k37jurhrau 2026-05-16 3/150 2026-05-16 13:57 by vcdazktkjx
[考博] 26应届毕业生考博求助 +3 wo一定上岸 2026-05-13 3/150 2026-05-14 21:47 by 明海天涯
[考博] 材料类只有一篇综述能申博么 +4 乐逍遥谷 2026-05-13 4/200 2026-05-14 12:05 by zhyzzh
[论文投稿] 求助大佬sci投稿哪个好中 +3 江沅188 2026-05-12 4/200 2026-05-13 14:35 by 江沅188
信息提示
请填处理意见