【vc++精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了vc++精品源码-【精品】如何打开一幅图像 - 大学课件的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
详解用 VC 实现 bmp 位图的打开2008-04-24 16:34 详解用 VC 实现 bmp 位图的打开我最近在学 VC数字图像处理,作为一个初学者,万里长征的第一步当然是打开一幅图像,这几天一直在看怎么实现这一功能,虽说简单,但是如果这一步不能做到,那么下面也就无法进行了,所以我总结了一下这个过程,写出来供大家参考。
也希望大家多多批评啊。
这里我就不想介绍关于位图的理论内容了,只是写一下实现的部分。
0.准备工作创建一个 SDI,工程名 Test,“隐藏工具栏”和“打印和打印预览”取消了,不用那么复杂,简单点就行1.创建菜单创建两个菜单:Caption: 打开 ID: ID_FILE_OPENCaption: 显示原图 ID: IDM_YUANTU2.对打开菜单进行响应右键打开菜单,建立类向导,在 CTestDoc 类中,进行 COMMAND 响应,生成OnFileOpen 函数,代码如下:void CTestDoc::OnFileOpen // TODO: Add your command handler code here CFileDialog fileDlgTRUE//创建一个 CfileDialog 类对象 fileDlg,第一个参数 TRUE 为打开对话框,若为 FALSE,则为另存为 fileDlg.m_ofn.lpstrTitle图片打开对话框//设置打开对话框的标题 fileDlg.m_ofn.lpstrFilterBMP Files.bmp0.bmp00//设置打开的文件类型 ifIDOKfileDlg.DoModal //这个语句有两层意义,第一是dlg.DoModal作用是弹出 CPortDlg 对话框,第二层是 dlg.DoModalIDOK是你点击了对话框上的 OK 按钮就是说你同时做了上述两件事时就执行 if 语句后面的程序。
filename.Format sfileDlg.GetPathName//将完整路径通过Format 函数以字符串类型存入 filename 中★CDib.LoadFilefilename //注意这里 CDib 不是类,而是 CDib 类的对象,对象名称也为 CDib,千万不要弄混,类不能直接调用成员函数,而类的对象则可以调用其中,注意在 CTestDoc 类中,添加一个变量 filename,Cstring 类型该变量作用是保存所指定的文件的文件完整路径。
注意最后一行★。
这一句代码用来实现文件的读取(不含显示)。
这里用到了CDib 类的对象 CDib,因此需要在 CTestDoc.h 中添加 CDib 类的头文件include“Dib.h”并且在 CTestDoc 类中添加这个对象,类型 CDib变量名称 CDib。
然后执行 CDib 类的成员函数 LoadFile 来读取文件。
3.CDib 类的操作这是一个处理 DIB 位图的专用类,封装了一些相关的函数与变量,基类选为CObject 类。
在 Dib.h 中做如下声明:class CDib : public CObjectpublic: RGBQUAD m_pRGB BYTE m_pData UINT m_numberOfColorsBOOL m_valid BITMAPFILEHEADER bitmapFileHeader//定义了一个文件头结构体的对象 BITMAPINFOHEADER m_pBitmapInfoHeader//定义了一个指向信息头的结构体指针 BITMAPINFO m_pBitmapInfo//定义了一个结构体指针,BITMAPINFO 是一个包含有信息头,和调色板的结构体。
BYTE pDibDWORD sizechar m_fileName256//定义字符数组用来存放文件路径public:UINT GetNumberOfColorsUINT GetHeightUINT GetWidthDWORD GetSizevoid LoadFileconst char dibFileNameCDibvirtual CDibCDib.cpp 代码如下:CDib::CDib size0//构造函数初始化 sizeCDib::CDibGlobalFreePtrm_pBitmapInfo //详见说明1void CDib::LoadFileconst char dibFileName strcpym_fileNamedibFileName//将路径名称拷贝到 m_fileName 之中 CFile dibFilem_fileName CFile::modeRead//创建 CFile 类对象,只读方式 dibFile.ReadvoidbitmapFileHeadersizeofBITMAPFILEHEADER//读取文件头的内容 if bitmapFileHeader.bfType 0x4d42//判断是否为 bmp 格式,单步调试你会发现, 而 此时的 bfType 值并非 0x4d42, 是 19778.注意,这是十进制,只要转换成十六进制即为 0x4d42 DWORD fileLength dibFile.GetLength//读取文件的大小,你可以试试跟踪此值来看看它是否和你要打开的图片大小一致 size fileLength -sizeofBITMAPFILEHEA