BMP 转 Base64 工具

将 Windows 位图(.bmp)文件编码为 Base64。BMP 通常没有压缩,可以先转换为 PNG、JPEG 或 WebP,得到短得多的结果。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 将 .bmp 文件拖到上传区域,点击选择文件,或粘贴图片。
  2. 把目标格式设为 PNG,即可得到无损且小得多的结果;如果接收方必须使用 BMP,则保持原格式。
  3. 对比原始大小和编码后大小,看看节省了多少。
  4. 以 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。