1  BMP 文件的结构
在进行图像处理
程序设计时,常用到Windows 位图文件(即BMP 文件) 。Windows 位图
是映射到显示像素的位阵列,它有两种类型: GDI 位图和DIB。GDI 位图又称DDB ,是设备相
关的,其位的排列取决于显示设备,而DIB 是设备无关的,它具更强的灵活性与完整的图像数
据、压缩方式等定义,既可以存放在于内存也可以以文件形式保存在磁盘上(BMP 文件) 。对
于内存中DIB ,它包含两部分信息: (1) 位图信息(BITMAPINFO) ,包括位图信息头和颜色表;
(2) 位图数据,而对于BMP 文件则还要加上位图文件头。
BITMAPFIL EHEADER 结构中含有文件类型、文件长度和位图数据在文件内的起始位置
等信息,BITMAPINFOHEADER 结构包含位图高度和宽度、位平面数、每像素所占bit 数、颜
色表项数、位图压缩类型等信息,RGBQUAD 结构给出的颜色表是该位图图像使用的调色板,
并非所有BMP 位图都有颜色表,这可由BITMAPINFOHEADER 结构的biBitCount (每像素所
占bit 数) 成员来区别,biBitCount 为1 (黑白二色图) 、4 (16 色图) 、8 (256 色图) 时由颜色表项数
指出颜色表大小,biBitCount 为16 (16 位色图) 、24 (真彩色图) 、32 (32 位色图) 时没有颜色表。
这些信息正是在对位图处理和显示时所需的。
类库使用封装了Windows API 函数的设备相关类CDC 和GDI 对象类CBitmap 来操作位图,
但CBitmap 类必须在应用编译时将BMP 位图装入资源中,在应用运行时由其成员函数及
CDC 类的成员函数操作它。BMP 文件装入资源后被转换为DDB ,类Cbitmap 正是对一系列
DDB 操作的API 函数的封装。但将位图装入资源导致可执行文件增大且只能使用资源中有
限的位图,无法选取其它位图。为此,在图像处理
程序设计时就必须直接操作BMP 位图文
件,这可通过VC 的MFC 和Windows API 函数实现:CFile 类的成员函数可打开BMP 文件并
读入内存; CPalette 类成员函数CreatePalette ( ) 创建调色板; Windows API 函数
CreateDIBSection() 创建兼容位图; CDC 类成员函数CreateCompatibleDC ( ) 、SelectObject ( ) 、
Select Palette () 、RealizePalette () 、和BitBlt () 分别是创建兼容设备描述表、将位图选进兼容DC、
选择调色板、及实现调色板及显示位图。
3  BMP 文件的几种显示方法
3. 1  直接写像素
Visual C + + 的CDC 类有一个成员函数Set Pixel ( int x , int y , COLORREF crColor ) 可以
直接在视区坐标(x ,y) 点设置成所要显示的颜色crColor 。只要在OnDraw ( ) 中加入循环写点
颜色代码即可,如:
for (x = 0 x < nWidth x + + )
for (y = 0 y < nHeight y + + )
pDC - > Set Pixel (x ,y ,nColor)
BMP 位图文件可在文档序列化过程中加载到内存并由其头部信息计算出位图宽度
nWidth 和高度nHeight 以及各像素点的颜色值nColor 。这种方法简单,不用涉及复杂的调色
板操作,但显示速度慢且可看出写点过程。
3. 2  从资源中装入位图
在VC 开发环境的资源编辑器里可将要显示的BMP 位图文件加载到资源中,并用资源
ID