0 前言
BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB)。两者的主要区别:
24位的DDB图像只能绘制到每像素24位的显示系统上(二值图像例外,可以绘制到任何配置的显示系统上);
24位的DIB则不一样,可以绘制到每像素8位、16位、24位和32位的显示系统上。当颜色深度不匹配时,颜色匹配算法被使用,以获取最好的颜色匹配。例如被绘制到8位显示系统上的24位DIB必须减少为显示系统中可用的256色。当DIB被绘制到屏幕上时,颜色减少操作在绘图过程中执行,并不影响内存中的DIB数据,唯一的缺点就是性能大大降低。因此,当性能是主要关注的对象时,不应该使用DIB,最好使用DDB。另外,DIB图像一般保存为BMP格式的文件!因此,以下讨论的是DIB。
位图采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
BMP文件主要有4部分组成:1、文件头;2、位图信息头;3、颜色表;4、图形数据。
1 数据结构
1.1 文件头(14字节)
typedef struct tagBITMAPFILEHEADER { WORD bfType; // 位图文件的类型,必须为BM(1-2字节) DWORD bfSize; // 位图文件的大小,以字节为单位(3-6字节) WORD bfReserved1; // 位图文件保留字,必须为0(7-8字节) WORD bfReserved2; // 位图文件保留字,必须为0(9-10字节) DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位(11-14字节) } BITMAPFILEHEADER;1.2 位图信息头(40字节)
用于说明位图的尺寸等信息:
typedef struct tagBITMAPINFOHEADER { DWORD biSize; // 本结构所占用字节数(15-18字节) LONG biWidth; // 位图的宽度,以像素为单位(19-22字节) LONG biHeight; // 位图的高度,以像素为单位(23-26字节) WORD biPla