# GIF 拆帧 — 每一帧存成一张 PNG

每一帧都单独存成一张 PNG。

> 把动图 GIF 拆成一帧一帧，每帧单独存成 PNG，免费，全程在浏览器里完成。透明和时长都保留下来。什么都不上传，断网也能用。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/split-gif/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的 GIF **在浏览器里处理**，无须上传处理。

GIF 的读取、解压和绘制都由你自己的浏览器完成，每一张 PNG 也是在这台机器的内存里编码出来的。就算这里有什么东西想把动图送走，页面的另一端也根本没有服务器可以接。

- ✗ 不上传
- ✗ 不注册
- ✓ 断网可用
- ✓ 开源
- ✓ 文件不出这台机器

## GIF 拆帧的步骤

1. **选一个 GIF。** 拖到选择框里，或者自己找出来。浏览器直接从磁盘上读，页面会告诉你它看到了什么：尺寸、帧数、播多久、循环几遍。
2. **决定每张 PNG 里放什么。** **看上去的那一帧**是绝大多数人要的，也就是动画在那一刻的整幅画面。**只要这一帧真正存下的像素**是文件里实际带着的那块补丁，保持它自己的大小和位置。GIF 之所以小就是靠它，而它并不是动画看起来的样子。
3. **决定透明怎么处理。** PNG 能原样保留透明，这是诚实的默认值。要是这些帧要拿去的地方根本不认透明、会把它变成黑色，那就改成填一个颜色。
4. **挑出你要的帧。** 默认全要。“每两帧留一帧”用来给长录像瘦身，网格里的勾选框比它优先。编号从来不会变，所以不管你把邻居丢掉多少，第 42 帧还是第 42 帧。
5. **下载。** 从网格里一帧一帧存，或者打包成一个 ZIP 一次拿走，这样保存提示只弹一次，而不是几百次。ZIP 里可以放一个 `frames.txt`，写明每一帧停留了多久，这是一堆 PNG 摆在文件夹里唯一说不出来的事。

## 说得更细的版本

[怎么把 GIF 拆成一帧一帧](https://abox.tools/zh/guides/split-a-gif-into-frames/): 把动图 GIF 的每一帧存成 PNG：为什么有些帧只是画面里的一小块、透明会怎么样，以及怎么把时间留住，好把它再拼回去。

## 工具箱里还有

- [GIF 分析](https://abox.tools/zh/gif-analyzer/): 帧、延时、调色板，以及每个字节的去向。
- [视频压缩](https://abox.tools/zh/compress-video/): 说一个它最多能有多大。剩下的工具来算，做完先量一遍再交给你。
- [MP4 转换](https://abox.tools/zh/convert-to-mp4/): 不管从录屏、压制还是相机里出来的是什么，都变成 MP4 里的 H.264 和 AAC。能复制的原样复制，非改不可的才重新编码。
- [视频旋转](https://abox.tools/zh/rotate-video/): 转四分之一圈、半圈，或者往另一边转。使用文件头旋转时，每一帧画面保持原样。

## 常见问题

### 我的 GIF 会被传到哪里去吗？

不会。文件的读取、解压和绘制都由你自己的浏览器在你自己的硬件上完成，每张 PNG 也是在这里的内存里编码的。这个工具没有服务端，页面的 `Content-Security-Policy` 里写着它允许联系的每一个地址，没有一个属于本站。拔掉网线，它照样拆 GIF。

### 为什么有一帧看着像画面的一小块？

因为文件里存的就是那样。GIF 是一张起始画面加上后面一连串补丁：后面每一帧只存变化的那个矩形，屏幕上其余部分是前面几帧留在那儿的。一个人对着不动的墙说话，于是每帧存的是一张脸，而不是一整幅画面，这个格式不至于大得离谱，全靠这一点。 \
\
你现在看到这个，是因为选的是“只要这一帧真正存下的像素”。改成“看上去的那一帧”，每张 PNG 就都是动画在那一刻的整幅画面了。

### 透明保留得住吗？

保留得住。GIF 的透明只有一位，一个像素要么画上了要么看不见，中间没有过渡，而 PNG 存的正好就是这个，所以帧出来时透明区域是完好的。你要是更想要实心背景，把“透明区域”改成填一个颜色，那个颜色会写进 PNG，之后就取不出来了。

### 为什么帧延时不是我以为的数字？

GIF 里每帧延时是按百分之一秒存的，而从九十年代起，浏览器就把小于两个百分之一秒的值一律抬到十分之一秒。这条规矩是为当年那些转动的地球图写的，后来一直没删。所以文件里写 0.01 秒的帧，在哪儿都是按 0.10 秒播。这个工具显示的是真正播出来的延时，两者对不上时，会把文件里存的值写在旁边。

### 拆出来的帧还能拼回去吗？

能，用本站的 [GIF 制作](https://abox.tools/zh/gif-maker/)，或者任何接受一文件夹图片的工具都行。ZIP 里那个 `frames.txt` 就是为这个准备的：拆动图会把时间信息丢掉，因为 PNG 没有地方记自己停留了多久，所以由这份清单把每帧的延时和位置一起带出来。

### 帧可以存成哪些格式？

PNG，而且是有意只给 PNG。GIF 的一帧最多 256 色、一位透明，PNG 能原样无损地存下来；换成 JPEG 就会把透明丢掉，凭空造出这一帧本来没有的颜色，而且对平涂画面来说通常还会更*大*。要是你确实需要 JPEG，事后用[图片尺寸调整](https://abox.tools/zh/resize-image/)转一遍。

### 能读的帧数有上限吗？

本工具为源图缓冲区、保留的局部图、预览和输出使用512 MiB规划估算，并在已解码像素超过128 Mi之前停止。小的局部图不会减少完整源图的缓冲区。无法安全分配的方案会在绘制前被拒绝；部分结果也只有在缓冲区方案符合预算时才可使用。精灵图和累积的PNG同样计入。浏览器内部的分配、JS对象及canvas限制可能需要更多内存或更早拒绝，因此这不是可用内存的测量或避免耗尽内存的保证。

### 坏掉的 GIF 打得开吗？

通常可以。从截断或缺少结束标记的文件中保留完整帧。部分帧的缺失区域会使用调色板第一种颜色，除非它是透明色；页面会提醒这种处理。没有可读帧的文件及不安全的缓冲区方案会被拒绝。

### 它免费吗，需要注册吗？

免费，没有账号，不用登录，也没有试用期。帧上同样没有水印。本站带广告，经费就是从那儿来的，广告拿不到任何关于你文件的信息。

### 断网能用吗？

能。页面加载一次之后断开网络，它照样干活。这也是证明“什么都没上传”最省事的办法，真要把你的动图送出去处理，拔线那一刻就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **读 GIF 的就是仓库里的两个文件。** 浏览器会放 GIF，却不会把它的零件交给你，所以格式是在这里自己读的：`src/shared/gif-decode.js` 是容器和 LZW 解压，`src/shared/gif-compose.js` 是处置规则，决定前面几帧垫在下面之后，这一帧看起来是什么样。打开文件不需要去取任何东西，第一次用也不会下载什么引擎。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google。关于你动图的信息，一条也没有交给它们，文件、某一帧、名字、尺寸、帧数都没有。读取、解压、绘制、写出图片的每一行代码都由这个源提供，也都摆在仓库里。
- **捐助按钮加载了什么，又拿不到什么。** 页首那个“Buy me a coffee”按钮由 cdnjs.buymeacoffee.com 的脚本画出来，字体取自 Google Fonts。它不过是个链接，不上报访问，也拿不到关于你或你文件的任何东西。不点它就什么都不会发生，点下去到的是别人的站。
- **断网也照样能用。** 断开网络，这个页面上每一部分都照常工作。这是最省事的一条证明，真要把你的动图送出去拆，拔线那一刻就停了。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，`src/shared/gif-decode.js` 是负责解压出每一帧的读取器，`src/shared/gif-compose.js` 是把它们一层层叠起来的规则。两者里都没有一行能碰到网络的代码。
