一张 APNG 拆回多张图
逐帧解码 · 还原每一帧画面 · 纯浏览器本地处理,图片不上传
把合成器生成的 PNG 文件拖进来,就能拆回原来的几张图。
说明
- 每一帧拆出一张完整图片。拆出的 PNG 就是对方点开原图时看到的每一幅画面;合成器产出的双图文件拆开后,就是当初的图 A 和图 B,尺寸不变、无损还原。
- 部分帧动画会自动拼回完整画面。有些 APNG 为了省体积只存帧与帧之间变化的区域,这里会按标准(dispose / blend)合成回整幅图。
- 支持隔行扫描(Adam7),以及灰度 / 索引色 / 带透明键(tRNS)等各种 PNG 色彩类型。16-bit 深度的图按 8-bit 输出。
- 同样不上传。解析完全在浏览器里完成,断网(页面加载完之后)也能用,关闭页面什么都不留。
拆出来的图和当初合成前的原图一致吗?
内容一致:PNG 是无损格式,像素是逐帧原样解出来的,画质不会变差。但如果合成时选过「最大边长」缩放,拆出来的是缩放后的尺寸——合成时缩过多少,拆出来就是多大。
为什么帧数和当初选的图 B 张数对不上?
编码器会把「连续完全相同的帧」合并成一帧来省体积(和 Pillow 的 optimize 行为一致)。如果当初选的两张图 B 完全一样,合成后只有一帧,拆出来自然也只有一张。
怎么知道哪张是图 A、哪张是图 B?
第一帧标为「图 A」(聊天里第一眼看到的封面),后面依次是「图 B 1、图 B 2……」。文件名按帧序编号(xxx_f01.png、xxx_f02.png……)。若末帧停留时长达到小时级,会识别为「永久定格」模式并标注出来。
从别的地方拿来的 APNG,为什么拆不出来?
按常见程度排,多数是下面几种:
① 它其实不是 APNG。网上流传的动图大多是 GIF 或动图 WebP,这两种格式这里不处理。APNG 是 PNG 的扩展,文件头固定是 89 50 4E 47,用十六进制看一眼就能分辨。
② 已经被平台压成了静态图。微信、微博、X(Twitter)等平台转发时会转码,动画帧被丢掉、只剩第一帧。文件后缀还是 .png,但里面已经没有动画信息(缺 acTL 块),所以只能拆出一帧。这不是解析器的问题——源文件在转发的那一刻就已经变了。
③ 文件损坏或下载不完整。传输中断、被工具截断,会提示 CRC 校验失败或数据不完整。重新下载一次通常就好。
④ 文件太大。超过 100MB,或单幅画面超过 6400 万像素,会被拒绝处理。
⑤ 非标准 APNG。个别编码器产出的文件不完全符合规范(比如 fcTL 顺序异常、声明的帧数和实际不符),解析器会尽量还原,并在结果上方给出警告。
判断办法:解析完成后如果结果上方出现黄色警告条,按提示对照上面几条;如果直接报错,多半是第 ①②③ 种。
用别的工具(Pillow / ffmpeg 等)合成的 APNG,会不会因为合成方式不同而拆不出来?
不会。APNG 的几种合法合成变体——帧的 disposal(保留 / 清背景 / 还原上一帧)、blending(覆盖 / 叠加)、默认图是否算作动画第一帧、部分帧只存变化区域——解析器都会按规范还原成完整画面,逐像素与浏览器渲染结果一致。
真正需要注意的是语义标注:解析器固定把第一帧标成「图 A」(封面)、后面标成「图 B n」。这套命名是按本站合成器的习惯来的;如果源文件是别的工具合成的、帧的含义本来就不同,标注可能对不上,但每一帧的画面内容都是准确的,按顺序取用即可。
唯一会「拆不出」的合法情况是文件过大:单幅画面超过 6400 万像素(约 8000×8000)会被拒绝处理,这是浏览器内存的硬限制。
GIF 也能拆吗?
这里只处理 PNG / APNG。GIF 是另一种格式(还涉及有损调色板),需要的话用专门的 GIF 工具。
解析会被上传到服务器吗?
不会。和合成一样,解码全在浏览器里的 JS 完成,断网(页面加载完之后)也能用,关闭页面什么都不留。