「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
位图编码构成
位图文件主要分为如下4个部分:
以颜色位值为4,16色图像为例
本例以biBitCount=4为例,14+40+16x4+(32x1)/2=134
位图的十六进制数据如下
Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
00000000 42 4D 86 00 00 00 00 00 00 00 76 00 00 00 28 00
00000016 00 00 20 00 00 00 01 00 00 00 01 00 04 00 00 00
00000032 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000048 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 55
00000064 FF 00 00 00 FF 00 55 00 FF 00 AA 00 FF 00 FF 00
00000080 FF 00 FF 00 AA 00 FF 00 55 00 FF 00 00 00 FF 55
00000096 00 00 FF AA 00 00 FF FF 00 00 AA FF 00 00 55 FF
00000112 00 00 00 FF 00 00 02 03 04 05 06 07 08 09 0A 0B
00000128 0C 0D 0E 0F 13 28
文件信息头
WORD bfType【位图文件的类型,必须为BM(0-1,占2字节)】 :0x4d 42
DWORD bfSize【位图文件的大小(2-5,占4字节)】:0x00 00 00 86,转化为十进制为134,位图大小共134字节
WORD bfReserved1【位图文件保留字,必须为0(6-7,2字节)】:0x00 00
WORD bfReserved2:0x00 00
DWORD bfOffBits:0x00 00 00 00 76,转化为十进制为118,从118字节开始就是颜色索引数组
位图信息头
DWORD biSize:0x00 00 00 28,转化为十进制为40,位图信息头共占40字节
LONG biWidth:0x00 00 00 20,转化为十进制为32,位图的宽度为32像素
LONG biHeight:0x00 00 00 01,转化为十进制为1,位图高度为1像素
WORD biPlanes:0x00 01,平面数为1
WORD biBitCount:0x00 04,每个像素所需的位数为4
DWORD biCompression:0x00 00 00 00,不压缩
DWORD biSizeImage:0x00 00 00 00,实际位图数据占用的字节数
LONG biXPelsPerMeter:0x00 00 00 00
LONG biYPelsPerMeter:0x00 00 00 00·
DWORD biClrUsed:0x00 00 00 00 00
DWORD biClrImportant:0x00 00 00 00 00
颜色表,RGBQUAD阵列,又称调色板
Color table:
0 00 00 00 00 黑色
1 ff ff ff 00 白色
2 00 55 ff 00 橘色
3 00 00 ff 00 红色
4 55 00 ff 00
5 aa 00 ff 00
6 ff 00 ff 00
7 ff 00 aa 00
8 ff 00 55 00
9 ff 00 00 00 蓝色
A ff 55 00 00
B ff aa 00 00
C ff ff 00 00
D aa ff 00 00
E 55 ff 00 00
F 00 ff 55 00 绿色
颜色索引数组
00000112 00 00 00 FF 00 00 02 03 04 05 06 07 08 09 0A 0B
00000128 0C 0D 0E 0F 13 28
首先,我们要知道
位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
因为本例中biBitCount=4,所以2个像素占一个字节。又因为位图宽度为32,高度为1,即本例为32*1的位图。所以颜色索引数组所占字节数应为32*1/2=16字节。
如上,16个字节就是蓝色所标字节。由于2个像素占一个字节,一个字节占8个bit,我们把一个字节拆为高4位和低4位。比如取到的第一个字节为02,那么可以拆分为0000和0002。这两个索引去颜色表中查找。第一个0取到的是黑色,第二个2取到的是橘色。位图高(位图信息头里的biHeight),为正,表示从下往上存储,左下角是起点。所以我们的图片像素点如下,第一个是黑色,第二个是橘色。如果位图高为2,那么会在上面再加一行。还是左起。