图像处理入门-MFC打开BMP图片
我的学记|刘航宇的博客

图像处理入门-MFC打开BMP图片

刘航宇
4年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2022年11月29日,已超过847天没有更新,若内容或图片失效,请留言反馈。

第一步:新建项目"MFC应用程序",项目名为ShowBMP,在应用程序类型中选择"单个文档",点击"确定"
图片[1] - 图像处理入门-MFC打开BMP图片 - 我的学记|刘航宇的博客
图片[2] - 图像处理入门-MFC打开BMP图片 - 我的学记|刘航宇的博客
第二步:向CShowBMPView类添加成员变量和成员函数.在右栏的"类视图"右键CShowBMPView添加函数或直接在ShowBMPView.h中直接添加public成员变量和成员函数.添加代码如下:

public:
    //成员变量
    CString BmpName;                               //保存图像文件文件名
    CString EntName;                               //保存图像文件扩展名
    CBitmap m_bitmap;                              //创建位图对象
    //成员函数
    void ShowBitmap(CDC* pDC, CString BmpName);    //用来显示指定位图bmp的函数

第三步:设置打开BMP图片函数.“项目”->“类向导”->选择"类名"CShowBMPView->在命令对象ID中双击"ID_FILE_OPEN"->自动生成默认成员函数OnFileOpen,消息为COMMAND.双击成员函数(Member Functions)进入函数编辑.
图片[3] - 图像处理入门-MFC打开BMP图片 - 我的学记|刘航宇的博客

//**************文件打开****************//
void CShowBMPView::OnFileOpen()
{
    //四种格式的文件:bmp gif jpg tiff
    CString filter;
    filter = "所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||";
    CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL);
    //按下确定按钮 dlg.DoModal() 函数显示对话框
    if (dlg.DoModal() == IDOK)
    {
        BmpName = dlg.GetPathName();     //获取文件路径名   如D:\pic\abc.bmp
        EntName = dlg.GetFileExt();      //获取文件扩展名
        EntName.MakeLower();             //将文件扩展名转换为一个小写字符
        Invalidate();                    //调用该函数就会调用OnDraw重绘画图
    }
}

第四步:在ShowBMPView.cpp中编写void CShowBMPView::ShowBitmap(CDC *pDC, CString BmpName)函数,即“二.显示BMP图片基本步骤”.同时通过OnDraw()函数调用ShowBitmap()函数显示图片.代码如下:

void CShowBMPView::OnDraw(CDC* pDC)
{
    CShowBMPDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码
    if (EntName.Compare(_T("bmp")) == 0)      //bmp格式
    {
        ShowBitmap(pDC, BmpName);               //显示图片
    }
}

第五步:添加“显示BMP格式图片”函数。

void CShowBMPView::ShowBitmap(CDC *pDC, CString BmpName)
{
    //定义bitmap指针 调用函数LoadImage装载位图
    HBITMAP m_hBitmap;
    m_hBitmap = (HBITMAP)LoadImage(NULL, BmpName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION);

    /*************************************************************************/
    /* 1.要装载OEM图像,则设此参数值为0  OBM_ OEM位图 OIC_OEM图标 OCR_OEM光标
    /* 2.BmpName要装载图片的文件名
    /* 3.装载图像类型:
    /*   IMAGE_BITMAP-装载位图 IMAGE_CURSOR-装载光标 IMAGE_ICON-装载图标
    /* 4.指定图标或光标的像素宽度和长度 以像素为单位
    /* 5.加载选项:
    /*   IR_LOADFROMFILE-指明由lpszName指定文件中加载图像
    /*   IR_DEFAULTSIZE-指明使用图像默认大小
    /*   LR_CREATEDIBSECTION-当uType参数为IMAGE_BITMAP时,创建一个DIB项
    /**************************************************************************/

    if (m_bitmap.m_hObject)
    {
        m_bitmap.Detach();           //切断CWnd和窗口联系
    }
    m_bitmap.Attach(m_hBitmap);      //将句柄HBITMAP m_hBitmap与CBitmap m_bitmap关联

    //边界
    CRect rect;
    GetClientRect(&rect);

    //图片显示(x,y)起始坐标
    int m_showX = 0;
    int m_showY = 0;
    int m_nWindowWidth = rect.right - rect.left;   //计算客户区宽度
    int m_nWindowHeight = rect.bottom - rect.top;  //计算客户区高度

    //定义并创建一个内存设备环境DC
    CDC dcBmp;
    if (!dcBmp.CreateCompatibleDC(pDC))   //创建兼容性的DC
        return;

    BITMAP m_bmp;                          //临时bmp图片变量
    m_bitmap.GetBitmap(&m_bmp);            //将图片载入位图中

    CBitmap *pbmpOld = NULL;
    dcBmp.SelectObject(&m_bitmap);         //将位图选入临时内存设备环境

    //图片显示调用函数stretchBlt
    pDC->StretchBlt(0, 0, m_bmp.bmWidth, m_bmp.bmHeight, &dcBmp, 0, 0, m_bmp.bmWidth, m_bmp.bmHeight, SRCCOPY);

    /*******************************************************************************/
    /* BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,
    /*                 int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop );
    /* 1.参数x、y位图目标矩形左上角x、y的坐标值
    /* 2.nWidth、nHeigth位图目标矩形的逻辑宽度和高度
    /* 3.pSrcDC表示源设备CDC指针
    /* 4.xSrc、ySrc表示位图源矩形的左上角的x、y逻辑坐标值
    /* 5.dwRop表示显示位图的光栅操作方式 SRCCOPY用于直接将位图复制到目标环境中
    /*******************************************************************************/

    dcBmp.SelectObject(pbmpOld);           //恢复临时DC的位图
    DeleteObject(&m_bitmap);               //删除内存中的位图
    dcBmp.DeleteDC();                      //删除CreateCompatibleDC得到的图片DC
}

图片[4] - 图像处理入门-MFC打开BMP图片 - 我的学记|刘航宇的博客

© 版权声明
THE END
喜欢就支持一下吧
点赞 4 分享 赞赏
评论 抢沙发
取消