侧边栏壁纸
    • 累计撰写 302 篇文章
    • 累计收到 527 条评论
    图像处理入门-MFC打开BMP图片
    我的学记|刘航宇的博客

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

    刘航宇
    2021-07-02 / 0 评论 / 427 阅读 / 正在检测是否收录...

    第一步:新建项目"MFC应用程序",项目名为ShowBMP,在应用程序类型中选择"单个文档",点击"确定"
    Test
    Test
    第二步:向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)进入函数编辑.
    Test

    //**************文件打开****************//
    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
    }

    Test

    4
    图像处理中VS2019下载及其MFC环境配置
    « 上一篇 2021-07-06
    vs2019等版本完全安装到D盘方案-安装前必备
    下一篇 » 2021-06-30

    评论 (0)

    取消