Windows下的位图文件即我们通常所熟悉的BMP图片,其存储结构的格式可以在WINGDI.h文件中找到定义。BMP文件大体上分为四个部分:
1. 位图文件头(BITMAPFILEHEADER)
2. 位图信息头(BITMAPINFOHEADER)
3. 调色板(PALETTE)
4. 位图数据(IMAGEDATA)
根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。这里需要注意的是,对于调色板(也叫颜色查找表LUT(LookUpTable),索引表),不是每一种类型的位图都有的。对于24位的真彩色RGB位图,就是没有调色板的,原因:如果用调色板,总共有2的24次种颜色,所以表示每种颜色的索引也需要24位,和直接用3B来表示RGB数据一样,还得加上一个调色板的容量,完全是吃饱了撑着。所以调色板只是对于16,8,4,1位位深的位图来说的。
首先来看下256阶位图(位深度为8)的前两个部分数据。以下为16进制值:
图 一
1. BITMAPFILEHEADER(对应图一的0000H -- 000DH)
在WINGDI.h中该部分定义如下:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
前两个字节(42H,4DH)为ASCII码,代表BM,这是在Windows下BMP文件的标识符,对应结构体中的bfType;
接下来的四个字节(36H,75H,02H,00H )代表的是文件大小,这里高位在后,所以文件大小应该是27536H = 161078字节,对应结构体中的bfSize;
然后为四个字节的保留值,总为0,对应bfReserved1,bfReserved2;
最后四个字节(36H,04H,00H,