欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BMP格式学习

程序员文章站 2024-01-24 17:12:28
...

BMP格式学习

参考博客地址:
BMP格式详解
伪彩色百度百科

1.BMP文件介绍

BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP格式理所当然地被广泛应用。

这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点,即占用磁盘空间过大。所以,目前BMP在单机上比较流行。

BMP文件主要由四部分组成:

  1. 位图文件头(BITMAPFILEHEADER):提供文件的格式、大小等信息;
  2. 位图信息头(BITMAPINFOHEADER):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息;
  3. 调色板:可选。对于伪彩色图像来说,调色板可以就是用于索引与其对应的颜色的映射表;
  4. 位图数据:即图像数据。对于伪彩色图像来说,就是调色板的索引值。

此外,BMP文件的数据存放形式为小端方式,即低地址存放低位数据,高地址存放高位数据

2.BMP文件详解

2.1.位图文件头

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

//BMP文件头:14B
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;  //2B 
        DWORD   bfSize;  //4B
        WORD    bfReserved1;  
        WORD    bfReserved2;  
        DWORD   bfOffBits;  
} BITMAPFILEHEADER;

BMP格式学习

2.2.位图信息头

Windows为BMP信息头定义了如下结构体:

//BMP信息头:40B
typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;  //4B
        LONG       biWidth;  //4B
        LONG       biHeight;  
        WORD       biPlanes;  //2B
        WORD       biBitCount;  
        DWORD      biCompression;  
        DWORD      biSizeImage;  
        LONG       biXPelsPerMeter;  
        LONG       biYPelsPerMeter;  
        DWORD      biClrUsed;  
        DWORD      biClrImportant;  
} BITMAPINFOHEADER;

BMP格式学习

对于所有BMP文件来说,以上两个部分是必须的,总共占用54个字节。

2.3.调色板

调色板这一部分并不是必须的。对于真彩色图像,如24位的BMP文件,自身就带有各8位的R、G、B色彩信息,就不需要再用调色板进行色彩映射了。因此,真彩色BMP图像就只有三个组成部分,而且位图文件从文件头开始偏移54个字节就是位图数据了;对于伪彩色图像,如16位的BMP文件,由于其个像素的颜色不是由各个颜色分量决定的,而是通过一张颜色查找表进行查找而得到的,因此需要调色板作为色彩映射。

如上所说,BMP文件格式中的调色板实际上是一张映射表,用于标识颜色索引号与其代表的颜色对应关系。它在文件中的布局就像一个二维数组[N] [4],其中每行都代表一种颜色索引,总共有4个元素,分别代表该索引对应的B、G、R和Alpha(透明度),每个元素占一个字节。

假设调色板一共有256个颜色索引,则总共需要256*4=1024个字节。加上之前的文件头和信息头所占字节数,总共有1078个字节。也就是说,对于伪彩色BMP文件,从文件头开始偏移1078个字节就是位图数据。

2.4.位图数据

位图数据的设置是由信息头定义的,如biBitCount规定了每个像素所占的比特数。另外,对于伪彩色图像,biClrUsed规定了调色板的颜色索引数,其值应该与biBitCount保持一致。

对于真彩色BMP文件,位图数据是各个像素的实际色彩。如24位(8,8,8)的BMP文件,按照BGR的顺序存储每个像素的颜色值,一个像素所有的颜色分量存完后才开始存下一个像素的颜色信息。也就是说,一个像素总共占有3个字节。

对于伪彩色BMP文件,位图数据是调色板的索引值。假设调色板的颜色索引有256种(8位),则各个像素占用1个字节。