如何将 Base64 转换为图片
- 把字符串粘贴到输入框。保存在文件里的长字符串可以用 打开 .txt 文件 打开,或直接拖到输入框上。
- 开启 实时 时,粘贴后图片立即解码。状态行会显示 Base64 是否有效、变体(标准或 Base64URL)、字节数以及 检测结果 中的格式。
- 检查预览。预览下方会列出类型、MIME 类型、扩展名、字节大小、像素尺寸和 SHA-256 哈希。
- 需要的话修改 文件名,然后点击 下载文件。如果要在 HTML 或 CSS 中使用,复制为 data URI 会给你一个干净的
data:URI。
示例 会加载一张小 PNG,在粘贴自己的数据之前,可以先看看输出是什么样子。
可以粘贴哪些内容
图片字符串很少是干干净净送到你手上的,所以解码器对 Base64 外层的包装很宽容:
- 纯 Base64,即 API 返回的样子:
iVBORw0KGgoAAAANSUhEUg... - data URI:
data:image/png;base64,iVBORw0KGgo... - 包含 data URI 的代码:
background-image: url("data:image/svg+xml;base64,...")、<img src="data:image/jpeg;base64,...">、Markdown 图片,或者值为 data URI 的 JSON 字段。工具会自动提取第一个 data URI。 - 带换行的 Base64,来自邮件源码或 PEM 风格的输出,每 64 或 76 个字符有空格或换行。
- 含
-和_的 URL 安全 Base64、没有=填充的字符串,以及被引号包着的值。
如果 Base64 位于 JSON 字段中且没有 data: 前缀,只复制引号之间的值。整个 JSON 文档会被判定为无效的 Base64,因为 { 不在字母表里。
如何识别格式
每种图片格式都以固定的签名开头,也就是魔数(magic bytes)。工具会先解码字符串,再把开头的字节与这些签名比对,所以标着 image/png、实际装的是 JPEG 的字符串会被识别为 JPEG。这些签名在 Base64 本身中也能看出来,读日志或数据库转储时很有用:
| 格式 | 开头字节 | Base64 开头 | MIME 类型 |
|---|---|---|---|
| PNG | 89 50 4E 47 0D 0A 1A 0A | iVBORw0KGgo | image/png |
| JPEG | FF D8 FF | /9j/ | image/jpeg |
| GIF | GIF89a / GIF87a | R0lGODlh / R0lGODdh | image/gif |
| WebP | RIFF、大小、WEBP | UklGR,第 12–16 个字符为 XRUJQ | image/webp |
| SVG | <svg / <?xml | PHN2Zy / PD94bWwg | image/svg+xml |
| ICO | 00 00 01 00 | AAABAA | image/x-icon |
| BMP | BM | Qk | image/bmp |
| HEIC | 大小、ftypheic | AAAA,第 9 个字符起为 eXBoZWlj | image/heic |
| TIFF | II* / MM* | SUkqAA / TU0AKg | image/tiff |
AVIF、JPEG XL 和光标(.cur)文件同样能识别。如果 data URI 声明的类型与内容不符,会有一条提示同时列出两者。如果数据根本不是图片,比如是 PDF,页面会说明这一点,并提供 下载为 .pdf 按钮。常见 Base64 前缀 页面列出了更多文件类型的签名。
图片为什么显示不出来
字符串被截断了。 日志单行长度限制、数据库字段长度、电子表格单元格(32,767 个字符)以及从终端复制粘贴,都会截断 Base64 值。这时 JPEG 或 PNG 只能渲染出一部分,或者预览直接失败。如果多一个或少一个字符导致长度不可能成立,会出现“长度错误”。有效但偏短的字符串解码时不会报错,所以请把 大小 与预期值对比一下。
data URI 中的 MIME 类型不对。 JPEG 字节前面写着 data:image/png,在浏览器里通常仍能显示,因为浏览器会嗅探位图格式,但其他软件会相信这个标签。SVG 从不被嗅探:只要类型不是 image/svg+xml,它在 <img> 中就不会渲染。工具在预览和下载时使用的是真实格式。
字符在传输中被改动了。 经过表单编码的 + 经常会变回空格。如果单行字符串中有空格却完全没有 +,解码器会把空格还原为 +;如果两者同时出现,就无法区分,图片可能被解码成错误的字节。有些库生成的 JSON 会把斜杠转义成 \/;解码器会自动去掉这些转义以及字面的 \n 序列。更复杂的情况可以用 修复 Base64,它会列出所做的每一处修复。
被编码了两次。 如果解码后的字节本身又是 Base64 文本,会有提示说明,再次解码 可以解开下一层。返回 回到上一步。Base64 里套着的 data URI 以及 gzip 或 zlib 压缩的数据也同样适用。
浏览器不支持显示这种格式。 iPhone 拍的 HEIC 照片只有 Safari 17 及以上版本能显示,TIFF 只有 Safari 能显示,JPEG XL 需要 Safari 17、Chrome 155 或 Firefox 158 及更新版本。这时预览会提示浏览器无法显示,但字节是完整的:下载文件 保存下来的文件可以用看图应用正常打开。
根本不是图片。 以 JVBER 开头的 Base64 字符串是 PDF,UEsDB 是 ZIP 压缩包。请使用 Base64 转文件,它可以预览文档、压缩包、音频等更多类型。
用正确的扩展名保存
在你手动修改之前,扩展名 和 MIME 类型 字段会根据检测到的格式自动填写,所以即使输入中没有任何地方写着“PNG”,PNG 也会保存为 .png。Windows 和上传表单都靠扩展名判断文件类型。把 WebP 改名为 .jpg,里面仍然是 WebP,严格的软件会拒绝它。
两个字段都可以手动覆盖,例如把图标保存为 .cur,或者填入你自己的 MIME 类型。修改 MIME 类型后,预览也会按新类型重新渲染。
SHA-256 和 hex 转储
预览下方的 SHA-256 哈希是对解码后的字节计算的。把它与发送方提供的哈希、数据库记录或 sha256sum image.png 的结果对比,就能证明你保存的图片与当初编码的文件逐字节一致。要对其他数据计算哈希,请使用 SHA-256 工具。
显示 hex 转储 会显示前 512 个字节。这是查看文件头最快的方法:PNG 的宽度和高度位于偏移 0x10 处,相机拍摄的 JPEG 中有 Exif 标记,ICO 文件则有图像目录。
隐私:图片留在你的设备上
Base64 图片往往是你不愿上传到陌生网站的东西:bug 报告里的截图、身份证或护照的扫描件、从患者门户导出的医学影像、在平板上采集的签名。本页完全在你的浏览器中解码这些图片。页面的内容安全策略会阻止脚本发出网络请求,Cloudflare 的浏览量统计除外,下载文件 则从本地 blob: URL 保存。你粘贴的任何内容都不会被网站存储。
在代码中解码 Base64 图片
在 Python 中,去掉前缀、补全填充,再根据签名确定扩展名:
import base64, re
def save_image(b64: str, stem: str = "image") -> str:
b64 = re.sub(r"^data:[^,]*;base64,", "", b64.strip(), flags=re.I)
b64 = re.sub(r"\s+", "", b64).replace("-", "+").replace("_", "/")
data = base64.b64decode(b64 + "=" * (-len(b64) % 4))
if data.startswith(b"\x89PNG"):
ext = "png"
elif data.startswith(b"\xff\xd8\xff"):
ext = "jpg"
elif data.startswith(b"GIF8"):
ext = "gif"
elif data[:4] == b"RIFF" and data[8:12] == b"WEBP":
ext = "webp"
else:
ext = "bin"
with open(f"{stem}.{ext}", "wb") as f:
f.write(data)
return f"{stem}.{ext}"
在浏览器中,把字符串转成 Blob,再通过对象 URL 显示:
function base64ToBlob(b64, type = "image/png") {
const bin = atob(b64.replace(/^data:[^,]*;base64,/, "").replace(/\s+/g, ""));
const bytes = Uint8Array.from(bin, c => c.charCodeAt(0));
return new Blob([bytes], { type });
}
img.src = URL.createObjectURL(base64ToBlob(str));
读写二进制数据的更多内容见 Python 中的 Base64 和 JavaScript 中的 Base64。反方向操作请使用 图片转 Base64,它可以编码图片,并支持缩放和格式转换。
常见问题
需要 data:image/png;base64, 前缀吗?
不需要。纯 Base64 就能用,类型会根据解码后的字节识别。如果粘贴的是完整的 data URI,前缀会被自动去掉,并且会核对声明的类型和实际内容是否一致。
怎么判断一个 Base64 字符串是什么图片格式?
看开头几个字符:iVBORw0KGgo 是 PNG,/9j/ 是 JPEG,R0lGOD 是 GIF,UklGR 是 WebP 之类的 RIFF 文件。粘贴到上方,检测结果 字段会直接告诉你格式。
为什么解码出来的图片下半部分缺了一块?
Base64 字符串在复制、写日志或存储时被截断了。对于不完整的 PNG 或 JPEG,浏览器会尽量画出能画的部分。请从源头重新复制这个值;字符串里没有的字节,任何工具都无法恢复。
在这里解码截图或证件照安全吗?
解码由本页的 JavaScript 完成,页面的内容安全策略会阻止它发出除 Cloudflare 的浏览量统计以外的所有网络请求,所以图片不会被发送到任何地方。解码时可以打开浏览器开发者工具的网络面板自行确认。
能把解码出的图片转换成其他格式吗?
不能,它保存的就是当初被编码的原始字节。如果需要 PNG、JPEG 或 WebP 版本,请下载文件后用 图片转 Base64 的 转换为 选项处理,再解码结果。