什么是 BMP 文件?
扩展名为 .BMP 的文件表示用于存储位图数字图像的位图图像文件。这些图像独立于图形适配器,也称为设备独立位图 (DIB) 文件格式。这种独立性的目的是在 Microsoft Windows 和 Mac 等多个平台上打开文件。 BMP 文件格式可以将数据存储为单色和具有各种颜色深度的彩色格式的二维数字图像。
BMP 文件格式规范
设备独立位图有助于在设备和应用程序之间交换位图。由于这种文件格式的不断发展,标题中包含的信息可能会根据 Bitmap 的版本而有所不同。单个位图文件由特定顺序的固定和可变大小结构组成。
位图文件中的结构按以下顺序排列:
结构 | 可选 | 尺寸 | 用途 |
---|---|---|---|
文件头 | 否 | 14 | 存储位图图像文件的一般信息 |
DIB Header | No | Fixed-Size | 存储位图图像的详细信息并定义像素格式 |
Extra Bit Masks | 是 | 12 或 16 字节 | 定义像素格式 |
调色板 | 半可选 | 可变大小 | 定义位图图像数据使用的颜色 |
Gap1 | 是 | 可变大小 | 结构对齐 |
Pixel Array | No | Variable-size | Pixel 格式由 DIB 标头或 Extra 位掩码定义。 |
Gap2 | 是 | 可变大小 | 结构对齐 |
ICC 颜色配置文件 | 是 | 可变大小 | 为颜色管理定义颜色配置文件 |
当位图图像加载到内存中时,它就变成了一个 DIB 结构,Windows 通过其 GDI API 使用它。文件头不是这个数据结构的一部分。颜色也可以由 16 位条目组成,这些条目构成当前引用调色板的索引,而不是明确的 RGB 颜色定义。让我们详细看看其中的一些,尤其是标题。
位图文件头###
位图文件头类似于用于识别文件的其他文件头。由于 BMP 文件格式有不同的变体,因此 BMP 文件格式的前 2 个字节是字符“B",然后是 ASCII 编码的字符“M"。所有整数值都以 little-endian 格式存储。
偏移十六进制 | 偏移十进制 | 大小 | 用途 |
---|---|---|---|
00 | 0 | 2 字节 | 用于标识 BMP 和 DIB 文件的头域为十六进制的 0x42 0x4D,与 ASCII 中的 BM 相同。它可以遵循可能的值。* BM - Windows 3.1x、95、NT、…等 * BA - OS/2 结构位图数组 * CI - OS/2 结构颜色图标 * CP – OS/2 常量颜色指针 * IC – OS/2 结构图标 * PT – OS/2 指针 |
02 | 2 | 4 字节 | BMP 文件的大小(以字节为单位) |
06 | 6 | 2 字节 | 保留;实际值取决于创建图像的应用程序 |
08 | 8 | 2 字节 | 保留;实际值取决于创建图像的应用程序 |
0A | 10 | 4 字节 | 可以找到位图图像数据(像素阵列)的字节的偏移量,即起始地址。 |
DIB头(位图信息头)####
有关图像的详细信息由此标头表示。基于此信息,将确定将用于在屏幕上显示图像的应用程序。所有此类标头都包含一个 DWORD(32 位)字段,指定它们的大小,以便应用程序可以轻松确定图像中使用的标头。这基本上是由于 DIB 格式经历了几次扩展。以下是列出字段的 DIB 标头。
调色板####
BMP 调色板是一个结构数组,用于指定显示设备调色板中每种颜色的 RGB 强度值。位图数据中的每个像素存储一个用作调色板索引的值。存储在该索引处的元素中的颜色信息指定该像素的颜色。位图文件中颜色的可用性变化如下:
- 1、4 和 8 位 - 应始终包含调色板
- 16 位、24 位和 32 位 - 从不包含调色板
- 16 位和 32 位 BMP 文件 - 包含位域掩码值代替调色板
像素存储####
位图像素存储为打包在行中的位,其中每行的大小通过填充四舍五入为 4 字节的倍数(32 位 DWORD)。存储图像像素所需的总字节数不能仅通过计数位来直接计算。由于涉及填充,因此需要将每行的大小向上舍入为 4 字节的倍数。填充字节(不一定是 0)将被附加到行的末尾,以便将行的长度增加到四个字节的倍数。当像素阵列加载到内存中时,每一行必须从 4 的倍数的内存地址开始。
图像实际上由像素阵列的 32 位 DWORD 表示形式描述。通常像素是“自下而上"存储的,从左下角开始,从左到右,然后逐行从图像的底部到顶部。像素格式及其含义如下所列:
- 每像素 1 位 (1bpp) 格式支持 2 种不同的颜色(例如:黑色和白色)。
- 每像素 2 位 (2bpp) 格式支持 4 种不同的颜色,每 1 个字节存储 4 个像素,最左边的像素位于两个最高有效位中。每个像素值是一个 2 位索引,最多可包含 4 种颜色。
- 每像素 4 位 (4bpp) 格式支持 16 种不同的颜色,每 1 个字节存储 2 个像素,最左边的像素位于更高的半字节中。每个像素值是一个 4 位索引,最多可包含 16 种颜色。
- 每像素 8 位 (8bpp) 格式支持 256 种不同的颜色,每 1 个字节存储 1 个像素。每个字节是最多 256 种颜色的表的索引。
- 每像素 16 位 (16bpp) 格式支持 65536 种不同的颜色,每 2 字节 WORD 存储 1 个像素。每个 WORD 都可以定义像素的 alpha、红色、绿色和蓝色样本。
- 24 位像素 (24bpp) 格式支持 16,777,216 种不同的颜色,每 3 个字节存储 1 个像素值。每个像素值定义像素的红色、绿色和蓝色样本(RGBAX 表示法中的 8.8.8.0.0)。具体来说,按顺序:蓝色、绿色和红色(每个样本 8 位)。
- 每像素 32 位 (32bpp) 格式支持 4,294,967,296 种不同的颜色,每 4 字节 DWORD 存储 1 个像素。每个 DWORD 都可以定义像素的 alpha、红色、绿色和蓝色样本。