如果你最近遇到过 BMP,那多半是个意外——旧工具的截图、扫描仪的输出、一个结果比预期大二十倍的文件。BMP 是那个拒绝消失的格式,而搞懂它为什么那么大,同时解释了它的过时和它残存的用处。
BMP 是 bitmap(位图)的缩写,而这个名字字面上就是它的设计。文件就是一张位的地图:一个简短的文件头,说明图的宽、高、色深,接着就是像素本身,一个接一个,照顺序排。
微软在早期 Windows 里把它作为系统原生的图片格式引进。它不需要聪明——它需要的是“任何程序不靠压缩库就能读写”,而那是一个内存和“写复杂代码的耐心”都稀缺的年代。
那份单纯就是全部的故事。一个完全不懂图像压缩的程序也能写出 BMP,读也一样。
BMP 通常是不压缩的。每个像素都在文件里占满它完整的空间,不管它和旁边那个像素是不是一模一样。
算式毫不留情。1920 × 1080、每像素 24 位的图,就是 1920 × 1080 × 3 字节——大约 6 MB,每次都一样,和内容无关。一张人群的照片和一张纯白墙壁的照片,文件大小完全相同。
对照一下:同一张图存成合理质量的 JPG 大概 400 KB;存成 PNG,那面白墙会被压到几乎不剩。BMP 的大小不是画面的函数,只是尺寸的函数。
这个格式确实为低色深定义了一种行程长度编码模式,但很少被使用,而且对照片类内容几乎没有帮助。
它是无损的。什么都没丢。你写进去的像素就是你读回来的像素——这一点 PNG 和 TIFF 也做得到,JPG 做不到。
处理起来极度简单。没有解压缩这一步。软件可以用几行代码直接从文件里读出像素,而这在嵌入式系统、底层图形工作,以及任何“没有压缩库可用、或不欢迎它”的场合,到现在还是有意义的。
每个 Windows 程序都打得开。四十年的兼容性不是小事。
旧版扫描仪软件有时候默认输出 BMP,理由很合理——无损而且到处读得出来——而不合理的后果是一份二十页的扫描变成一 GB。
Windows 生态系的截图与采集工具偶尔还是会写出 BMP。
嵌入式与工业系统——机台控制面板、医疗仪器、老式收银终端——经常用 BMP 做界面图形,因为显示程序可以直接从文件里读像素。
游戏模组和旧软件的素材也常为了同样的理由用 BMP 存贴图和图块。
BMP 转 PNG 特别值得一提,因为那是一个完全没有坏处的转换。两者都无损,所以像素一模一样;PNG 只是把它们压起来。你什么都没失去,而且常常省下 60–80%。
如果有人给了你一个 BMP,转掉它。如果某个程序在产出 BMP,去改它的输出设置。唯一该留着的理由是某个特定软件就是要 BMP——而如果是那种情况,你早就知道了。