Windows 位图 (.bmp)
微软 标准位图图像文件 (BMP) 是微软的基础设备无关光栅图形格式,用于存储未压缩或 RLE 压缩的扫描线,并与硬件帧缓冲区直接兼容。
将 BMP 转换为 PNG
免费的浏览器端 BMP 转 PNG 转换器。在您的设备上即时转换文件。
检查与元数据
操作系统和文件分析器通过检查开头的二进制字节序列来识别 BMP 文件:
字节级文件头签名 (魔数)
操作系统和文件分析器通过检查开头的二进制字节序列来识别 BMP 文件:
十六进制签名 (偏移量 0):
42 4DASCII 表示形式: BM
标准化: 微软 Windows 设备无关位图(DIB)架构
技术规格
| 容器架构 | BITMAPFILEHEADER,后接 BITMAPINFOHEADER(DIB)和光栅像素数组 |
| 压缩方式 | 未压缩的原始扫描线,或可选的 BI_RLE8 / BI_RLE4 行程长度编码 |
| 字节序 | 小端序(Intel x86 字节序) |
| 色彩空间 | 设备相关 RGB, sRGB(内嵌于 BITMAPV5HEADER) |
| 通道与结构 | 1 位单色、4 位 / 8 位调色板、16 位、24 位 RGB 或 32 位 RGBA |
| 最大尺寸 | 2,147,483,647 x 2,147,483,647 像素(有符号 32 位整数) |
| 透明度 | 现代 BITMAPV3HEADER 和 V5HEADER 格式支持 32 位 BGRA Alpha 遮罩 |
| 流式传输与渐进式加载 | 不支持流式读取;扫描线默认按倒序(自下而上)存储,高度为负值时除外 |
技术对比矩阵:BMP 对比同类产品
| 技术属性 | BMP (当前) | PNG | TIFF | JPG |
|---|---|---|---|---|
| 压缩模式 | 未压缩 / 极简 RLE | 无损 Deflate(缩小约 70%) | 未压缩 / LZW / Zip | 有损 DCT(体积约小 90%) |
| 解码速度 | 瞬时内存复制 | 需要 Deflate 解压 | 需要 LZW/ZIP 解压 | 需要 IDCT 计算 |
| 扫描线排序 | 从下到上(倒置) | 从上到下 | 从上到下 / 条带 | 从上到下 MCU 块 |
| 网页适用性 | 非常差(文件数据量庞大) | 非常适合图形 | 较差(桌面排版) | 非常适合摄影 |
常见损坏模式与十六进制恢复指南
图像出现对角错切或倾斜。
根本原因: 行填充计算错误(未能将每条扫描线填充到 4 字节边界)。
恢复方法: 使用 File2File.app Image Converter 重新编码以强制执行正确的 32 位扫描线跨距。
安全分析与解析器攻击向量
BMP 解码器在根据不受信任的 DIB 标头尺寸分配缓冲区时,经常遭受缓冲区过读的影响。
已知攻击向量
- 计算 width * height * bpp 时发生整数溢出,导致分配的堆内存过小,进而越界写入。
- 损坏的 RLE8/RLE4 游程编码转义序列导致内存写入超出分配的缓冲区。
- 攻击者可通过构造标头尺寸触发数 GB 的内存分配,造成拒绝服务。
防御性最佳实践: 在分配目标内存之前,严格验证 DIB 头的宽度、高度和位深度边界。
历史渊源与里程碑
1998Windows 98 引入了 BITMAPV5HEADER,增加了 ICC 颜色配置文件管理和伽马校正。
1990Windows 3.0 在整个操作系统中标准化了 BITMAPINFOHEADER DIB 规范。
1987随 Windows 2.0 和 OS/2 1.1 一起引入,作为原生显示光栅格式。
核心优势与特点
- 零压缩退化:100% 精确的逐像素存储,无任何压缩伪影。
- Windows 提供原生 BMP 编解码器,其他操作系统和应用中的支持情况则有所不同。
- 极低的解码复杂度使其非常适合嵌入式微控制器和图形编程教育。
技术局限与劣势
- 由于缺乏 DEFLATE 或霍夫曼编码等现代熵压缩,文件体积异常庞大。
- 不适合网页传输或移动网络分发。
- 自下而上存储的扫描线需要在现代自上而下的图形处理流程中逐行翻转。
趣味技术冷知识
- BMP 默认将图像扫描线倒序存储(从下到上),这是因为 OS/2 使用了数学上的笛卡尔坐标系。
- 如果 BMP 标头中的高度值设置为负数,则图像将正向解码(从上到下)。
- BMP 文件中的每一条扫描线必须用零填充到 4 字节的倍数(32 位边界对齐)。
常见技术问题
为什么 BMP 文件这么大?
BMP 文件存储每个像素的原始、未压缩色彩值,而诸如 PNG 之类的格式则在不失真的前提下对这些数据进行压缩。
BMP 支持透明度吗?
可以。32 位 BMP 文件(使用 BITMAPV3HEADER 或更新版本)可以存储 8 位 Alpha 通道,尽管旧版软件的支持情况各不相同。
如何减小 BMP 文件的大小?
使用 File2File.app 将 BMP 转换为 PNG,通常可在不损失画质的情况下将文件体积缩小 60% 至 85%。