使用方法
- 将 .bmp 文件拖到上传区域,点击选择文件,或粘贴图片。
- 把目标格式设为 PNG,即可得到无损且小得多的结果;如果接收方必须使用 BMP,则保持原格式。
- 对比原始大小和编码后大小,看看节省了多少。
- 以 Data URI、纯 Base64、img 标签、CSS 规则或 Markdown 图片的形式复制或下载结果。
什么是 BMP 文件?
BMP 是 Windows 的设备无关位图格式,按行存储像素,几乎总是不压缩(4 位和 8 位图像有一种简单的行程编码模式)。它的 MIME 类型是 image/bmp,部分系统会报告为 image/x-ms-bmp;Base64 输出以 Qk 开头,也就是字母 BM 编码后的结果。
由于没有压缩,文件大小直接由尺寸决定。一张 800×600 像素的 24 位图片约需 1.4 MB,Base64 后接近 1.9 MB 文本。
编码前先转换为 PNG
PNG 同样是无损格式,普通的 24 位位图转换为 PNG 后像素完全不变,文件却会缩小,通常能小好几倍,截图和纯色图形缩小得更多。如果是以 BMP 保存的照片,以较好的质量转换为 JPEG 或 WebP,字符串还会更短。工具会显示每张图片的原始大小和编码后大小,差别一目了然。
什么时候保留原始 BMP
有些接收方需要真正的位图,例如较老的 Windows 软件、标签和小票打印机、由单片机驱动的小屏幕,或者必须与文件逐字节一致的测试数据。这时请不要开启转换,Base64 输出就是原文件的精确副本。所有主流浏览器都能显示 data:image/bmp 图片,但用于网页和邮件时,PNG 是更好的选择。
用 Python 和 Pillow 在脚本中完成同样的转换:
from PIL import Image
import base64, io
buf = io.BytesIO()
Image.open('scan.bmp').save(buf, 'PNG')
uri = 'data:image/png;base64,' + base64.b64encode(buf.getvalue()).decode()
常见问题
为什么 BMP 的 Base64 字符串这么长?
BMP 不压缩地保存每个像素,Base64 又在此基础上增加三分之一。先转换为 PNG 通常能大幅缩短字符串,而且不损失任何细节。
BMP 转 PNG 会降低画质吗?
不会。PNG 是无损格式,像素保持不变,改变的只是存储方式。
浏览器能显示 data:image/bmp 地址吗?
能,Chrome、Edge、Firefox 和 Safari 都支持 BMP。但邮件客户端和许多在线平台对它的支持不太可靠,这些场景下 PNG 更稳妥。
BMP 支持透明吗?
32 位 BMP 可以存储 Alpha 通道,但不同程序和浏览器的处理并不一致。需要透明效果时,请转换为 PNG 或 WebP。