位图文件分为四部分:
(1)文件头(BITMAP FILE HEADER)
位图文件头(BITMAPFILEHEADER)是一个结构体,长度为14字节,定义为:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 文件类型,必须是0x4D42,即字符串"BM"
DWORD bfSize; //文件大小,包括BITMAPFILEHEADER的14个字节
WORD bfReserved1; // 保留字
WORD bfReserved2; // 保留字
DWORD bfOffBits; // 从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;
(2)信息头(BITMAP INFO HEADER)
位图信息头(BITMAPINFOHEADER)也是一个结构体,长度为40字节,定义为:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // 本结构的长度,为40
LONG biWidth; // 图象的宽度,单位是象素
LONG biHeight; // 图象的高度,单位是象素
WORD biPlanes; // 必须是1
WORD biBitCount; // 表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色)
DWORD biCompression; // 指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
DWORD biSizeImage; // 实际的位图数据占用的字节数,即 (biWidth × N)’ × biHeight,(biWidth × N)’是(biWidth × N) 按照4的整倍数调整后的结果,N是每个象素占用的字节数(如8位图为1、24位图为3等)
LONG biXPelsPerMeter; // 目标设备的水平分辨率,单位是每米的象素个数(注:一般填0)
LONG biYPelsPerMeter; // 目标设备的垂直分辨率,单位是每米的象素个数(注:一般填0)
DWORD biClrUsed; // 位图实际用到的颜色数,0表示颜色数为2^biBitCount
DWORD biClrImportant; // 位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;
(3)调色板(Palette)
调 色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有 biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; // 蓝色分量
BYTE rgbGreen; // 绿色分量
BYTE rgbRed; // 红色分量
BYTE rgbReserved; // 保留值
} RGBQUAD;
(4)实际的位图数据(Image Date)
对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值:
a.单色位图:用1bit就可以表示象素的颜色索引值;
b.16色位图:用4bit可以表示象素的颜色索引值;
c. 256色位图:1个字节表示1个象素的颜色索引值;
d.真彩色:3个字节表示1个象素的颜色R、G、B值。
此外,位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐。奇怪的是,位图文件中的数据是从下到上(而不是从上到下)、从左到右方式存储的。
调色板分析: