图片转 Base64

图片转 data URI 字符串可复制,也支持 Base64 还原成图片预览

拖入图片转 Base64,或

图片不会上传,本地转换。


图片转 Base64(data URI):什么时候该内联,什么时候不该

data URI 的结构

转换结果是一个 data URI,结构如下:

data:[媒体类型][;base64],数据

例子说明
data:image/png;base64,iVBORw0...PNG 图片
data:image/svg+xml;base64,PHN2Zy...SVG,用 base64 编码
data:image/svg+xml,<svg ...>SVG 直接用 URL 编码(体积更小,见下)

它可以出现在任何接受 URL 的地方:<img src="...">、CSS 的 background-image、favicon、甚至 fetch() 的参数。浏览器会把它当成一个内联资源直接使用,不发起额外请求。

代价一:体积增加约 33%

Base64 用 4 个字符表示 3 个字节,所以编码后体积变为原来的 4/3 ≈ 133%。一张 100 KB 的图片变成约 133 KB 的文本。

如果服务端启用了 gzip 或 brotli,HTML/CSS 里的 Base64 内容能压掉一部分(Base64 的字符集有限,压缩率大约 25%~30%),所以实际传输体积增量会小于 33%——但仍然比直接传二进制图片更大。

代价二:失去独立缓存

这是比体积更重要的问题,也是最容易被忽略的:

外部图片内联 data URI
缓存单位图片文件本身整份 HTML/CSS 文档
改图片只重下图片包含它的整个文档都要重下
多页面使用只下载一次每个页面各存一份
首屏请求数多一个请求少一个请求

所以内联的收益是"减少请求数",代价是"缓存粒度变粗、跨页重复"。在 HTTP/2 下多个请求可以复用同一个连接、并发传输,"减少请求数"这个收益已经大幅缩水——这是内联在现代站点里比十年前更少被推荐的原因。

代价三:不能用响应式图片

内联之后就没有独立的资源 URL,所以这些能力全部失效:

这几条加起来意味着:对首屏关键的小图标有价值,对内容图片是明显的倒退。

什么时候该内联

场景建议理由
小于约 2-4 KB 的图标内联省掉一次请求的收益超过体积损失
只在某一页出现的装饰性图形内联不会被其他页面复用,缓存粒度问题不存在
必须保证"图片和页面同时到达"内联例如邮件、离线单文件页面
HTML 邮件内联或外链(视客户端)邮件客户端对图片的处理差异大
内容图片、商品图、博客配图不要内联体积大、需要响应式、需要 CDN 优化
会被多个页面复用的图标不要内联会被复制进每个页面,总体积翻倍
大图、背景图不要内联33% 的体积增量不可接受

SVG 的额外技巧

SVG 是文本格式,所以它其实不一定要用 base64——直接用 URL 编码(只转义 # < > 等少数字符)通常能得到更短的结果,因为 base64 会把 3 字节变成 4 字符,而明文里大量字符不需要转义。

但要注意:URL 编码形式的 SVG 里,# 必须转成 %23(否则会被当作片段标识符),引号也要处理。这是"SVG 直接内联导致图片不显示"的原因。

工具怎么用

把图片拖进工具或点选择文件,得到可复制的 data URI;下方也可以把 Base64 字符串粘贴回来,还原成图片预览并下载。

还原时如果只粘贴纯 Base64 内容(不带 data: 前缀),工具会自动补上 data:image/png;base64, 再预览——但这假设了格式是 PNG。如果原始是 JPEG 或 WebP,还原出来的图片虽然能显示,但 MIME 类型不对,下载后的扩展名也会不匹配。需要精确还原时应该保留完整的前缀。

整个转换在浏览器本地完成,图片不会被上传——这一点对处理客户素材、内部截图、含有个人信息的图片是必要的。

常见问题

还原时只粘贴纯 Base64 行吗?

可以,工具会自动补上 data: 前缀再预览和下载。