Loading... 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)](https://www.cnblogs.com/Matrix_Yao/archive/2009/12/02/1615295.html) [2] [BMP位图转为RGB三通道图](https://blog.csdn.net/a435262767/article/details/84308029) Last modification:August 15th, 2020 at 07:39 pm © 允许规范转载