BMP

BMP格式详解 — Windows位图文件的结构与用途

整理了 Windows 默认位图格式 BMP 的文件结构(文件头、信息头、颜色表、像素数组)、几乎不压缩导致体积大的原因、自下而上的存储方式与行填充规则,以及如今仍需要 BMP 的场合。

扩展名.bmp (.dib)
MIMEimage/bmp
规范Microsoft 文档(无正式国际标准)
压缩大多不压缩(可选 RLE)
透明度有限(32 位 V4·V5 头中定义 Alpha)
动画不支持
色深每像素 1·4·8·16·24·32 位

BMP 是把 Microsoft Windows 和 OS/2 中使用的 设备无关位图(DIB) 保存为文件的格式。它并非由国际标准组织制定的规范,而是由 Microsoft 的开发文档充当事实上的规范。结构简单、任何程序都能轻松读写,是它最大的特点。

文件结构

根据 Microsoft Learn 的“Bitmap Storage”文档,BMP 文件按以下顺序构成:

顺序组成部分内容
1BITMAPFILEHEADER文件标识(BM)、文件大小、像素数据起始位置
2BITMAPINFOHEADER(或 V4·V5 头)宽高像素、每像素位数、压缩方式、分辨率
3颜色表(RGBQUAD 数组)用于使用调色板的 1·4·8 位图像
4像素数组实际图像数据

文件的前两个字节是 ASCII BM(十六进制 42 4D),因此即使扩展名被改过,也能通过这个签名确认是否为 BMP。信息头中还有记录打印分辨率(每米像素数)的字段。

自下而上存储

一般的 BMP 从最下面一行到最上面一行依次(bottom-up)存储像素。如果头中的高度值为负数,则表示是从上到下(top-down)存储的。另外,每一行的字节数要在末尾加填充字节,使其成为 4 的倍数。这是自己编写 BMP 解析程序时经常出错的地方。

行大小计算示例

BMP 的每一行都必须按 4 字节对齐。24 位图像宽 101 像素时,一行的实际数据为 101 × 3 = 303 字节,为了成为 4 的倍数要填充 1 字节,按 304 字节保存。因此像素数据的总大小为 (每行字节数)× 高度像素,再加上文件头(通常为 54 字节)就是文件大小。正因为这条规则,直接处理宽度不是 4 的倍数的图像时,常会出现每行错位的错误。

体积大的原因

BMP 大多直接保存 未压缩 的原始像素。24 位 BMP 每像素占 3 字节,所以 1920×1080 的图像约为 6.2MB,4032×3024 的手机照片约为 36.6MB。8 位及以下的调色板图像可以选择 RLE(行程长度编码)压缩,但对照片几乎没有效果。MDN 也因为体积问题建议网页内容避免使用 BMP。

透明度

传统的 24 位 BMP 没有 Alpha 通道。使用 V4·V5 头的 32 位 BMP 可以定义 Alpha 掩码,但很多程序无法正确地将其解释为透明度,因此交换透明图片时用 PNG 更稳妥。

如今仍使用 BMP 的场合

  • 老旧的工业设备、嵌入式设备、小票打印机、部分企业内部程序只接受 BMP 时
  • 需要不经压缩和解压、直接处理像素的简单程序或教学示例
  • Windows 图标(ICO)内部小图像的存储方式

转换时的注意事项

  • BMP → PNG:无损,同时体积大幅减小。这是用于存档和分享的最佳转换。
  • BMP → JPG:如果是照片,体积可缩小到几十分之一,但会进行有损压缩。
  • 其他格式 → BMP:请确认设备要求的位数(24 位或 8 位)。透明区域会被背景色填充。可以在 图片格式转换 工具中保存为 BMP。

更新日期: 2026-09-23

参考来源

← 返回格式百科