ToolBench

图片

图片转 Base64

内联图片能省掉一次 HTTP 请求,代价是体积大约多三分之一,而且无法单独缓存。图标这么做划算,照片这么做不划算。

把图片拖到这里,或点击选择。

怎么用

  1. 拖入或选择一张图片。
  2. 复制原始 data URI,或直接用 CSS、HTML 按钮。
  3. 留意体积比——接近 1.33 倍是 Base64 的正常值。
  4. 内联图片控制在 10 KB 以内才划算。

内联的真实代价

data URI 省掉一次 HTTP 请求,但让载荷大了约三分之一,无法单独缓存,还会阻塞包含它的样式表的渲染。在 HTTP/2 下,很多小请求本身很便宜,省下的那一次请求远不如十年前值钱。几 KB 以内的图标和占位图内联是划算的,照片类的东西内联就是亏。

它真正帮上忙的地方

单文件 HTML 导出、必须能经得起转发的邮件模板、以及必须在任何网络往返之前渲染出来的 CSS。这些场景的约束是可移植性,不是速度。一旦资源放在带长缓存头的 CDN 上,独立文件几乎总是更好的安排——浏览器只下一次,之后再也不下。

2 KB 法则,以及它为什么还成立

只有小体积、被重复使用的资源才值得内联:图标、logo、一个单色转圈动画。Base64 会让字节膨胀约 33%,而 gzip 补不回来——编码后的文本熵很高,几乎压不动,反观原 PNG 本来还留着大量冗余。超过大约 2 KB,多出来的字节就比省下的那次请求更贵。

另一个代价是缓存。内联的图片会随每个包含它的页面重新下载,无法单独缓存;独立文件只需取一次,之后全站复用,回访也能命中。

常见问题

为什么 Base64 版本更大?

Base64 把每三个字节映射成四个字符,体积自然涨约 33%。压缩也没用,因为数据已经是编码过的。

什么时候该内联?

小图标、logo、加载占位图这类「省一次请求比多几个字节更重要」的场景。超过 10 KB 左右,独立文件交给浏览器缓存更划算。

能用在邮件模板里吗?

很多邮件客户端会屏蔽 data URI,Outlook 尤其不渲染。还是把图片托管出去再引用链接。

文件会上传吗?

不会。转换由当前标签页里的 FileReader 完成,图片不会被传输。

能直接粘进 CSS 吗?

可以:background:url(data:image/png;base64,...)。控制在几 KB 以内,否则样式表本身就成了瓶颈。

为什么字符串比文件还长?

Base64 把三个字节映射成四个字符,所以文本恰好是二进制大小的 4/3,如果工具还加了换行,会更长。