zoukankan      html  css  js  c++  java
  • BMP头文件格式以及C语言读取头文件【转】

    BMP头文件格式以及C语言读取头文件【转】

    (2011-12-24 22:59:17)
    标签:

    杂谈

    分类: 各个领域的知识

    BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    位图文件主要分为如下3个部分:

    块名称

    对应Windows结构体定义

    大小(Byte

    文件信息头

    BITMAPFILEHEADER

    14

    位图信息头

    BITMAPINFOHEADER

    40

    RGB颜色阵列

    BYTE*

    由图像长宽尺寸决定

    1   文件信息头BITMAPFILEHEADER

    结构体定义如下:

    typedef struct tagBITMAPFILEHEADER {

    WORD  bfType;  
    DWORD bfSize; 
    WORD  bfReserved1;
     
    WORD  bfReserved2;
     
    DWORD bfOffBits;

    } BITMAPFILEHEADER;

    其中:??

    bfType<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    说明文件的类型,该值必需是0x4D42,也就是字符'BM'

    bfSize

    说明该位图文件的大小,用字节为单位

    bfReserved1

    保留,必须设置为0

    bfReserved2

    保留,必须设置为0

    bfOffBits

    说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

     

    2位图信息头BITMAPINFOHEADER

    结构体定义如下:

    typedef struct tagBITMAPINFOHEADER {

    DWORD biSize; 
    LONG biWidth;
     
    LONG biHeight;
     
    WORD biPlanes;
     
    WORD biBitCount;
     
    DWORD biCompression;
     
    DWORD biSizeImage;
     
    LONG biXPelsPerMeter;
     
    LONG biYPelsPerMeter;
     
    DWORD biClrUsed;
     
    DWORD biClrImportant;

    } BITMAPINFOHEADER;

    其中:

    biSize

    说明BITMAPINFOHEADER结构所需要的字数。

    biWidth

    说明图象的宽度,以象素为单位。

    biHeight

    说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。

    biPlanes

    为目标设备说明位面数,其值将总是被设为1

    biBitCount

    说明比特数/象素,其值为1481624、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。

    biCompression

    说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB

    biSizeImage

    说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0

    biXPelsPerMeter

    说明水平分辨率,用象素/米表示。

    biYPelsPerMeter

    说明垂直分辨率,用象素/米表示。

    biClrUsed

    说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。

    biClrImportant

    说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

     具体数据举例:

    如某BMP文件开头:
    424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... .... 
    BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
    一、图像文件头
    1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。424Dh=’BM’,表示是Windows支持的BMP格式。
    2)2-3:整个文件大小。4690 0000,为00009046h=36934。
    3)4-5:保留,必须设置为0。
    4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
    5)8-9:位图图信息头长度。
    6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。
    7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。
    8)14:位图的位面数,该值总是1。0100,为0001h=1。
    二、位图信息头
    9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
    10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。
    11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。
    12)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
    13)22-23:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
    14)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
    15)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。

    具体代码C语言执行:(D  盘中有文件名为1的bmp图像)

    #include <stdio.h> 
    #include <stdlib.h>
    typedef  struct  tagBITMAPFILEHEADER

    unsigned short int  bfType;       //位图文件的类型,必须为BM 
    unsigned long       bfSize;       //文件大小,以字节为单位
    unsigned short int  bfReserverd1; //位图文件保留字,必须为0 
    unsigned short int  bfReserverd2; //位图文件保留字,必须为0 
    unsigned long       bfbfOffBits;  //位图文件头到数据的偏移量,以字节为单位
    }BITMAPFILEHEADER; 
    typedef  struct  tagBITMAPINFOHEADER 

    long biSize;                        //该结构大小,字节为单位
    long  biWidth;                     //图形宽度以象素为单位
    long  biHeight;                     //图形高度以象素为单位
    short int  biPlanes;               //目标设备的级别,必须为1 
    short int  biBitcount;             //颜色深度,每个象素所需要的位数
    short int  biCompression;        //位图的压缩类型
    long  biSizeImage;              //位图的大小,以字节为单位
    long  biXPelsPermeter;       //位图水平分辨率,每米像素数
    long  biYPelsPermeter;       //位图垂直分辨率,每米像素数
    long  biClrUsed;            //位图实际使用的颜色表中的颜色数
    long  biClrImportant;       //位图显示过程中重要的颜色数
    }BITMAPINFOHEADER; 
    typedef  struct 

    BITMAPFILEHEADER  file; //文件信息区
    BITMAPINFOHEADER  info; //图象信息区
    }bmp;

    bmp  readbmpfile(void); //函数声明
    int main(void)


      bmp m;          //定义一个结构变量
      m=readbmpfile(); //读取一个位图
      getchar();
      return 0;

    }

     

      bmp  readbmpfile(void) 
    { bmp  m;        //定义一个位图结构
      FILE *fp; 
     if((fp=fopen( "d:\1.bmp", "r"))==NULL) 
     { printf( "can't open the bmp imgae. "); 
       exit(0); 
     }

    else 

    fread(&m.file.bfType,sizeof(char),1,fp); 
    printf("类型为%c",m.file.bfType); 
    fread(&m.file.bfType,sizeof(char),1,fp); 
    printf("%c ",m.file.bfType);        
    fread(&m.file.bfSize,sizeof(long),1,fp); 
    printf("文件长度为%d ",m.file.bfSize);  
    fread(&m.file.bfReserverd1,sizeof(short int),1,fp); 
    printf("保留字1为%d ",m.file.bfReserverd1); 
    fread(&m.file.bfReserverd2,sizeof(short int),1,fp); 
    printf("保留字2为%d ",m.file.bfReserverd2); 
    fread(&m.file.bfbfOffBits,sizeof(long),1,fp); 
    printf("偏移量为%d ",m.file.bfbfOffBits);
    fread(&m.info.biSize,sizeof(long),1,fp); 
    printf("此结构大小为%d ",m.info.biSize); 
    fread(&m.info.biWidth,sizeof(long),1,fp); 
    printf("位图的宽度为%d ",m.info.biWidth);
    fread(&m.info.biHeight,sizeof(long),1,fp); 
    printf("位图的高度为%d ",m.info.biHeight);
    fread(&m.info.biPlanes,sizeof(short),1,fp); 
    printf("目标设备位图数%d ",m.info.biPlanes);
    fread(&m.info.biBitcount,sizeof(short),1,fp); 
    printf("颜色深度为%d ",m.info.biBitcount);
    fread(&m.info.biCompression,sizeof(long),1,fp); 
    printf("位图压缩类型%d ",m.info.biCompression); 
    fread(&m.info.biSizeImage,sizeof(long),1,fp); 
    printf("位图大小%d ",m.info.biSizeImage); 
    fread(&m.info.biXPelsPermeter,sizeof(long),1,fp); 
    printf("位图水平分辨率为%d ",m.info.biXPelsPermeter); 
    fread(&m.info.biYPelsPermeter,sizeof(long),1,fp); 
    printf("位图垂直分辨率为%d ",m.info.biYPelsPermeter); 
    fread(&m.info.biClrUsed,sizeof(long),1,fp); 
    printf("位图实际使用颜色数%d ",m.info.biClrUsed);
    fread(&m.info.biClrImportant,sizeof(long),1,fp); 
    printf("位图显示中比较重要颜色数%d ",m.info.biClrImportant); 

    return m; 
    }

  • 相关阅读:
    eclipse里面自动添加get和set方法
    初探内联方式的 onload="doSomething()"为何要加"()"?而js代码的 onload="doSomething" 和 addEventListener 为何不加"()"?
    ubuntu下安装git,sublime,nodejs
    ajax学习计划
    ajax学习笔记
    滑动窗口思路精髓总结
    Java给定一个字符串,分割字符串使得每个子字符串都是回文串,求最少分割次数
    顺时针打印
    戳气球最少需要几下一样的题
    ip覆盖算法
  • 原文地址:https://www.cnblogs.com/andyliu1988/p/6016673.html
Copyright © 2011-2022 走看看