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