typedef struct tagBITMAP { // bm |
498)this.style.width=498;" border=0>
(2) 调色板数据
Windows将BMP图像文件的调色板数据结构命名为RGBQUAD,该结构描述组成一个颜色的红、绿、蓝相对强度值。其数据结构如 下:
498)this.style.width=498;" border=0>
还 有一个重要的数据结构BITMAPINFO,该结构由前面介绍的BITMAPINFOHEADER和RGBQUAD结构组成,它提供了 WindowsDIB的大小和颜色的完整定义。因此也可这样说,DIB位图由两个不同的部分组成:描述位图大小和颜色的BITMAPINFO结构和定义位 图像素的字节数组,BITMAPINFO的结构如下:
498)this.style.width=498;" border=0>
(3) 不压缩图像数据
BMP图像文件对图像数据有三种处理方式:
不压缩数据,任何BMP图像文件都能以这种方式处理。
RLE4压缩法, 这是专用于16色图像数据的压缩方法。
RLE8压缩法,只用于压缩处理256色图像数据。
不压缩图像数据是BMP图像文件的通用处理方 式。虽然这种做法会使得BMP图像文件的大小大与其他有压缩处理的图像文件,但是少了压缩和解压缩的过程,也让BMP图像文件的读或存取文件的速度超过压 缩处理的图像文件。既然没有了压缩处理的文件,只要了解图像数据的排列及存储方式,必能正确地处理未压缩数据的BMP图像文件。
BMP图像文件内 的图像数据的排列顺序是以图像的左下角为起点,按照由左至右,由下至上的次序,将图像数据一点一点存入文件的。图像数据的存储方式是:单色图像是以一个字 节记录8点;16色图像是一个字节记录两点,左边四个Bits存第一点,右边四个Bits存第二点;256色图像是一个字节记录一点;全彩色图像则是三个 字节记录一点,而以RGB,RGB,RGB…的次序排列下来。除此之外,BMP文件规定文件内每行字节的个数必须是4的倍数,若未达到4的倍数,必须在每 行的末端加上几个字节,以补足差额。
5.编写DIB类
由于MFC未提供DIB类,用户在使用DIB时 将面临繁重的Windows API编程任务。幸运的是,Visual C++提供了一个较高层次的API,简化了DIB的使用。这些API函数实际上是由MFC的DibLook例程提供的,它们位于DibLook目录下的 dibapi.cpp、myfile.cpp和dibapi.h文件中,主要包括:
ReadDIBFile:把DIB文件读入内存。
SaveDIB: 把DIB保存到文件中。
CreateDIBPalette:从DIB中创建一个逻辑调色板。
PaintDIB:显示DIB。
DIBWidth: 返回DIB的宽度。
DIBHeight:返回DIB的高度。
【实例5-2】 图片浏览器
光 盘路径 /05/picture/
实例目的 创建一个图片的浏览器
本实例可以通过“打开”对话框打开一个指定的图片文件,并可以 对图片进行放大/缩小观察,当图片大小超出窗口时还可以显示滚动条以方便查看。
1.创建工程
启动 Microsoft Visual Studio 6.0,在IDE中依次选择“File?癗ew”菜单命令,或直接按快捷键“Ctrl+N”,打开“New”对话框。
在“New”对话框中单击 “Projects”选项卡,在列表框中选择“MFC AppWizard(.exe)”项,在“Project name”文本框中输入“picture”,其他使用默认值,单击“OK”按钮,弹出“MFC AppWizard-Step1”对话框。
在“MFC AppWizard-Step1”对话框中,选中“Single Document”单选框,其他使用默认值,然后单击“Next”按钮,在最后的“MFC AppWizard-Step6 of 6”对话框中选择视图基类为CScrollView,如图5-33所示。然后单击“Finish”按钮,在弹出的“New Project Information”对话框中单击“OK”按钮,就可以完成工程的创建。
498)this.style.width=498;" border=0>
图5-33 “MFC AppWizard-Step6 of 6”对话框
2.添加菜单项
在工作区中选 择的Resource View标签,转到资源编辑窗口,双击“Menu? IDR_MAINFRAME”条目打开该菜单资源的编辑界面。
单击 “查看”菜单,双击弹出的菜单项中选择最下面的空白菜单,在弹出的属性对话框中,选中“Pop-up”选项,在Caption文本框中输入:背景缩放。如 图5-34所示。
498)this.style.width=498;" border=0>
图5-34 背景缩放属性框
设置完背景缩放菜单项后就自动弹出菜单项,用 的方法设置弹出的菜单项,各菜单选项的属性如表5-4所示,设置完菜单的界面如图5-35所示。
498)this.style.width=498;" border=0>
498)this.style.width=498;" border=0>
3. 添加响应函数
在IDE主菜单项中依次选择“View”→“Class Wizard”,打开“MFC ClassWizard”对话框,选择“Member Maps”选项卡,在“Project”下拉列表框中选择“picture”,在“Class name”下拉列表框中选择“CPictureView”。
在“Object IDs”下拉列表框中选择要添加响应控件的ID。
在 Message项中选中需要添加的消息,同时对话框的下部出现相应的提示。
单击“Add Function…”按钮,单击“OK”按钮就可以创建一个消息的处理函数,单击“Edit Code”按钮退出“ClassWizard”对话框,并自动定位在添加的函数上。
这里我们需要添加的响应函数如表5-5所示。添加完消息的 “MFC ClassWizard”对话框界面如图5-36所示。
498)this.style.width=498;" border=0>
498)this.style.width=498;" border=0>
图5-36 “MFC ClassWizard”对话框
4.添加类成员
为视图类 CPictureView添加函数和数据成员,如表5-6所示。
498)this.style.width=498;" border=0>
5. 编写代码
在视图类CPictureView的头文件PictureView.h中,CPictureView的类定义前输入以 下代码:
498)this.style.width=498;" border=0>
这 段代码给出了缩放标志取值的宏定义。
在CPictureView类的构造函数CPictureView()中输入以下代码:
498)this.style.width=498;" border=0>
该 段程序初始化数据,设置文件打开标志为false。
在CPictureView::GetBmp()函数中输入以下代码:
BOOL CPictureView::GetBmp(LPCTSTR lpszSourceName,CBitmap &bitmap)
498)this.style.width=498;" border=0>
程 序的第一行使用Windows API函数LoadImage()载入文件路径字符串lpszSourceName所指的位图文件。语句“bitmap.Detach();”用于将原来 载入的位图对象分离开来。语句“bitmap.Attach(hbmp);”使用成员函数Attach()将CBitmap类对象与载入的位图关联起来。
在 这里,函数LoadImage()将lpszName指定的文件以位图格式载入,如果要载入以资源形式存储于程序中的位图,可以将lpszName改为资 源ID。由于在GetBmp()函数的参数部分对bitmap是引用调用,因此,实际上这里将载入的位图对象与主调函数的实参联系起来。
在 void CPictureView::OnFileOpen()函数中输入以下代码:
498)this.style.width=498;" border=0>
这 段程序的开头定义了一个CFileDialog类对象dlg。CFileDialog类封装了Windows常用的文件对话框,提供了一种简单的与 Windows标准相一致的文件打开和文件存盘对话框功能。
在CPictureView::OnDraw()函数中输入如下代码:
498)this.style.width=498;" border=0>
498)this.style.width=498;" border=0>
这 段代码开头,用语句“bitmap.GetBitmap(&BMap);”取得位图的信息。中间的大段程序是对不同缩放条件进行判断,并取得缩放 后的图形大小。然后用语句“SetScrollSizes(MM_TEXT, sizeTotal);”重置滚动窗口的边界,使得当窗口小于图像大小时显示滚动条。
在各个菜单项命令消息处理函数中输入的代码如下:
498)this.style.width=498;" border=0>
498)this.style.width=498;" border=0>
在 CPictureView::OnEraseBkgnd()函数中输入以下代码:
498)this.style.width=498;" border=0>
6. 编辑并运行程序
编辑并运行程序,如图5-37所示。单击“文件”菜单下的“打开”菜单项,打开要浏览的图片。
498)this.style.width=498;" border=0>
图5-37 打开图片
单击“查看”菜单下的“背景缩放”菜单项,可以对图片进行相应的改变,如图5-38所示,就是对图片进行缩小。