GIF 拆帧与 PDF/ICO 输出
GIF 不是单一格式
GIF 输入在 ZenConverter 里有两个独立选项,不是"GIF → PNG"一条路:
| 选项 | 效果 | 输出 |
|---|---|---|
| 转首帧 | 只取 GIF 的第一帧,输出一张静态图 | JPG/PNG/WEBP/ICO/PDF |
| 拆帧 | 把 GIF 拆成每一帧,每帧作为独立文件保存 | JPG/PNG/WEBP/ICO/PDF(每帧一个文件) |
选哪个取决于你为什么要处理这个 GIF。
转首帧
最简单的路径。GIF 解码器把第一帧解码出来,然后按你选的输出格式编码。适合:
- 你只想从一个有动画的 GIF 里取封面/第一张画面;
- 源 GIF 很大(几百帧),拆帧没必要。
走 Android 原生 Bitmap 解码 → 目标输出编码 的管线。
拆帧
拆帧走 FFmpeg 兼容路线(不是 Android Bitmap 路线),因为需要逐帧解码 GIF 动画。流程:
GIF → FFmpeg RGBA raw frame stream → 逐帧编码到目标格式 → 保存到子文件夹
为什么用 FFmpeg 而不是 Bitmap
Android Bitmap 解码 GIF 只会给你第一帧(大多数 Android BitmapFactory 实现不支持 GIF 动画)。拆帧需要 FFmpeg 的 GIF demuxer 逐帧解码。
输出组织
拆帧的输出会保存在一个子文件夹里,命名规则是"源文件名_拆帧输出/",里面每帧一个文件:
源文件.gif → 源文件_拆帧输出/帧_00001.png, 帧_00002.png, ...
如果选 PDF 输出,就是每一帧变成 PDF 的一页,整个拆帧序列合并成一个 PDF(而不是每帧一个 PDF)。
适用场景
- 表情包素材改做贴纸:把 GIF 表情包拆帧,挑几个关键帧导出 PNG 做 sticker;
- 动画帧分析:逐帧看动画过程中的细节;
- 逐帧重编码:比如把一个 24fps GIF 拆帧,去 AI 超分,再合回高分辨率 GIF(ZenConverter 没有反向合回 GIF 的功能,但拆帧后可以导去其他工具做)。
ICO 从 GIF 来
GIF(首帧或拆帧后选某一帧)→ ICO,这条路径是先解码成 raster 图,再按 ICO 多尺寸规则输出。这和从 PNG 转 ICO 的路径是一样的——都是从一个 raster 源生成 PNG-in-ICO 多尺寸容器。
GIF 不保留的东西
| 项目 | 是否保留 | 原因 |
|---|---|---|
| 帧延迟(frame delay) | ❌ | 拆帧输出是独立文件,没有"时序"概念 |
| 循环次数(loop count) | ❌ | 同上 |
| 调色板 | ❌ | 解码成 RGBA 后重新编码,原始 GIF 调色板不保留 |
| 元数据 | ❌ | GIF 容器的元数据不被处理 |
已知边界
- 没有反向合回 GIF 的功能:ZenConverter 可以 GIF → 拆帧,但不能 拆帧 → 合成 GIF。如果你想要反向操作,用 FFmpeg 命令行或桌面端 ScreenToGif;
- 透明 GIF 的 alpha 保留:解码成 RGBA 后 alpha 是完好的,PNG/WEBP 输出保留透明,JPG 输出透明区域自动白底;
- 大 GIF 拆帧耗时:1000 帧 GIF → 1000 个 PNG 文件,解码 + 编码 + IO 都要时间。
和其他图片路线的关系
- GIF 转首帧之后的处理(质量预设、AI 超分)和 PNG/JPG/WEBP 路线完全一致;
- GIF 拆帧时AI 超分不可用——拆帧 + AI 超分的组合会强制关闭(超分管线在拆帧模式下被隐藏)。
- ICO 从 GIF 来走的是 PNG-in-ICO 多尺寸逻辑(见图片格式互转页面)。
相关页面
- 图片格式互转 —— 五种图像输出的通用管线
- Real-ESRGAN 深度学习 4× AI 超分 —— GIF 首帧可以用超分
- 视频转动态 GIF —— ZenConverter 也能从视频生成 GIF(反向的)