BMP文件格式详解

       BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

       BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

  1. 位图文件头(bitmap-file header):提供文件的格式、大小等信息,一共14字节。
  2. 位图信息头(bitmap-information header):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,一共40字节。
  3. 调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表。
  4. 位图数据(bitmap data)。

        一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示。除了24位图,还有1位(单色),2位(4色,CGA),4位(16色,VGA),8位(256色),16位(增强色),24位(真彩色)和32位等。

实例分析

       使用WinHex打开这个文件,然后对源码进行分析。小端方式存储。

 位图文件头

       Windows为bmp文件头定义了如下结构体:

       typedef struct tagBITMAPFILEHEADER 
       {  
              UINT16 bfType;                  // 2Bytes,必须为"BM",即0x4D42才是Windows位图文件
              DWORD bfSize;                 // 4Bytes,整个BMP文件的大小
              UINT16 bfReserved1;        // 2Bytes,保留,为0
              UINT16 bfReserved2;        // 2Bytes,保留,为0
              DWORD bfOffBits;             // 4Bytes,文件起始位置到图像像素数据的字节偏移量
       } BITMAPFILEHEADER; 

位图信息头

       bmp信息头结构体定义如下:

       typedef struct tagBITMAPFILEHEADER 
       {  
              DWORD biSize;                   // 4Bytes,指定此结构体的长度,为40
              LONG biWidth;                    // 4Bytes,位图宽
              LONG biHeight;                   // 4Bytes,位图高
              WORD biPlanes;                 // 2Bytes,平面数,为1
              WORD biBitCount;              // 2Bytes,像素位数,1/2/4/8/16/24/32
              DWORD biCompression;    // 4Bytes,压缩方式,0:不压缩,1:RLE8,2:RLE4
              DWORD biSizeImage;        // 4Bytes,4字节对齐的图像数据大小
              LONG biXPelsPerMeter;    // 4 Bytes,X方向分辨率
              LONG biYPelsPerMeter;    // 4 Bytes,Y方向分辨率
              DWORD biClrUsed;           // 4 Bytes,实际调色板索引数,0:使用所有调色板索引
              DWORD biClrImportant;    // 4 Bytes,重要的调色板索引数,0:所有调色板索引都重要
       } BITMAPINFOHEADER;

调色板

       bmp调色板结构体定义如下:

       typedef struct tagRGBQUAD 
       {  
              BYTE rgbBlue;
              BYTE rgbGreen;
              BYTE rgbRed;
              BYTE rgbReserved;
       } RGBQUAD;

       1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据。调色板大小为N*4(bytes),其中N表示颜色的数目。每4字节表示一种颜色,分别为B(蓝色)、G(绿色)、R(红色)、alpha。

位图数据

       按照biBitCount计算每个像素所占的字节数。

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值