文章首发于我的个人博客
BMP又称为BitMap(位图)。BMP文件的图像深度可选lbit、4bit、8bit及24bit。但一般的bmp图像以24位图像为主,即用R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,这种情况下,bmp图像从文件头开始偏移54个字节就是bmp的图像数据了。
下面将用Notepad++为分析工具来对BMP图像格式做一个剖析。
我使用的图像如下(图像大小为1.17MB):
需要注意的是,windows下bmp内部的存储方式位小端方式,即“低位地址存放低位数据,高位地址存放高位数据”。
1. BMP数据从文件头开始的先后顺序分别为:
- bmp文件头:提供文件的格式、大小等信息,共14字节。
- bmp信息头:提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,共40字节。
- 调色板:可选
- 位图数据:图像数据。
2. BMP文件头
变量名 | 大小 | 作用 |
---|---|---|
bfType | 2 bytes | 说明文件的类型 |
bfSize | 4 bytes | 说明该位图的大小 |
bfReserved1 | 2 bytes | 保留,必须设置0 |
bfReserved2 | 2 bytes | 保留,必须设置为0 |
bf0ffBits | 4 bytes | 说明从文件头开始到实际的图像数据之间的字节的偏移量 |
对比bmp图像数据
之前提到,windows下bmp存储方式为小端存储,因此
- bfType : 4d42H
- bfSize : 0012c036H = 1,228,854 bytes = 1.17MB,与之前提到的图像大小一致。
- bfReserved1 : 0000H
- bfReserved2 : 0000H
- bf0ffBits : 00000036H = 54 bytes,即从文件头到图像数据需要偏移54个字节,这个我们后面再做验证。
3. BMP信息头
变量名 | 大小 | 作用 |
---|---|---|
biSize | 4 bytes | 描述信息头结构体所需的字节 |
biWidth | 4 bytes | 说明图像的宽度,以像素为单位 |
biHeight | 4 bytes | 说明图像的高度,以像素为单位 |
biPlanes | 2 bytes | 为目标设备说明颜色平面数,其值总是为1 |
biBitCount | 2 bytes | 说明比特数,1、4、8、16、24或32 |
biCompression | 4 bytes | 说明图像数据压缩的类型。0 BI_BGB(不压缩,最常用) |
biSizeImage | 4 bytes | 说明图像的大小 |
biXPelsPerMeter | 4 bytes | 说明水平分辨率,用像素/米表示 |
biYPelsPerMeter | 4 bytes | 说明垂直分辨率,用像素/米表示 |
biClrUsed | 4 bytes | 说明位图实际使用的彩色表中的颜色所引述 |
biClrImportant | 4 bytes | 说明对图像显示有重要影响的颜色索引的数目 |
对比bmp图像数据
- biSize : 00000028H = 40 bytes,之前已经说过,位图信息头占40字节。
- biWidth : 00000280H = 640,即图像宽度为640像素,与文件属性一致。
- biHeight : 00000280H = 640,即图像高度为640像素,与文件属性一致。
- biPlanes : 0001H = 1
- biBitCount : 0018H = 24。由于是24位的bmp,因此没有调色板数据,文件头和信息头之后就是真正的图像数据。
- biCompression : 00000000H = 0 ,即不压缩。
- biSizeImage : 0012c000H = 1.17MB,即图像大小为1.17MB。
- biXPelsPerMeter : 00001274H
- biYPelsPerMeter : 00001274H
- biClrUsed : 00000000H
- biClrImportant : 00000000H
4. 图像数据
24位RGB按照BGR
的顺序来存储每个像素的各个颜色通道的值,一个像素的所有颜色分量都存完之后才进行下一个像素的存储。像素的排布顺序为“从下到上,从左到右”。
对比bmp图像数据
位图数据在文件中的排列顺序是从左下角到右下角,首先排行,其次排列。以上图为例,即a3、87、51为最后一行第一列数据,a3、87、51为最后一行第二列数据,以此类推…
参考资料
[1] BMP文件格式详解(BMP file format)
[2] BMP位图转为RGB三通道图