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

Base64 转 GIF

粘贴 GIF 的 Base64,动画就在这里播放。下载的 .gif 文件保留所有帧、时间和透明度。

免费 无需注册,不限次数 本地 不上传任何内容 可播放 保存前预览动画 更新于 2026年10月27日
输入 –输出 –大小 –

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

如何将 Base64 转换为 GIF

  1. 把 Base64 或 data:image/gif;base64,... URI 粘贴到输入框,或者打开包含它的 .txt 文件。
  2. 确认状态行中的 检测结果 为 GIF。预览会开始播放动画,上方会列出像素尺寸。
  3. 点击 下载文件,保存为 .gif。

不会重新绘制或重新压缩任何内容。保存的文件与当初编码的 GIF 拥有相同的帧、延迟、调色板和透明度。

真的是 GIF 吗?是动图吗?

GIF 以 GIF89a 或 GIF87a 开头,在 Base64 中就是 R0lGODlh 或 R0lGODdh。动画、透明度和循环控制都需要较新的 89a 版本,所以以 R0lGODdh 开头的字符串实际上都是静态图片。

89a 文件会不会动取决于其内容:只有一个图像块还是有很多个。预览一眼就能告诉你。要细看的话,打开 显示 hex 转储。动态 GIF 的 ASCII 列中通常会出现文本 NETSCAPE2.0,这就是保存循环次数的块。颜色表较小时,它位于头几行。带有完整 256 色颜色表的 GIF 前面先有 768 字节的调色板,会把这个块推到转储所显示的 512 字节之外。

如果页面提示“这看起来是 WebP,而不是 GIF”或给出 MP4,说明这个“GIF”在传输途中被转换过。即时通讯应用和 GIF 搜索服务经常以 WebP 或 MP4 视频的形式提供动图,因为它们小得多。用 下载为 按其真实扩展名保存,如果是 MP4,也可以在 Base64 转视频 中打开。

在代码中查看帧、时间和循环

不打开编辑器也能检查 GIF,Pillow 可以读出你需要的所有信息:

import base64, io
from PIL import Image

def gif_info(b64: str) -> dict:
    data = base64.b64decode(b64.split(",", 1)[-1])
    with Image.open(io.BytesIO(data)) as im:
        durations = []
        for i in range(getattr(im, "n_frames", 1)):
            im.seek(i)
            durations.append(im.info.get("duration", 0))
        return {
            "size": im.size,
            "frames": len(durations),
            "total_ms": sum(durations),
            "loop": im.info.get("loop"),
        }

对于一个每帧 100 ms、共 3 帧的测试动画,它返回 {'size': (20, 20), 'frames': 3, 'total_ms': 300, 'loop': 0}。loop 为 0 表示“无限循环”;None 表示文件没有循环块,只播放一次。文件处理的更多内容见 Python 中的 Base64。

Base64 GIF 从哪里来

  • CSS 和 HTML 中的加载动画,以 data:image/gif;base64,... 的形式内联,这是 CSS 动画和 SVG 普及之前的习惯做法。
  • 旧式 HTML 邮件模板和签名,其中嵌入了小型动态 logo。
  • API 响应和聊天记录导出,以 Base64 字段包含贴纸或表情回应。
  • 占位像素:用作空 src 的 1×1 GIF。它的预览看起来是空白的,所以在认定解码失败之前,先看看尺寸。

解码后的 GIF 大小

GIF 用一种古老的压缩方式存储每一帧,所以很短的动画也很快就会达到几 MB,Base64 还要在此基础上再增加三分之一。大小 一行显示解码后的大小:如果一个“小”GIF 字符串有 5 MB,GIF 本身大约是 3.75 MB。在这里解码没问题,但不适合再内联回页面中。如果要重新制作,一段简短的循环 MP4 或 WebM 通常只有它的几分之一大小。要编码 GIF,请使用 GIF 转 Base64。

常见问题

为什么解码出来的 GIF 只播放一次?

循环设置是文件的一部分。没有 NETSCAPE2.0 块,或者循环次数为 1 时,浏览器只播放一遍动画,然后停在最后一帧。解码会保留文件中原有的设置;要修改,请使用 GIF 编辑器。

怎么统计 Base64 GIF 有多少帧?

预览会播放 GIF,但不统计帧数。在 Python 中,Pillow 的 n_frames 给出帧数,各帧的 duration 加起来就是总时长;本页的代码片段两者都做了。

为什么 GIF 播放到一半就停了,或者最后一帧是坏的?

Base64 被截断了。浏览器会播放已收到的帧,在数据结束的地方停下。完整的 GIF 以结束字节 3B 结尾,所以它的 Base64 通常以 ADs=、Ow== 或 A7 结尾。