BMP格式学习
BMP格式学习
1.BMP文件介绍
BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP格式理所当然地被广泛应用。
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点,即占用磁盘空间过大。所以,目前BMP在单机上比较流行。
BMP文件主要由四部分组成:
- 位图文件头(BITMAPFILEHEADER):提供文件的格式、大小等信息;
- 位图信息头(BITMAPINFOHEADER):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息;
- 调色板:可选。对于伪彩色图像来说,调色板可以就是用于索引与其对应的颜色的映射表;
- 位图数据:即图像数据。对于伪彩色图像来说,就是调色板的索引值。
此外,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;
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文件来说,以上两个部分是必须的,总共占用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个字节。
上一篇: 数据结构:栈的应用实现
下一篇: 数据结构与算法(三)——堆及其应用