BMP文件格式,又称为Bitmap(位图)或DIB(设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面也在它的内建图像子系统GDI中对BMP格式提供了支持。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
bmp文件头:提供文件的格式、大小等信息
位图信息头:提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
调色板:可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
位图数据:就是图像数据
数据段名称 | 对应的windows结构体定义 | 大小(byte) |
bmp文件头 | BITMAPFILEHEADER | 14 |
位图信息头 | BITMAPINFOHEADER | 40 |
调色板 | 由颜色索引数决定 | |
位图数据 | 由图像尺寸决定 |
一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况不需要调色板,也就是位图信息头后面紧跟的就是位图数据了,因此常见到一种说法:位图文件从文件头开始偏移54 个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。
以一个16位位图文件说明,它是含有调色板的。
1.在BMP文件中,如果一个数据需要几个字节来表示的话,那么该数据的存放字节顺序为“低地址存放低位数据,高地址存放高位数据”。如数据0x1756在内存中存储顺序为:
56 | 17 |
---------------------------------》地址变大(小端方式存储)
2.分析数据
(1)bmp文件头,windows为bmp文件头定义了如下结构体:
typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType;
DWORD bfSize;
UINT16 bfReserved1;
UINT16 bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
变量名 | 地址偏移 | 大小 | 作用 |
bfType | 0000h | 2 bytes | 说明文件的类型,可取值: BM---windows 3.1x, 95, NT BA---OS/2 Bitmap Array CI---OS/2 Color Icon CP---OS/2 Color Pointer IC---OS/2 Icon PT---OS/2 Pointer |
bfSize | 0002h | 4 bytes | 说明该位图文件的大小,用字节为单位 |
bfReserved1 | 0006h | 2 bytes | 保留,必须设置为0 |
bfReserved2 | 0008h | 2 bytes | 保留,必须设置为0 |
bfOffBits | 000Ah | 4 bytes | 说明从文件头开始到实际的图像数据之间的字节的偏移量 |
对照文件数据我们看到:
1-2:424dh = ‘BM’,表示这是Windows支持的位图格式。有很多声称开头两个字节必须为‘BM’才是位图文件,从上表来看应为
开头两个字节必须为‘BM’才是Windows位图文件。
3-5:00010436h = 66614B = 65.15KB,通过查询文件属性发现一致。
6-9:这是两个保留段,为0
A-D:00000436h = 1078,即从文件头到位图数据需偏移1078字节
共14个字节
(2)位图信息头
Windows为位图信息头定义了如下结构体:
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 | 000Eh | 4 bytes | BITMAPINFOHEADER结构所需要的字数 |
biWidth | 0012h | 4 bytes | 说明图像的宽度,用像素为单位 |
biHeight | 0016h | 4 bytes | 说明图像的高度,用像素为单位 注:如果该值是一个正数,说明图像是倒向的,如果该值是 一个负数,则说明图像是正向的。 大多数的BMP文件都是倒向的位图,也就是高度值是一个正数 |
biPlanes | 001Ah | 2 bytes | 为目标设备说明颜色平面数,其值将总是设为1 |
biBitCount | 001Ch | 2 bytes | 说明比特数/像素,其值为1、4、8、16、24或32 |
biCompression | 001Eh | 4 bytes | 说明图像数据压缩的类型,取值范围: 0 BI_RGB 不压缩,最常用 1 BI_RLE8 8比特游程编码,只用于8位位图 2 BI_RLE4 4比特游程编码,只用于4位位图 3 BI_BITFIELDS 比特域,用于16/32位位图 4 BI_JPEG JPEG 位图含JPEG图像 仅用于打印机 5 BI_PNG PNG 位图含PNG图像 仅用于打印机 |
biSizeImage | 0022h | 4 bytes | 说明图像大小 以字节为单位,当用BI_RGB格式时,可设置为0 |
biXPelsPerMeter | 0026h | 4 bytes | 说明水平分辨率,用像素/米表示,有符号整数 |
biYPelsPerMeter | 002Ah | 4 bytes | 说明垂直分辨率,用像素/米表示,有符号整数 |
biClrUsed | 002Eh | 4 bytes | 说明位图实际使用的彩色表中的颜色索引数 设为0的话,则说明使用所有调色板项 |
biClrImportant | 0032h | 4 bytes | 说明对图像显示有重要影响的颜色索引的数目 如果是0,表示都重要 |