图像压缩 -- BMP图像格式详解

时间:2024-05-19 12:24:28

文章首发于我的个人博客

BMP又称为BitMap(位图)。BMP文件的图像深度可选lbit、4bit、8bit及24bit。但一般的bmp图像以24位图像为主,即用R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,这种情况下,bmp图像从文件头开始偏移54个字节就是bmp的图像数据了。

下面将用Notepad++为分析工具来对BMP图像格式做一个剖析。

我使用的图像如下(图像大小为1.17MB):

图像压缩 -- BMP图像格式详解

需要注意的是,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图像数据

图像压缩 -- 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图像数据

图像压缩 -- 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图像数据

图像压缩 -- BMP图像格式详解

位图数据在文件中的排列顺序是从左下角到右下角,首先排行,其次排列。以上图为例,即a3、87、51为最后一行第一列数据,a3、87、51为最后一行第二列数据,以此类推…

参考资料

[1] BMP文件格式详解(BMP file format)

[2] BMP位图转为RGB三通道图