上传文件
  1. base64hub
  2. 图片工具
  3. Base64 转图片

Base64 转图片

粘贴 Base64 或完整的 data:image/... URI,立刻就能看到图片。工具会读取文件签名,所以即使字符串没有前缀,下载的文件也会带上正确的扩展名。

免费 无需注册,不限次数 本地 不上传任何内容 自动 根据开头字节识别格式 更新于 2026年10月27日
输入 –输出 –大小 –

在你的浏览器中处理。此页面无法将你的数据发送到任何地方: 我们如何确认

如何将 Base64 转换为图片

  1. 把字符串粘贴到输入框。保存在文件里的长字符串可以用 打开 .txt 文件 打开,或直接拖到输入框上。
  2. 开启 实时 时,粘贴后图片立即解码。状态行会显示 Base64 是否有效、变体(标准或 Base64URL)、字节数以及 检测结果 中的格式。
  3. 检查预览。预览下方会列出类型、MIME 类型、扩展名、字节大小、像素尺寸和 SHA-256 哈希。
  4. 需要的话修改 文件名,然后点击 下载文件。如果要在 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:...),或者值为 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 类型
PNG89 50 4E 47 0D 0A 1A 0AiVBORw0KGgoimage/png
JPEGFF D8 FF/9j/image/jpeg
GIFGIF89a / GIF87aR0lGODlh / R0lGODdhimage/gif
WebPRIFF、大小、WEBPUklGR,第 12–16 个字符为 XRUJQimage/webp
SVG<svg / <?xmlPHN2Zy / PD94bWwgimage/svg+xml
ICO00 00 01 00AAABAAimage/x-icon
BMPBMQkimage/bmp
HEIC大小、ftypheicAAAA,第 9 个字符起为 eXBoZWljimage/heic
TIFFII* / MM*SUkqAA / TU0AKgimage/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 的 转换为 选项处理,再解码结果。