BMP 是 Microsoft 在 Windows 中内置的位图图像格式,从最早的图形界面版本开始就一直是系统的一部分;IBM 的 OS/2 也有一个密切相关的变体。它的设计重点从来不是高级压缩。BMP 基本上就是程序要在屏幕上显示的像素的直接导出,加上一个简短的头部说明如何读取这些像素。你仍然会在 Windows 软件中的图标和资源、简单截图程序的输出,以及一个程序向另一个程序传递图像时使用的中间格式中遇到 BMP 文件。
BMP 如何存储图像
几乎总是不压缩的。文件一开始是一个小的头部,包含两个字母 BM、文件大小以及像素开始的位置,然后是第二个头部,用来描述图像本身:宽度、高度、位深以及颜色的排列方式。之后是可选的调色板,然后是像素数组,每个像素一个数值,没有任何删减。
有两个特点常常出乎意料。像素行通常自下而上存储,所以文件开头的像素是图片左下角的内容,并且每一行都会填充到 4 字节的倍数。位深可以从 1 位(意味着两种颜色)、通过 4 位和 8 位调色板,一直到 16、24 和 32 位真彩色。4 位和 8 位模式存在游程编码压缩,但很少使用,而 32 位模式可以包含 alpha 透明通道,不过老旧的软件往往会忽略它。
由于没有任何压缩,文件体积既可预估又很大:无论图像内容如何,24 位 BMP 都是每像素占 3 个字节,因此一张能装进小体积 JPG 的照片,换成 BMP 可能会变成好几兆字节。作为交换,这种格式读写极其简单,而且是无损的:不会丢弃任何细节。
BMP 携带哪些元数据
几乎没有,而这正是关于该格式最重要的一点。元数据是文件对自身保存的描述信息,而 BMP 的设计早于这一概念被重视的年代。BMP 中没有 EXIF、没有 IPTC、也没有 XMP,因此没有任何地方可以存放相机型号、摄影师姓名、说明文字或 GPS 坐标。它没有作者字段、没有标题,也没有任何形式的日期字段:BMP 唯一的日期来自文件系统,这个日期在文件之外,并且在复制文件时会改变。
报告所能显示的内容来自头部,它描述的是图像本身,而不是其历史:
- 宽度、高度和位深,以及像素行是自下而上还是自上而下。
- 压缩方法,通常是完全不压缩。
- 水平和垂直分辨率,以每米像素而不是更常见的每英寸点数来存储。
- 调色板中包含的颜色数量,以及其中有多少被视为对图像重要。
有一个与隐私真正相关的细节。扩展头部可以附加 ICC 颜色配置文件,并且允许将其链接而非内嵌,作为保存图像的那台机器上的文件路径来存储。这样的路径可能会暴露用户名或某人文件夹结构的形状。这种情况并不常见,但如果报告中显示了一个链接的配置文件,那就代表在原本几乎“沉默”的文件中,包含了关于某台电脑的真实细节。
何时使用 BMP
当简单性比体积更重要时,使用 BMP 是合理的:例如向只带有最小解码功能的程序或设备提供图像、在需要 BMP 的 Windows 软件内部工作,或在处理流程的两个步骤之间传递图片,而再次压缩会是多余的开销。由于是无损格式,你也可以反复重新保存,而不会降低图像质量。
对于任何要存储、发送或发布的内容,PNG 是更合适的选择。它同样是无损的,因此像素可以完整还原,但其滤波和压缩通常能将文件大小缩减到原来的一小部分,并且可以携带标题、作者和颜色配置文件。对于照片,JPG 或 WebP 会更小。使用 BMP 时应是出于明确的技术原因,而不是作为默认选择。