初识 bmp 图像格式
1. 什么是 BMP 图像格式
1.1 概述
BMP(Bitmap)是一种图像文件格式,也称为位图格式。这种格式可以存储图像的像素颜色和位置信息,并且不会在压缩图像时丢失任何信息。BMP 格式最初由 Microsoft 开发,随后成为 Windows 操作系统的标准图像格式之一。
BMP 格式的历史可以追溯到 1980 年代初期,当时微软公司正在开发一种名为 Windows 的图形用户界面,需要一种能够存储位图图像的文件格式。于是,BMP 格式应运而生,并成为 Windows 操作系统的标准图像格式之一。在 BMP 格式出现之前,常用的图像格式有 GIF、JPEG 等。与这些格式不同的是,BMP 格式是一种无损的图像格式,即压缩后不会丢失任何像素信息,因此图像质量得到了保证。但是,由于该格式不支持压缩,因此文件大小通常较大,占用磁盘空间较多。
1.2 优缺点
优点:
- 图像质量高,没有压缩损失;
- 支持透明度和颜色深度等功能;
- 通用性好,可以在许多不同的软件和操作系统中使用。
缺点:
- 大部分使用场景不支持压缩,因此文件大小通常较大,占用磁盘空间较多;
- 不支持动画和透明图像等高级功能,因此在某些情况下可能不适用。
2. 常见 BMP 图像格式及文件头
根据文件头结构的不同(BMP header
包含 file header
和 DIB header
两部分),具体地说,是 DIB 头不同,BMP 格式可以分为多个版本,包括 OS/2 Bitmap Header 格式、Windows BMP 格式、Windows V2、V3、V4 以及 Windows V5 BMP 格式等。这些版本在文件头结构和支持的压缩方式、颜色空间类型等方面有所不同,应根据实际需求选择适合的版本和参数。
一般情况下,位图文件头(Bitmap file header)
的结构较为统一,这部分数据块位于文件开头,用于进行文件的识别。典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。所有的整数值都以小端序存放(即最低有效位前置)。
字节数 | 字段名 | 描述 |
---|---|---|
2 | 文件类型 | 用于标识BMP和DIB文件的魔数,一般为0x42 0x4D,即ASCII的BM |
4 | 文件大小 | BMP文件的大小(单位为字节) |
2 | 保留字段1 | 保留;实际值因创建程序而异 |
2 | 保留字段2 | 保留;实际值因创建程序而异 |
4 | 数据偏移量 | 位图数据(像素数组)的地址偏移,也就是起始地址。 |
DIB 头(全称是设备无关位图,Device Independent Bitmap)
用于告诉应用程序图像的详细信息,在屏幕上显示图像将会使用这些信息。这部分数据块对应了 Windows 和 OS/2 中的内部使用的头结构以及其它一些版本的变体。但所有版本均以一个 DWORD 位(32 位)开始,用以说明该数据区块的大小,使得应用程序能够根据这个大小来区分该图像实际使用了哪种版本的 DIB 头结构。存在多种版本的头结构的原因是微软对 DIB 格式进行过多次扩展。下表即为所有不同版本的 DIB 头:
大小 | 结构名称 | 操作系统支持 | 所加特性 |
---|---|---|---|
12 | BITMAPCOREHEADER | OS/2 和 3.0 版本以来的 Windows | |
64 | BITMAPCOREHEADER2 | OS/2 | 添加半调网屏;添加 RLE 及霍夫曼 1D 压缩。 |
40 | BITMAPINFOHEADER | Windows 3.0 及更高版本 | 删除 RLE-24 及霍夫曼 1D 压缩;添加 16/32 位像素格式;添加可选的 RGB 位掩码。 |
52 | BITMAPV2INFOHEADER | 未公开 | 删除可选的 RGB 位掩码;添加必选的 RGB 位掩码。Adobe Photoshop |
56 | BITMAPV3INFOHEADER | 未公开 | 添加必选的 Alpha 通道位掩码。Adobe Photoshop |
108 | BITMAPV4HEADER | Windows 95/NT4 及更高版本 | 添加色彩空间类型和伽玛校正。 |
124 | BITMAPV5HEADER | Windows 98/2000 及更高版本 | 添加 ICC 色彩特性。 |
下面是对三个典型版本的详细展开。
2.1 OS/2 Bitmap Header 格式
OS/2 Bitmap Header
格式是较早的 BMP 格式,目前仍有广泛应用。文件头大小为 14 字节,DIB 头大小为 12 字节。该格式不支持压缩。其文件头结构如下:
字节数 | 字段名 | 描述 |
---|---|---|
2 | 文件类型 | 文件类型为 “BM”(0x4D42) |
4 | 文件大小 | 整个 BMP 文件的大小 |
2 | 保留字段 1 | 保留字段,必须设置为 0 |
2 | 保留字段 2 | 保留字段,必须设置为 0 |
4 | 数据偏移量 | 图像数据相对于文件头的偏移量 |
4 | DIB 头大小 | DIB 头的大小 |
2 | 图像宽度 | 图像的宽度,以像素为单位 |
2 | 图像高度 | 图像的高度,以像素为单位 |
2 | 颜色平面数 | 始终设置为 1 |
2 | 每个像素的位数 | 像素的位数,通常为 24 |
2.2 Windows V1 BMP 格式
Windows BMP
格式是最常见的 BMP 格式,V1 是最初的版本,出于兼容性的考量,大多数应用程序使用较旧版本的 DIB 头保存文件。在不考虑 OS/2 的情况下,目前通用的格式为 BITMAPINFOHEADER 版本。文件头大小为 14 字节,DIB 头大小为 40 字节。该格式支持不同的压缩方式,包括无压缩、RLE-8、RLE-4 和 JPEG 压缩。其文件头结构如下:
字节数 | 字段名 | 描述 |
---|---|---|
2 | 文件类型 | 文件类型为 “BM”(0x4D42) |
4 | 文件大小 | 整个 BMP 文件的大小 |
2 | 保留字段 1 | 保留字段,必须设置为 0 |
2 | 保留字段 2 | 保留字段,必须设置为 0 |
4 | 数据偏移量 | 图像数据相对于文件头的偏移量 |
4 | DIB 头大小 | DIB 头的大小 |
4 | 图像宽度 | 图像的宽度,以像素为单位 |
4 | 图像高度 | 图像的高度,以像素为单位 |
2 | 颜色平面数 | 始终设置为 1 |
2 | 每个像素的位数 | 像素的位数,通常为 24 |
4 | 压缩类型 | 指定图像是否压缩,不压缩时值为 0 |
4 | 图像数据大小 | 图像数据的大小,以字节为单位 |
4 | 水平分辨率 | 每英寸的像素数 |
4 | 垂直分辨率 | 每英寸的像素数 |
4 | 调色板大小 | 调色板中颜色索引的数量 |
4 | 重要颜色数 | 图像中重要的颜色索引数 |
2.3 Windows V5 BMP 格式
Windows Windows V5 BMP
格式是 Windows BMP 格式的最新版本,文件头大小为 138 字节,DIB 头大小为 124 字节。这个格式支持更多的压缩方式和颜色空间类型,并提供了更多的颜色掩码和色度值等信息,支持更多的颜色空间类型和 ICC 数据,并提供了更多的关于颜色空间的信息。文件头结构如下:
字节数 | 字段名 | 描述 |
---|---|---|
2 | 文件类型 | 文件类型为 “BM”(0x4D42) |
4 | 文件大小 | 整个 BMP 文件的大小 |
2 | 保留字段 1 | 保留字段,必须设置为 0 |
2 | 保留字段 2 | 保留字段,必须设置为 0 |
4 | 数据偏移量 | 图像数据相对于文件头的偏移量 |
4 | DIB 头大小 | DIB 头的大小 |
4 | 图像宽度 | 图像的宽度,以像素为单位 |
4 | 图像高度 | 图像的高度,以像素为单位 |
2 | 颜色平面数 | 始终设置为 1 |
2 | 每个像素的位数 | 像素的位数,通常为 24 |
4 | 压缩类型 | 指定图像是否压缩,不压缩时值为 0 |
4 | 图像数据大小 | 图像数据的大小,以字节为单位 |
4 | 水平分辨率 | 每英寸的像素数 |
4 | 垂直分辨率 | 每英寸的像素数 |
4 | 调色板大小 | 调色板中颜色索引的数量 |
4 | 重要颜色数 | 图像中重要的颜色索引数 |
4 | 红色掩码 | 红色通道的位掩码 |
4 | 绿色掩码 | 绿色通道的位掩码 |
4 | 蓝色掩码 | 蓝色通道的位掩码 |
4 | Alpha 通道掩码 | Alpha 通道的位掩码 |
4 | 颜色空间类型 | 指定颜色空间类型 |
36 | 颜色空间端点 | 特定颜色空间的边界,它定义了该空间内可以准确表示的颜色范围 |
4 | Gamma 红色校正值 | Gamma 红色校正值 |
4 | Gamma 绿色校正值 | Gamma 绿色校正值 |
4 | Gamma 蓝色校正值 | Gamma 蓝色校正值 |
4 | Intent | 指定颜色空间的使用意图 |
4 | ICC 数据 | 包含颜色空间 ICC 数据的文件偏移量 |
4 | ICC 数据大小 | 颜色空间 ICC 数据的大小 |
4 | 保留字段 3 | 保留字段,一般设置为 0 |