主题:[原创]位图文件的数据结构
位图文件的数据结构
一、文件的组成
Bmp 文件由文件头、位图信息头、调色板、数据区等四个部分组成(真彩位图没有调色板,由三个部分组成),结构如下(在以下所有表格中,偏移量和长度的单位均为字节,括号外为10进制,括号内为16进制):
表一:BMP文件的总体结构
--------------------------------------------------------
偏移量 长度 说明
--------------------------------------------------------
1.BMP文件头 000(000) 14
2.BMP信息头 014(00E) 40
3.调色板 054(036) 8—1024 8=单色,1024=256色
4.位图数据 又称位图点阵
--------------------------------------------------------
说明:
1.上表中1-3部分合称DIB文件头,而2、3两部分又合称为位图信息。
2.对于单色、16色、256色位图来说,调色板存放的是实际颜色的RGB值,而位图点阵存放的是颜色对应的索引值。
3.真彩位图没有调色板,在位图点阵存放的是实际颜色的RGB值。
下面详述各部分的结构。
㈠BMP文件头结构见表二
表二:BMP文件头结构
--------------------------------------------------------------
偏移量 长度 描述 值 说明
--------------------------------------------------------------
000(000) 2 文件类型 424D “BM”的 ASCII 码
002(002) 4 文件大小 以字节为单位
006(006) 4 保留 00 00 00 00 必须为0
010(00A) 4 位图点阵偏移量
--------------------------------------------------------------
说明:位图点阵偏移量=表一所述的1—3部分长度之和
㈡BMP信息头结构见表三
表三:BMP信息头结构:
------------------------------------------------------------------------------
偏移量 长度 描述 值(16进制)
------------------------------------------------------------------------------
014(00E) 4 BMP 信息头结构长度 28 00 00 00(10进制=40)
018(012) 4 图像宽度
022(016) 4 图像高度
026(01A) 2 位面板数 01 00(必须=1)
028(01C) 2 每象素所占位数 04 00(有6个可能值:1/4/8/10/18/20)
030(01E) 4 象素数据的压缩类型 00 00 00 00(0表示未压缩)
034(022) 4 位图点阵的长度
038(026) 4 设备水平分辨率
042(02A) 4 设备垂直分辨率
046(02E) 4 有效颜色数 00 00 00 00(调色板中实际使用的颜色索引
的个数,O表示全要使用)
050(032) 4 重要的颜色索引个数 00 00 00 00(0表示所有颜色均重要)
------------------------------------------------------------------------------
说明:
1.上表中的长度数据,遵循“低位在前,高位在后”的原则。并且,凡长度字节数为 2的数据,其数据类型为Integer,字节数为4的数据,其数据类型为Long。
2.位图点阵长度说明的是图象的大小,而不是整个位图文件的大小。
3.每象素所占位数是指象素在位图中所占的字节位数(1个字节=8位),01表示单色位图(黑白位图),04表示16色位图,08表示256色,10表示16位加强彩色,18表示24位真彩,20表示32位真彩。
4.设备水平分辨率和垂直分辨率的单位是:像素/米,实在不知微软为何弄了“米”来做单位,难怪大多数BMP图片的这两个参数都=0。
㈢调色板的结构见表四——表六
表四:调色板的结构
------------------------
颜色 长度 说明
------------------------
蓝(B) 1 蓝色分量
绿(G) 1 绿色分量
红(R) 1 红色分量
保留 1 未用,=0
------------------------
说明:
1.单色位图调色板存放着黑色和白色两种颜色值,位图点阵区由1、0两个索引值组成。16色位图调色板存放着16种颜色值,位图点阵区由 0——15的索引值组成。256色位图调色板存放着256种颜色值,位图点阵区存放着0——255的索引值。
2.由于在调色板中,每种颜色均由蓝、绿、红三个分量组成,加上一个保留字节,所以每种颜色需占用4个字节。
表五:三种位图的调色板数据
-----------------------------------
图标规格 偏移量 长度
-----------------------------------
单色 054(036) 8(4×2)
16色 054(036) 64(4×16)
256色 054(036) 1024(4×256)
-----------------------------------
表六:VB常用的调色板索引值以及对应的颜色值
----------------------------
颜色 索引值 颜色值
----------------------------
单色位图:
黑色 0 00 00 00 00
白色 1 FF FF FF 00
16色位图:
黑色 0 00 00 00 00
深红 1 00 00 80 00
深绿 2 00 80 00 00
深黄 3 00 80 80 00
深蓝 4 80 00 00 00
深紫 5 80 00 80 00
深青 6 80 80 00 00
深灰 7 80 80 80 00
浅灰 8 C0 C0 C0 00
红色 9 00 00 FF 00
绿色 A 00 FF 00 00
黄色 B 00 FF FF 00
蓝色 C FF 00 00 00
紫色 D FF 00 FF 00
青色 E FF FF 00 00
白色 F FF FF FF 00
----------------------------
说明:
1.每种颜色值占用4个字节,最后一个字节未用。
2.表三中所说的“每象素所占位数”是指一个像素在位图中所占的字节位数,如果=1, 表示一个像素占用 1位,一个字节可表示8个像素,我们称之为单色位图(黑白位图);如果=4,表示一个像素占用4位,一个字节可表示2个像素,我们称之为16色位图;如果=8,表示一个像素占用8位,一个字节只表示一个像素,我们称之为256色位图。
3.怎么个对应法呢?举个例来说,比如16色位图的位图点阵区中,某个字节值为81,那就表示该字节所对应的 2个象素,左边的象素索引值=8,对应的颜色为浅灰色,而右边的象素索引值=1,对应的颜色为深红色。
㈣位图点阵的结构
1.未经压缩的位图点阵数据是按扫描线从下至上存储的,而在每条扫描线中,是从左至右存储的,即图像的第一个像素值,在位图阵列的左下角,最后一个像素值在位图阵列的右上角。
2.使用调色板的位图,位图点阵区的数据字节高位表示靠左的像素。低位表示靠右的像素。
3.位图点阵区中,每一条扫描线的长度必须结束于32位的边界,也就是说,一条扫描线的字节长度必须能整除4,否则就要全0字节来补充。举例来说,如果一条扫描线有3个字节,那么就要用空白的1个字节来补充成4字节,如果有6个字节,那么就必须用空白的2个字节来补充成8字节。
4.位图宽度与扫描线长度的对应关系见表七——表十(图象宽度单位:像素,扫描线长度单位:字节)
表七:单色位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1—32 4
33—64 8
65--96 12
97--120 16
……
----------------------
表八:16色位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1— 8 4
9—16 8
17--24 12
25--32 16
33--40 20
41--48 24
49--56 28
57--64 32
65--72 36
71--80 40
……
----------------------
表九:256色位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1— 4 4
5— 8 8
9—12 12
13—16 16
17--20 20
21--24 24
25--28 28
29--32 32
33--36 36
37--40 40
41--44 44
45--48 48
……
----------------------
表十:24位真彩位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1 4
2 8
3 12
4 12
5 16
6 20
7 24
8 24
9 28
10 32
11 36
12 36
13 40
14 44
15 48
16 48
17 52
18 56
19 60
20 60
21 64
22 68
23 72
24 72
……
----------------------
说明:
1.由以上4个表归纳出计算位图一条扫描线长度的VB代码如下∶
①单色位图每条扫描线长度=4×(图象宽\32+Abs((图象宽 Mod 32)>0))
②16色位图每条扫描线长度=4×(图象宽\8+Abs((图象宽 Mod 8)>0))
③256色位图每条扫描线长度=4×(图象宽\4+Abs((图象宽 Mod 4)>0))
④24位真彩位图每条扫描线长度=4×(图象宽×3\4+Abs((图象宽×3 Mod 4)>0))
2.知道了扫描线的长度和图像的高度,我们就可以轻松地计算出位图文件的大小。例如16×16的单色位图,查表七可知,扫描线长度=4,那么位图点阵的大小=高度×扫描线长度=16×4=64,查表五可知,调色板大小=8,查表一可知,BMP文件头大小=14,BMP信息头大小=40,所以,该位图文件的大小=64+8+14+40=126字节。
一、文件的组成
Bmp 文件由文件头、位图信息头、调色板、数据区等四个部分组成(真彩位图没有调色板,由三个部分组成),结构如下(在以下所有表格中,偏移量和长度的单位均为字节,括号外为10进制,括号内为16进制):
表一:BMP文件的总体结构
--------------------------------------------------------
偏移量 长度 说明
--------------------------------------------------------
1.BMP文件头 000(000) 14
2.BMP信息头 014(00E) 40
3.调色板 054(036) 8—1024 8=单色,1024=256色
4.位图数据 又称位图点阵
--------------------------------------------------------
说明:
1.上表中1-3部分合称DIB文件头,而2、3两部分又合称为位图信息。
2.对于单色、16色、256色位图来说,调色板存放的是实际颜色的RGB值,而位图点阵存放的是颜色对应的索引值。
3.真彩位图没有调色板,在位图点阵存放的是实际颜色的RGB值。
下面详述各部分的结构。
㈠BMP文件头结构见表二
表二:BMP文件头结构
--------------------------------------------------------------
偏移量 长度 描述 值 说明
--------------------------------------------------------------
000(000) 2 文件类型 424D “BM”的 ASCII 码
002(002) 4 文件大小 以字节为单位
006(006) 4 保留 00 00 00 00 必须为0
010(00A) 4 位图点阵偏移量
--------------------------------------------------------------
说明:位图点阵偏移量=表一所述的1—3部分长度之和
㈡BMP信息头结构见表三
表三:BMP信息头结构:
------------------------------------------------------------------------------
偏移量 长度 描述 值(16进制)
------------------------------------------------------------------------------
014(00E) 4 BMP 信息头结构长度 28 00 00 00(10进制=40)
018(012) 4 图像宽度
022(016) 4 图像高度
026(01A) 2 位面板数 01 00(必须=1)
028(01C) 2 每象素所占位数 04 00(有6个可能值:1/4/8/10/18/20)
030(01E) 4 象素数据的压缩类型 00 00 00 00(0表示未压缩)
034(022) 4 位图点阵的长度
038(026) 4 设备水平分辨率
042(02A) 4 设备垂直分辨率
046(02E) 4 有效颜色数 00 00 00 00(调色板中实际使用的颜色索引
的个数,O表示全要使用)
050(032) 4 重要的颜色索引个数 00 00 00 00(0表示所有颜色均重要)
------------------------------------------------------------------------------
说明:
1.上表中的长度数据,遵循“低位在前,高位在后”的原则。并且,凡长度字节数为 2的数据,其数据类型为Integer,字节数为4的数据,其数据类型为Long。
2.位图点阵长度说明的是图象的大小,而不是整个位图文件的大小。
3.每象素所占位数是指象素在位图中所占的字节位数(1个字节=8位),01表示单色位图(黑白位图),04表示16色位图,08表示256色,10表示16位加强彩色,18表示24位真彩,20表示32位真彩。
4.设备水平分辨率和垂直分辨率的单位是:像素/米,实在不知微软为何弄了“米”来做单位,难怪大多数BMP图片的这两个参数都=0。
㈢调色板的结构见表四——表六
表四:调色板的结构
------------------------
颜色 长度 说明
------------------------
蓝(B) 1 蓝色分量
绿(G) 1 绿色分量
红(R) 1 红色分量
保留 1 未用,=0
------------------------
说明:
1.单色位图调色板存放着黑色和白色两种颜色值,位图点阵区由1、0两个索引值组成。16色位图调色板存放着16种颜色值,位图点阵区由 0——15的索引值组成。256色位图调色板存放着256种颜色值,位图点阵区存放着0——255的索引值。
2.由于在调色板中,每种颜色均由蓝、绿、红三个分量组成,加上一个保留字节,所以每种颜色需占用4个字节。
表五:三种位图的调色板数据
-----------------------------------
图标规格 偏移量 长度
-----------------------------------
单色 054(036) 8(4×2)
16色 054(036) 64(4×16)
256色 054(036) 1024(4×256)
-----------------------------------
表六:VB常用的调色板索引值以及对应的颜色值
----------------------------
颜色 索引值 颜色值
----------------------------
单色位图:
黑色 0 00 00 00 00
白色 1 FF FF FF 00
16色位图:
黑色 0 00 00 00 00
深红 1 00 00 80 00
深绿 2 00 80 00 00
深黄 3 00 80 80 00
深蓝 4 80 00 00 00
深紫 5 80 00 80 00
深青 6 80 80 00 00
深灰 7 80 80 80 00
浅灰 8 C0 C0 C0 00
红色 9 00 00 FF 00
绿色 A 00 FF 00 00
黄色 B 00 FF FF 00
蓝色 C FF 00 00 00
紫色 D FF 00 FF 00
青色 E FF FF 00 00
白色 F FF FF FF 00
----------------------------
说明:
1.每种颜色值占用4个字节,最后一个字节未用。
2.表三中所说的“每象素所占位数”是指一个像素在位图中所占的字节位数,如果=1, 表示一个像素占用 1位,一个字节可表示8个像素,我们称之为单色位图(黑白位图);如果=4,表示一个像素占用4位,一个字节可表示2个像素,我们称之为16色位图;如果=8,表示一个像素占用8位,一个字节只表示一个像素,我们称之为256色位图。
3.怎么个对应法呢?举个例来说,比如16色位图的位图点阵区中,某个字节值为81,那就表示该字节所对应的 2个象素,左边的象素索引值=8,对应的颜色为浅灰色,而右边的象素索引值=1,对应的颜色为深红色。
㈣位图点阵的结构
1.未经压缩的位图点阵数据是按扫描线从下至上存储的,而在每条扫描线中,是从左至右存储的,即图像的第一个像素值,在位图阵列的左下角,最后一个像素值在位图阵列的右上角。
2.使用调色板的位图,位图点阵区的数据字节高位表示靠左的像素。低位表示靠右的像素。
3.位图点阵区中,每一条扫描线的长度必须结束于32位的边界,也就是说,一条扫描线的字节长度必须能整除4,否则就要全0字节来补充。举例来说,如果一条扫描线有3个字节,那么就要用空白的1个字节来补充成4字节,如果有6个字节,那么就必须用空白的2个字节来补充成8字节。
4.位图宽度与扫描线长度的对应关系见表七——表十(图象宽度单位:像素,扫描线长度单位:字节)
表七:单色位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1—32 4
33—64 8
65--96 12
97--120 16
……
----------------------
表八:16色位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1— 8 4
9—16 8
17--24 12
25--32 16
33--40 20
41--48 24
49--56 28
57--64 32
65--72 36
71--80 40
……
----------------------
表九:256色位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1— 4 4
5— 8 8
9—12 12
13—16 16
17--20 20
21--24 24
25--28 28
29--32 32
33--36 36
37--40 40
41--44 44
45--48 48
……
----------------------
表十:24位真彩位图宽度与扫描线长的对应关系
----------------------
图象宽度 扫描线长度
----------------------
1 4
2 8
3 12
4 12
5 16
6 20
7 24
8 24
9 28
10 32
11 36
12 36
13 40
14 44
15 48
16 48
17 52
18 56
19 60
20 60
21 64
22 68
23 72
24 72
……
----------------------
说明:
1.由以上4个表归纳出计算位图一条扫描线长度的VB代码如下∶
①单色位图每条扫描线长度=4×(图象宽\32+Abs((图象宽 Mod 32)>0))
②16色位图每条扫描线长度=4×(图象宽\8+Abs((图象宽 Mod 8)>0))
③256色位图每条扫描线长度=4×(图象宽\4+Abs((图象宽 Mod 4)>0))
④24位真彩位图每条扫描线长度=4×(图象宽×3\4+Abs((图象宽×3 Mod 4)>0))
2.知道了扫描线的长度和图像的高度,我们就可以轻松地计算出位图文件的大小。例如16×16的单色位图,查表七可知,扫描线长度=4,那么位图点阵的大小=高度×扫描线长度=16×4=64,查表五可知,调色板大小=8,查表一可知,BMP文件头大小=14,BMP信息头大小=40,所以,该位图文件的大小=64+8+14+40=126字节。