原文:http://blog.sina.com.cn/s/blog_49dd59fe01011wbj.html
由四部分组成:
A.第一部分为位图文件头BITMAPFILEHEADER,它是一个结构体,定义如下:
typedef struct tagBITMAPFILEHEADER{
}BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节(WORD为无符号16位二进制整数,DWORD为无符号32位二进制整数)。
B.第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD
LONG
LONG
WORD
WORD
DWORD
LONG
LONG
DWORD
DWORD
} BITMAPINFOHEADER;
这个结构的长度是固定的,为40个字节(LONG为32为二进制整数)。
偏移
|
域的名称
|
长度/字节
|
内容
|
000Eh(14)
|
biSize
|
4
|
文件信息头的长度
40(28h):Windows
|
00012h(18)
|
biWidth
|
4
|
位图的宽度,以像素为单位
|
00016h(22)
|
biHeight
|
4
|
位图的高度,以像素为点为
|
001Ah(26)
|
Biplanes
|
2
|
位图的为平面数(该值总是为1)
|
001Ch(28)
|
biBitCount
|
2
|
每个像素的位平面数,有下面几种情况:
1:单色位图
4:16色位图
8:256色位图
16:16bit高彩色位图
24:24bit真彩色位图
32:32bit增强型真彩色位图
|
001Eh(30)
|
biCompression
|
4
|
压缩说明:
1:RLE8,使用8位RLE压缩方式(用BI_RLE8表示)
2:RLE4,使用4位RLE压缩方式(用BI_RLE4表示)
3:Bitfields:位域存放方式(用BI_BITFIELDS表示)
|
0022h(34)
|
biSizeImage
|
4
|
位图数据的大小,以字节为单位。该数必须是4的倍数。当图像存储的是非压缩数据的时候,它的取值可以为0,实际上,此时位图数据的大小可以通过biBitCount,biWidth,biHeight等计算出来
|
0026h(38)
|
biXPelsPerMeter
|
4
|
用像素/米表示的水平分辨率
|
002Ah(42)
|
biYPelsPerMeter
|
4
|
用像素/米表示的垂直分辨率
|
002Eh(46)
|
biClrUsed
|
4
|
位图使用的颜色数,如果为0则表示使用了全部可能的颜色
|
0032h(50)
|
biClrImportant
|
4
|
指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
|
C.第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。真彩色图像不需要调色板,BITMAPINFOHEADER后直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
{
} RGBQUAD;
D.第四部分是实际的图像数据,对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图像,图像数据就是实际的R、G、B值:
•对于2色位图:用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个
字节就可以表示8个像素;
•对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素;
• 对于256色位图,一个字节刚好可以表示1个像素;
色深24位的位图
★
★