如何将 Base64 转换为 WebP
- 粘贴 Base64 或完整的
data:image/webp;base64,...URI。包含 data URI 的代码(例如 CSS 的url()或<img>标签)也可以。 - 查看状态行中的 检测结果 是否为 WebP,再看预览图和上方的尺寸。动画 WebP 会在预览中播放。
- 点击 下载文件。扩展名已设为
webp。
三种 WebP
WebP 是一种 RIFF 容器,紧跟在 WEBP 标签之后的是三种块类型之一。由于这个标签位于固定的偏移处,类型在 Base64 中也出现在固定的位置:
| Base64 开头 | 块 | 含义 |
|---|---|---|
UklGR…XRUJQVlA4I | VP8 | 有损,无透明度 |
UklGR…XRUJQVlA4T | VP8L | 无损,可包含透明度 |
UklGR…XRUJQVlA4W | VP8X | 扩展格式:带 alpha 的有损图片、动画、ICC 配置文件或 EXIF |
UklGR 和 XRUJQ 之间的六个字符编码的是文件大小,每个文件都不一样。XRUJQ(来自 WEBP)始终位于第 12 到 16 个字符,VlA4(来自 VP8)位于第 17 到 20 个字符。你要看的是第 21 个字符:I、T 或 W。
WebP 的类型决定了转换文件时会发生什么。无损 WebP 可以很好地替代 PNG。有损 WebP 已经丢失了细节,转成 PNG 只会得到一个大文件,画质却回不来。扩展格式的文件可以包含多帧;转成静态格式只会保留第一帧。
在代码中检查 WebP 类型
用 Python 做同样的判断:读取块标签,对于扩展格式再读取标志字节:
import base64
def webp_kind(b64: str) -> str:
data = base64.b64decode(b64.split(",", 1)[-1])
if data[:4] != b"RIFF" or data[8:12] != b"WEBP":
return "not WebP"
chunk = data[12:16]
if chunk == b"VP8 ":
return "lossy"
if chunk == b"VP8L":
return "lossless"
flags = data[20]
parts = ["extended"]
if flags & 0x10:
parts.append("alpha")
if flags & 0x02:
parts.append("animated")
return ", ".join(parts)
对于 Pillow 生成的 WebP 文件,它会返回 lossy、lossless,带透明度的有损图片返回 extended, alpha,动画返回 extended, animated。详见 Python 中的 Base64。
RIFF 不一定是 WebP
UklGR 只表示“RIFF”。WAV 音频和 AVI 视频也以同样的方式开头,区别在于第 8 到 11 字节的标签。解码器会检查这个标签,所以粘贴到这里的 WAV 会被报告为“这看起来是 WAV,而不是 WebP”,并提供保存为 .wav 的按钮。Base64 转音频 可以播放它。
WebP 的 Base64 出现在哪里
- Canvas 导出,使用
toDataURL("image/webp", quality)。请检查结果:没有 WebP 编码器的浏览器会悄悄返回 PNG。 - 图片 API 和 CDN 会向任何支持 WebP 的客户端提供 WebP。如果图片是由浏览器获取的,即使字段名为
thumbnail_jpg,里面也可能是 WebP。 - HTML 和 CSS 中的内联占位图和图标,WebP 生成的字符串比 PNG 或 JPEG 更短。
- 聊天表情贴纸,通常是 WebP,有时是动图。
如果老程序拒绝打开保存的文件,请把这里显示的 SHA-256 与它收到的文件进行比较。两者一致,就说明那个程序不支持 WebP,转成 PNG 或 JPEG 副本即可解决。
常见问题
我的 Base64 WebP 是有损还是无损的?
看字符串的第 21 个字符。VlA4 后面是 I 表示有损的 VP8 图片,T 表示无损的 VP8L 图片,W 表示扩展格式,带透明通道的有损图片或动画都使用这种格式。
能把解码出的 WebP 保存为 PNG 或 JPG 吗?
不能靠改扩展名,字节仍然是 WebP。先下载 .webp,再到 WebP 转 Base64 中把 转换为 设为 PNG 或 JPEG,然后在 Base64 转 PNG 中解码新的字符串。
为什么 canvas.toDataURL('image/webp') 返回的是 PNG?
无法编码 WebP 的浏览器(尤其是 Safari)会悄悄返回 PNG 的 data URI。把结果粘贴到这里:如果显示 PNG,就是这个原因。
为什么在旧款 Mac 或 iPhone 上预览失败?
Safari 14 和 15 只在 macOS 11 Big Sur 及更高版本上显示 WebP,Safari 14 之前的版本完全不支持。这时预览会提示浏览器无法显示该图片,但 下载文件 仍能保存有效的 .webp。