位图文件的数据结构
一、文件的组成
Bmp文件由文件头、位图信息头、调色板、数据区等几个部分组成(在以下表格中,长
度单位均为字节),结构如下:
-------------------------------------------------
长度 说明
-------------------------------------------------
1.BMP文件头 14
2.BMP信息头 40
3.调色板 最大4×256(真彩位图没有此部分)
4.位图数据 又称位图点阵
-------------------------------------------------
上述1-3部分合称DIB文件头。
DIB的文件头主要由两个部分组成,即BMP文件头和位图信息,而位图信息又分为BMP信
息头和调色板两个小部分。
BMP文件头结构如下∶
----------------------------------------------
偏移量 字段 长度 说明
----------------------------------------------
000(000) 文件类型 2 必须为 BM
002(002) 文件大小 4 以字节为单位
006(006) 保留 4 必须设为0
010(00A) 位图点阵偏移量 4 从0起算
----------------------------------------------
此结构主要记录了BMP 文件大小以及结构有关的信息。在很多情况下,可以计算来获取
这些这些信息,所以很多人并不访问这个结构内的数据。他们说文件头结构记录着无大用处
的信息。但通过对此字段的访问,我们可以知道这个位图文件的颜色数据是从哪里开始的(
位图点阵偏移量),以及位图文件的大小。
BMP信息头结构如下:
--------------------------------------------------------------------------
偏移量 长度 说明
--------------------------------------------------------------------------
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(1/4/8/10/18/20)
030(01E) 4 象素数据的压缩类型 00 00 00 00(表示未压缩)
034(022) 4 位图数据的长度
038(026) 4 设备水平分辨率
042(02A) 4 设备垂直分辨率
046(02E) 4 有效颜色数(调色板中实际使用的颜色索引的个数,O表示全要使用)
050(032) 4 重要的颜色索引个数,0表示所有颜色均重要
---------------------------------------------------------------------------
说明:
1.图象数据的长度说明的是图象的大小,也就是位图点阵部分的大小,而不是整个位图文件
的大小。如果我们只把位图的数据部分读入到内存(而把结果部分读入到数组),就需要按
此大小来申请内存大小。
2.未经压缩的BMP文件中,位图点阵信息是按扫描线从下至上(bottom to top)存储的,即
图像的第一个像素值在位图阵列的左下角,最后一个像素值在位图阵列的右上角。
3.16色位图每个像素占4位,每个字节存放相邻的两个像素点的颜色索引值,高4位存放的像
素点在扫描线的前面,低4位存放的像素点在扫描线后面。256 色位图每个字节存放1个像
素点的颜色索引值。24位位图的调色板为空,位图数据的每3个字节对应1个像素值,其中
每个字节分别对应该像素值的P、R、G值。
4.一个256色位图能显示的颜色总数限定在256种颜色,但这并不意味着任何256色位图都只
能显示相同的256种颜色。一个256色位图所能够显示的256种颜色被规定在该位图的调色
板中。256色位图所能显示的颜色范围,能够达到设备所允许的范围(16位增强模式中可能
的颜色数为2的16次方,24位真彩模式中可能的颜色数为2的24次方),但必须是其中的256
个颜色。调色板部分所描述的颜色值用来产生实际的调色板,而数据区内存放的是对这256
种颜色的索引值,而不是实际颜色。
5.当用1位来表示一个像素的时候,调色板的数组个数为2,存放着黑色和白色两个颜色,而
数据区存放着1和0两个索引值;当用4位来表示一个像素的时候,则调色板的数组个数为16
,存放着16种颜色,数据区存放着0至15的索引号;当8位的时候调色板存放256种颜色,数
据区存放着0至255的索引号;而当像素位等于或大于16位的时候(真彩色),调色板不存
在,数据区存放着以16位或24位表示的实际颜色,其中的原因一想就知道,难道我们要设
上万种的调色板项?
调色板结构如下:
结构内各字段 数据类型 说明
--------------------------------------------
rgbBlue Byte 指定彩色中蓝色成分的多少
rgbGreen Byte 指定彩色中绿色成分的多少
rgbRed Byte 指定彩色中红色成分的多少
rgbReserved Byte 保留,设为0
--------------------------------------------
二、一个具体的例子
有一个16色真彩位图,是一个边长为16,边框为红色,中间为浅灰色(&HC4C4C4)的正
方形,其全部数据如下:
000000: 42 4D F6 00 00 00 00 00 00 00 36 00 00 00 28 00
000010: 00 00 08 00 00 00 08 00 00 00 01 00 18 00 00 00
000020: 00 00 C0 00 00 00 00 00 00 00 00 00 00 00 00 00
000030: 00 00 00 00 00 00 00 00 FF 00 00 FF 00 00 FF 00
000040: 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00
000050: FF C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4
000060: C4 C4 C4 00 00 FF 00 00 FF C4 C4 C4 C4 C4 C4 C4
000070: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 00 00 FF 00 00
000080: FF C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4
000090: C4 C4 C4 00 00 FF 00 00 FF C4 C4 C4 C4 C4 C4 C4
0000A0: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 00 00 FF 00 00
0000B0: FF C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4
0000C0: C4 C4 C4 00 00 FF 00 00 FF C4 C4 C4 C4 C4 C4 C4
0000D0: C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 00 00 FF 00 00
0000E0: FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF 00 00 FF
0000F0: 00 00 FF 00 00 FF
分析∶
1.BMP文件头(14字节)
00-01:文件类型=42 4D=“BM”
02-05:文件大小=F6 00 00 00=&HF6=246(字节)
06-09:保留
0A-0D:位图点阵偏移量=36 00 00 00=&H36=54(从00算起)
2.BMP信息头(40字节)
0E-11:BMP信息头大小=28 00 00 00=&H28=40
12-15:图象宽度=08 00 00 00=&H8=8
16-19:图象高度=08 00 00 00=&H8=8
1A-1B:目标设备的级数=01 00=&H1=1
1C-1D:每象素所占位数=18 00=&H18=24,表示24位真彩
1E-21:压缩类型=00 00 00 00=&H0=0,无压缩
22-25:图象数据的长度=C0 00 00 00=&HC0=192
26-29:设备水平分辨率=00 00 00 00
2A-2D:设备垂直分辨率=00 00 00 00
2E-31:在调色板中实际使用的色彩索引的个数=00 00 00 00
32-35:重要的颜色索引个数=00 00 00 00=0(都重要)
3.数据部分。
1.位图最末一行的数据在0036-004D这24个字节中,由于是一条红线,所以每3个字节的最
后一个字节是 FF
2.位图倒数第二行的数据在004E-0065这24个字节中,该行的首尾2个象素为红色,其余6个
象素为浅灰色,所以0050字节和0065字节是 FF,而0051-0062均为 C4。
3.其余行的数据也照此分析。
三、计算位图一行的字节数(一条扫描线长度)的VB代码如下∶
1.16色位图每条扫描线长度=4×(图象宽\8+Abs((图象宽 Mod 8)>0))
2.256色位图每条扫描线长度=4×(图象宽\4+Abs((图象宽 Mod 4)>0))
3.真彩位图每条扫描线长度=4×(图象宽×3\4+Abs((图象宽×3 Mod 4)>0))
四、附:各类图片宽高度数据偏移量及计算方法:
ico:第7、8字节为宽高度(像素)
bmp:第19-22字节为宽度(像素),第23-26字节为高度(像素),各为4字节。
计算方法:低位在前,高位在后。
jpg:1.画图程序转换的:第166-167字节为宽度(像素),第164-165字节为高度(像素),
2.自编程序转换的:第627-628字节为宽度,第629-630为高度。
计算方法同上。
Gif:第7-8字节为宽度(像素),第9-10字节为高度(像素)。
计算方法同上。
png:第17-20字节为宽度(像素),第21-24字节为高度(像素)。
计算方法:按字节排列顺序