zoukankan      html  css  js  c++  java
  • 位图文件的数据结构

    位图文件的数据结构

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

  • 相关阅读:
    540C: Ice Cave
    540B :School Marks
    欧拉工程第52题:Permuted multiples
    欧拉工程第51题:Prime digit replacements
    C. Tourist's Notes
    B. Quasi Binary
    Keepalived安装后出现的问题总结
    Keepalived+HAproxy实现高可用负载均衡
    CentOS.56安装Redis监控工具RedisLive
    Redis+Keepalived主从热备秒级切换
  • 原文地址:https://www.cnblogs.com/wahaccp/p/3225611.html
Copyright © 2011-2022 走看看