• BMP格式分析


    BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行图像文件格 式。它的主要特点可以概括为:文件结构与PCX文件格式类似,每个文件只能存放一幅图像;图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理成为图 像文件的一个选项,用户可以根据需要进行选择。其中,非压缩格式是BMP图像文件所 采用的一种通用格式。但是,如果用户确定将BMP文件格式压缩处理,则Windows设计 了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式, 则采用RLE8压缩方式。同时,BMP图像文件格式可以存储单色、16色、256色以及真彩 色四种图像数据,,其数据的排列顺序与一般文件不同,它以图像的左下角为起点存储图 像,而不是以图像的左上角为起点;而且BMP图像文件格式中还存在另外一个与众不同 的特点,即其调色板数据所采用的数据结构中,红、绿、蓝三种基色数据的排列顺序也 恰好与其它图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境 的新特色,而且随着Windows版本的不断更新,微软公司也在不断改进其BMP图像文件 格式,例如:当前BMP图像文件版本中允许采用32位颜色表,而且针对32位Windows 的产生,相应的API函数也在不断地报陈出新,这些无疑都同时促成了BMP文件格式的 不断风靡。但由于BMP文件格式只适合于Windows上的应用软件,而对于DOS环境中的 各种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文件格式的流通程度超过PCX文件格式的一个重要因素。

    Windows中定义了两种位图文件类型,即一般位图文件格式与设备无关位图文件格 式。其中,由于设备无关位图(DIB)文件格式具有更强的灵活性与完整的图像数据、 压缩方式等定义。BMP图像文件的结构可以分为如下三个部分:文件头、调色板数据以 及图像数据。其中文件头的长度为固定值54个字节;调色板数据对所有不超过256色的 图像模式都需要进行设置,即使是单色图像模式也不例外,但是对于真彩色图像模式, 其对应的BMP文件结构中却不存在相应调色板数据的设置信息;图像数据既可以采用一 定的压缩算法进行处理,也可以不必对图像数据进行压缩处理,这不仅与图像文件的大小相关,而且也与对应的图像处理软件是否支持经过压缩处理的BMP图像文件相关。以下将分别介绍BMP图像文件结构中的这三个重要组成部分。特别值得注意的是:BMP 图像文件结构设计得相当简单,这无疑有利于图像文件的处理速度,但是同时也使得 BMP图像文件格式具有一定的局限性,即一个BMP图像文件只能存储一幅图像。

    BMP图像文件的文件头定义

    Windows中将BMP图像文件的文件头分成两个数据结构,其中一个数据结构中包含 BMP文件的类型、大小和打印格式等信息,称为BITMAPFILEHEADERl另外一个数据 结构中则包含BMP文件的尺寸定义等信息,称为BITMAPINFOHEADERl如果图像文 件还需要调色板数据,则将其存放在文件头信息之后。 BITMAPFIlEHEADER数据结构在Windows.h中的定义为:

    typedef struCttagBITMAPFIlEHEADER

    {

    WORD bftype;

    DWORD bfsiZe:

    WORD bfReservedl;

    WORD bgReserved2:

    DWORD bfoffBits:

    }BITMAPFILEHEADER;

    其中,bfrype在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内 容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。

    bfsize的数据地址为2,类型为unsignedlong,它以字节为单位,定义位图文件的大 小。

    bfReservedl与bfReserved2的数据地址分别为6和8,数据类型则都为unsignedint,二 者都是BMP文件的保留字,没有任何意义,其值必须为0.

    bfoffBits的数据地址为10,数据类型为unsignedlong,它以字节为单位,指示图像 数据在文件内的起始地址,即图像数据针对文件头的偏移量。

    BITMAPINFOHEADER数据结构用于说明位图的大小,其定义为:

    type struttagBITMAPINFOHEADER

    {

    DWORD biSize:

    DWORD biWldth;

    DWORD biHeight;

    WORD biPlanes:

    WORD biBitCount:

    DWORD biCOmpression;

    DWORD biSiZelmage;

    DWORD biXPelsPerMeter:

    DWORD biYPelsPerMeter:

    DWORD biClrUsed;

    DWORD biClrlmportant;

    }BITMAPINFOHEADER;

    其中,biSize的数据地址为14,数据类型为unsignedlong,它以字节为单位指定数据 结构BITMAPINFOHEADER所占用的存储容量,固定值为40。

    biWidth与biHeight的数据地址分别为18和22,数据类型都是unsignedlong,它们分 别以像素为单位,给出该BMP文件所描述位图的宽度与高度。若biHeight的取值为正数, 则表明位图为bottom—up类型的DIB位图,而且位图原点为左下角。若biHeight的取值为 负数,则表明位图为top—down类型的DIB位图,而且位图原点为左上角。

    注意:一般位图定义中,这两个字段的取值必须为正数。

    biPlanes的数据地址为26,类型为unsignedint,它代表目标设备的平面数必须为1。

    biBitCount的数据地址为28,类型为utlsigned Int,它确定每个像素所需要的位数。 当图像为单色时,该字段的取值为1;当图像为16色时,该字段的取值为4;当图像为256 色时,该字段的取值为8;当图像为真彩色时,该字段的取值为24。

    biCompression的数据地址为30,类型为unsignedlong,它代表bottom—up类型位图的 压缩类型(注意:t叩—down类型位图不能进行压缩处理),其可能取值及其含义分别为: 若该字段的取值为BI—RGB,则表示文件内的图像数据没有经过压缩处理;若该字段的 取值为BI—RLE8,则表示所压缩的图像数据是256色,采用的压缩方法是RLE8;若该字 段的取值为BI—RLE4,则表示所压缩的图像数据是16色,采用的压缩方法是RLE4;若 该字段的取值为BI—BITFIELDS,则表明图像文件内的数据没有经过压缩处理,而且颜 色表由分别表示每个像素点的红、绿、蓝三原色的双字组成。

    注意:BMP文件格式在处理单色或者真彩色图像时,不论图像数据多么庞大,都不 对图像数据进行任何压缩处理。

    biSizelmage的数据地址为34,类型为unsignedlong7它以字节为单位,给出该BMP 内图像数据占用的空间大小。若图像文件描述BI—RGB位图,则该字段的值必须设置为0。

    biXPelsPerMeter字段与biYPelsPerMeter字段的数据地址分别为38与42,类型都是 unsignedlong,它们分别以每米像素数为单位,给出位图目的设备水平以及垂直方向的 分辨率;其中,应用程序可以根据biXPelsPerMeter字段的值,从源位图组中选择与当前 设备特点最匹配的位图。

    biCkUsed的数据地址为46,类型为unsignedlong,给出位图实际使用的颜色表中的 颜色变址数。如果该字段的取值为0,则代表本位图使用了biBitCount字段值所代表的最 大颜色值,其中biBitCount字段的取值与biCompression所指定的压缩方法相关。例如: 如果图像为16色,而该字段的取值为10,则代表本位图共使用了12种颜色;如果该字段 的取值非零,而且biBitCount字段的取值小于16,则该字段指定图像或者设备驱动器存 取的实际颜色数。若biBitCount字段的取值大于或者等于16,则该字段指定使Window 系统调色板达到最优性能的颜色表大小。

    biChlmportant的数据地址为50,数据类型为unsignedlong,它给出位图显示过程中 重要颜色的变址数。若该字段的取值为0,则表示所有使用的颜色都是重要颜色。

    调色板数据

    如果位图的描述还需要调色板数据,则应该在BMP文件头之后定义一个颜色表,它 包含若干个表项。其中,每一个表项定义了一种颜色,Windows将其定义为如下的 RGBQUAD结构:

    typedef tagRGBQUAD

    {

    BYTE rgbBlue;

    BYTE rgbGreen;

    BYTE rgbRed;

    BYTE rgbReserved;

    }RGBQUAD;

    注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何意 义,必须取固定值00同时,RGBQUAD结构定义的颜色值中,红色、绿色与蓝色的排 列顺序与一般图像文件的颜色数据排列顺序恰好相反,即:蓝色的亮度由rgbBlue字段 定义、绿色的亮度由rgbGreen字段定义,红色的亮度由rgbRed字段定义。若位图中某个 像素点的颜色描述为“00,00,FF,00”,则表示该点的颜色为纯红色,而不是纯 蓝色。

    综上,在DIB位图文件组成中,紧随BITMAPFILEHEADER结构其后的数据结构为 BITMAPINFO,两者共同构成完整的位图文件。Windows将BITMAPINFO结构定义为:

    tyPedef stmCt tagBITMAPINFO

    {

    BITMAPINFOHEADER bmiHeader:

    RGBQUAD bmiC010ur[1];

    }BITMAPINFO;

    其中,bmiHeader字段指向包含位图颜色格式以及大小定义的 BITMAPHEADERINFO结构。bmiCo1our[1]字段指向RGBQUAD结构数组或者定义位图 颜色值的双字数据结构,它定义了BMP图像文件的颜色表,它包含多少个表项是由 BITMAPINFOHEADER数据结构中的biBitCount字段定义的:若该字段的取值为1,则颜 色表中共包含两个表项;若该字段的取值为4,则颜色表中共包含16个表项;若该字段 的取值为8,则颜色表中共包含256个表项;若该字段的取值为16,而且 BITMAPINFOHEADER结构定义中指定bmiColors字段的取值为BI_RGB,则颜色表中的 表项为空,位图阵列中每个字代表一个像素,字中每5位上的值代表该像素点一种基色 的亮度,其中最低5位代表蓝色亮度,依次为绿色与红色,字的最高位没有任何意义。 若该字段的取值为24,则颜色表中的表项为空,而位图阵列的每三个字节代表一个像 素,这3个字节直接定义了像素颜色中蓝、绿、红三种基色的相对亮度。 若该字段的取 值为32,而且BITMAPINFOHEADER结构定义中bmiC010rs字段的取值为BI—RGB,则颜 色表中的表项为空,且位图阵列中的每个双字代表一个像素的三原色亮度构成。 注意:颜色表中的数据应该按照重要性的帧序进行排列。另外,如果应用程序中需 要使用DIB位图,则bmiColors字段可以为16位的无符号整数数组,这些整数指定当前逻 辑调色板的颜色索引,而不是显式的RGB值。当然,如果位图存储在文件中或者需要传 送到其它应用程序,则该字段中不能包含调色板索引值。

    一、BMP文件结构  
       
    BMP文件组成  
    BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。    
    BMP文件头  
    BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。    
    其结构定义如下:  
    typedef   struct   tagBITMAPFILEHEADER  
    {  
    WORDbfType;   //   位图文件的类型,必须为BM  
    DWORD   bfSize;   //   位图文件的大小,以字节为单位    
    WORDbfReserved1;   //   位图文件保留字,必须为0  
    WORDbfReserved2;   //   位图文件保留字,必须为0  
    DWORD   bfOffBits;   //   位图数据的起始位置,以相对于位图  
    //   文件头的偏移量表示,以字节为单位  
    }   BITMAPFILEHEADER;  
       
       
    3.   位图信息头  
       
       
    BMP位图信息头数据用于说明位图的尺寸等信息。  
    typedef   struct   tagBITMAPINFOHEADER{  
    DWORD   biSize;   //   本结构所占用字节数  
    LONGbiWidth;   //   位图的宽度,以像素为单位  
    LONGbiHeight;   //   位图的高度,以像素为单位  
    WORD   biPlanes;   //   目标设备的级别,必须为1  
    WORD   biBitCount//   每个像素所需的位数,必须是1(双色),  
    //   4(16色),8(256色)或24(真彩色)之一  
    DWORD   biCompression;   //   位图压缩类型,必须是   0(不压缩),  
    //   1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一  
    DWORD   biSizeImage;   //   位图的大小,以字节为单位  
    LONGbiXPelsPerMeter;   //   位图水平分辨率,每米像素数  
    LONGbiYPelsPerMeter;   //   位图垂直分辨率,每米像素数  
    DWORD   biClrUsed;//   位图实际使用的颜色表中的颜色数  
    DWORD   biClrImportant;//   位图显示过程中重要的颜色数  
    }   BITMAPINFOHEADER;  
       
       
    4.   颜色表  
       
      颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:  
    typedef   struct   tagRGBQUAD   {  
    BYTErgbBlue;//   蓝色的亮度(值范围为0-255)  
    BYTErgbGreen;   //   绿色的亮度(值范围为0-255)  
    BYTErgbRed;   //   红色的亮度(值范围为0-255)  
    BYTErgbReserved;//   保留,必须为0  
    }   RGBQUAD;  
    颜色表中RGBQUAD结构数据的个数有biBitCount来确定:  
    当biBitCount=1,4,8时,分别有2,16,256个表项;  
    当biBitCount=24时,没有颜色表项。  
    位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:  
    typedef   struct   tagBITMAPINFO   {  
    BITMAPINFOHEADER   bmiHeader;   //   位图信息头  
    RGBQUAD   bmiColors[1];   //   颜色表  
    }   BITMAPINFO;  
       
       
    5.   位图数据  
      位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:  
    当biBitCount=1时,8个像素占1个字节;  
    当biBitCount=4时,2个像素占1个字节;  
    当biBitCount=8时,1个像素占1个字节;  
    当biBitCount=24时,1个像素占3个字节;  
    Windows规定一个扫描行所占的字节数必须是  
    4的倍数(即以long为单位),不足的以0填充,  
    一个扫描行所占的字节数计算方法:  
    DataSizePerLine=   (biWidth*   biBitCount+31)/8;    
    //   一个扫描行所占的字节数  
    DataSizePerLine=   DataSizePerLine/4*4;   //   字节数必须是4的倍数  
    位图数据的大小(不压缩情况下):  
    DataSize=   DataSizePerLine*   biHeight;

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/orangeman1982112/archive/2009/02/13/3887427.aspx


  • 相关阅读:
    Codeforces Round #297 (Div. 2) 525C Ilya and Sticks(脑洞)
    全栈必备 JavaScript基础
    2014-04-19编程之美初赛题目及答案解析
    doT js模板入门 2
    一篇关于arc下内存管理的老文章,包含各种冷门修饰符(关于内存),写的较好,mark
    MyBatis官方教程及源代码解析——mapper映射文件
    Android中图片的三级缓存策略
    python字符串/元组/列表/字典互转
    关于字节对齐的理解
    阿里云服务器ecs配置之安装redis服务
  • 原文地址:https://www.cnblogs.com/xinzhuangzi/p/4100608.html
Copyright © 2020-2023  润新知