这个页面的代码没跑起来。

直接从文件夹里打开 index.html,浏览器会拦下 JavaScript 模块,于是你选好一个 GIF 之后,页面不会有任何反应。改用 http 把这个文件夹提供出去:

powershell -ExecutionPolicy Bypass -File serve.ps1

然后打开 http://localhost:8080/。

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

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

语言: 简体中文
查看源码
你的 GIF 在浏览器里处理,无须上传处理。

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

实时检查: 检查中…

离线: 检查中…

不用信我们说的。打开开发者工具,盯着“网络”面板,拆一个 GIF 试试。没有哪个请求带上图片、某一帧,或者文件名。嫌麻烦就直接拔掉网线,照样拆。

1 选一个 GIF

2 帧怎么出

每隔多少帧留一帧 不要全部,改成每两帧或每五帧取一帧,适合做一览图或者处理长录像。

时间清单 每一帧停留了多久、放在什么位置。一堆 PNG 摆在文件夹里带不走这些。

帧

3 拆出来的帧

以 Markdown 查看

GIF 拆帧的步骤

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

说得更细的版本

怎么把 GIF 拆成一帧一帧 把动图 GIF 的每一帧存成 PNG:为什么有些帧只是画面里的一小块、透明会怎么样,以及怎么把时间留住,好把它再拼回去。

常见问题

我的 GIF 会被传到哪里去吗?

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

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

因为文件里存的就是那样。GIF 是一张起始画面加上后面一连串补丁:后面每一帧只存变化的那个矩形,屏幕上其余部分是前面几帧留在那儿的。一个人对着不动的墙说话,于是每帧存的是一张脸,而不是一整幅画面,这个格式不至于大得离谱,全靠这一点。

你现在看到这个,是因为选的是“只要这一帧真正存下的像素”。改成“看上去的那一帧”,每张 PNG 就都是动画在那一刻的整幅画面了。

透明保留得住吗?

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

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

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

拆出来的帧还能拼回去吗?

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

帧可以存成哪些格式?

PNG,而且是有意只给 PNG。GIF 的一帧最多 256 色、一位透明,PNG 能原样无损地存下来;换成 JPEG 就会把透明丢掉,凭空造出这一帧本来没有的颜色,而且对平涂画面来说通常还会更大。要是你确实需要 JPEG,事后用图片尺寸调整转一遍。

能读的帧数有上限吗?

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

坏掉的 GIF 打得开吗?

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

它免费吗,需要注册吗?

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

断网能用吗?

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