BMP(Bitmap-File)图像文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。
Windows 3.0以前的BMP图与显示设备有关,因此把这种BMP图像称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选1bit、4bit、8bit、16bit、24bit及32bit。
BMP文件主要有四部分组成,位图头、位图信息、调色板、位图数据。
位图头
变量 | 字节 | 作用 |
---|---|---|
bfType | 2 | 说明文件的类型,该值必须是0x424D,也就是字符‘BM’,否则表示根本不是BMP |
bfSize | 4 | 说明位图文件的大小,用字节为单位 |
bfReserved1 | 2 | 保留,必须设置为0 |
bfReserved2 | 2 | 保留,必须设置为0 |
bfOffBits | 4 | 说明从文件头开始到实际的图像数据之间的字节的偏移量。因为位图信息头。会因调色板的长度不同而变化,所以需要用这个偏移值迅速的从文件迅速从文件中读到数据 |
位图信息
变量 | 字节 | 作用 |
---|---|---|
bitSize | 4 | 说明BITMAPINFOHEADER结构所需要的字节数 |
bitWidth | 4 | 说明像素的宽度,以像素为单位 |
biHeight | 4 | 说了像素的高度,以像素位单位。这个值还说明该图像是倒立的图还是正向的图。如果该值是正数,说明图像是倒向的,即:数据的第一行其实是图像的最后一行。如果该值是一个负值,则图像是正向的。大多数的BMP文件都是倒立的,也就是说,高度值是一个正数 |
biPlanes | 2 | 表示bmp图片的平面数,显然显示器只有一个平面,所以恒为1 |
bitBitCount | 2 | 说明比特数/像素,其值为1、4、8、16、24、32 |
bitCompression | 4 | 说明图像压缩的类型,其中:BI_RGB:没有压缩。BI_RLE8:每个像素8比特的RLE压缩编码。BI_RLE4:每个像素4比特的RLE压缩编码。BI_BITFIELDS:每个像素的比特由指定的掩码决定。BI_JPEG:JPEG格式(仅用于打印机)。BI_PNG:PNG格式(仅用于打印机)。 |
bitSizeImage | 4 | 说明图像的大小,以字节为单位。当用BI_RGB格式时,可以设置为0 |
bitXPelsPerMeter | 4 | 说明水平分辨率,用像素/米表示 |
bitYPelsPerMeter | 4 | 说明垂直分辨率,用像素/米表示 |
biClrUsed | 4 | 说明位图实际使用的彩色表中的颜色索引数(0表示使用所以的调色版项) |
biClrImporant | 4 | 说明对图像显示有重要影响的颜色索引的数目,如果是0,表示很重要 |
调色板
调色板不是必须存在。
调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。如果一张图像中常用的颜色只有少数几种则可以使用调色板模式。类似于SCC palette模式
假设一张图像为1280x720,每个像素有RGB三个通道,每个通道1个字节,则整个图像需要用1280x720x3=2764800bytes。
如果图像中只使用了32种颜色,则可以用一个表存下这32种颜色,每个像素只需要记录其在表中的索引,32种颜色索引需要5bit。整个图像需要用1280x720x5bit=576000bytes。
位图数据
位图数据编码方式由位图信息中bitCompression字段决定,典型的是BI_RGB模式即不压缩,每个像素用3个字节表示。
数据对齐:Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是图片宽×每像素字节数×图片高能表示的了,因为每行可能还需要进行比特填充。
例如30x30的图像,每行30字节不是4的整数倍,需要填充0将每行补充为32字节。
实例分析
下面以一个1280x720的bmp图像为例分析其结构:
首先需要注意,bmp以小端方式存储,即低地址存放低位数据,高地址存放高位数据。
文件头分析:
红色框中是bmp文件头部分,共14字节:
1-2:固定的0x424D,表示“BM”的ASSIC码。
3-6:0x36302A00,由于是小端方式其真实值为0x002A3036=2764854bytes,表示位图文件大小。通过文件属性查看确实如此。(下面的小端模式不再单独说明)
7-8:保留字段,固定为0。
9-10:保留字段,固定为0。
11-14:0x00000036=54,表示从文件开始偏移54字节是数据部分。(下面可以验证,文件头14字节,文件信息头40字节,没有调色板,所以数据部分从第54字节开始)
位图信息头:
绿色框是位图信息头,共40字节:
1-4:0x00000028=40,表示位图信息头占40字节。
5-8:0x00000500=1280,表示图像宽度为1280个像素。
9-12:0x0002D0=720,表示图像高度为720个像素,且图像是倒向的,即:数据的第一行其实是图像的最后一行。
13-14:0x0001=1,恒为1。
15-16:0x0018=24,表示每个像素用24bit表示。
17-20:0x0000000=0,BI_RGB模式表示数据不压缩。
21-24:0x0000000=0,BI_RGB模式时该值为0。
25-28:0x0000000=0,水平分辨率,缺省。
29-32:0x0000000=0,垂直分辨率,缺省。
33-36:0x0000000=0,表示使用所有调色板项。
37-40:0x0000000=0,表示所有颜色都重要。
感兴趣的请关注微信公众号Video Coding