位图文件的数据结构

位图文件的数据结构

一、文件的组成
  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字节为高度(像素)。
  计算方法:按字节排列顺序

原文地址:https://www.cnblogs.com/wahaccp/p/3225611.html