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

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

powershell -ExecutionPolicy Bypass -File serve.ps1

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

GIF 分析 — 一个 GIF 里到底装了什么

帧、延时、调色板,以及每个字节的去向。

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

文件由你自己的浏览器打开并拆解:读块结构、解 LZW、以及这个页面上画出的每一帧,都发生在这台机器上。就算这里有什么东西想把文件送走,页面的另一端也根本没有服务器可以接。

实时检查: 检查中…

离线: 检查中…

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

选一个 GIF

以 Markdown 查看

GIF 分析的步骤

  1. 选一个 GIF。拖到选择框里,或者自己找出来。浏览器直接从磁盘上读,这期间没有任何东西发往别处。
  2. 先看概览。画布尺寸、帧数、动画声称自己有多长,以及它实际播多久。最后这两项对不上的次数比多数人想的要多,原因在下一节。
  3. 看看有什么显眼的。那里的每一行都是从你的文件上量出来的:没有哪个浏览器会照办的延时、缺失的循环块、没人引用的颜色表、比某些帧还大的元数据。没有一条是在猜你本来想做什么。
  4. 看字节去了哪里。文件的每个字节都恰好落在某一行里,各行加起来正好是这个文件。要是大部分不在“压缩像素”里,表格的其余部分会告诉你它在哪儿。
  5. 逐帧看下去。每一帧都会显示自己的延时、矩形、处置方式和大小。在“每帧之后的画布”和“每帧实际存下的内容”之间切换,后者才能看出文件有没有优化:做得好的 GIF 存的是很小的矩形,做得糟的每次都把整幅画面存一遍。
  6. 需要的话把报告带走。整份分析的纯文本,可以贴进消息里,也可以和文件放在一起留着。它是在页面里、用你屏幕上已有的内容拼出来的。

说得更细的版本

一个 GIF 里到底装着什么 帧、延时、处置方式和调色板都讲清楚:浏览器为什么不认最短的延时,以及怎么查出一个 GIF 的体积究竟花在了哪里。

常见问题

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

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

为什么我的 GIF 播得比延时写的还慢?

因为所有浏览器都拒绝照办小于百分之二秒的延时,改成把那一帧停十分之一秒。这条规则 1996 年写进了 Netscape,是为当年那些转动的地球和“施工中”标牌准备的,此后被抄进了每一个浏览器,从来没人删掉。

所以一个每帧都写着 0.01 秒的 GIF 并不会以每秒 100 帧播放,而是每秒 10 帧,比做它的软件所设想的慢五到十倍。这个页面把两个数字都摆出来,文件写的和它实际会做的,并标出受影响的帧。要修,就在做这个文件的软件里把 0.01 写成 0.02。

“处置方式”是什么意思?

一帧的时间到了之后,屏幕上要留下什么。动画看起来正常还是拖影,就由这个字段决定。

原样留下意思是下一帧直接盖在这一帧上,帧本身不透明、彼此互相遮住时就该这么做。清回背景会先把这一帧的矩形擦干净,透明就需要它:不擦的话,下一帧透出来的部分会露出上一帧。还原底下原有的内容把这一帧画之前那儿的东西放回去,静止背景上一个小物体在动,就是这么存的。至于未指定,意思是文件没说,而所有查看器都按“原样留下”处理。

我的 GIF 为什么这么大?

“字节去了哪里”那张表针对你这个具体文件回答,而不是泛泛而谈,可能的答案就那么几种。

要是几乎全在压缩像素里,那这个文件就是画面本身太多:GIF 把每一帧都当作完整像素来存,没有运动补偿,也没有画质旋钮,所以体积大约就是面积乘帧数。减少帧数、缩小尺寸、减少颜色,就这三个把手。

要是一大块在颜色表里,说明文件在给每一帧各写一份调色板,每份 768 字节。要是一大块在元数据里,那是某个编辑软件留下了 XMP 数据包,不动画面就能删掉。要是所有帧都覆盖整个画布,说明编码器压根没算过究竟哪一部分变了,而对拍摄或录制来的内容来说,那就是文件的绝大部分。

两种帧视图有什么区别?

每帧之后的画布是查看器在那一刻显示的东西:这一帧画在前面几帧留下的内容之上。每帧实际存下的内容是文件为这一帧真正保存的那个矩形,单独摆出来,底下什么都不垫。

有意思的是后者。GIF 允许一帧只存画面里变了的那部分,所以一个几乎不动的窗口的录屏可以很小。要是你文件里每一帧都是整块画布,那说明没人做过这件事,而且光看动画是看不出来的,只有看存下来的内容才知道。

它说我的文件里有注释或 XMP。那是什么?

随画面一起走、但任何查看器都不会画出来的文字。注释块通常是写出这个文件的软件名。XMP 数据包是图像编辑软件用来记录自己做了什么的 XML,里面可能有编辑历史、软件版本,有时还有作者名字。

这个页面把两者都完整打印出来,因为关于元数据,值得关心的是它写了什么,而不是它存在。这些只给你看,不给别人:这个仓库里没有任何东西会把其中内容念给谁听。

坏掉的 GIF 打得开吗?

会试,并且会告诉你它在哪儿放弃了。文件在某个块中间断掉、该出现块标记的位置换成了别的字节、某一帧的压缩数据提前用完,这些情况它照样会把那之前能读出来的全部显示出来,并把问题写在最上面。分析器最派得上用场的恰好就是这种时候,为了一个坏字节把整个文件丢掉,才是错的。

它会改动我的文件吗?

不会。这个工具只读。没有输出文件,没有重新编码,这里也没有哪个按钮会写出一个 GIF,你唯一能下载的是一份纯文本的分析结果。你的原件在磁盘上原封不动,这也是“关掉标签页会怎样”的老实答案。

它免费吗,需要注册吗?

免费,无需账户、登录或试用期。读取文件仍取决于设备的内存。解码像素达到 3 亿个,或本页拥有的缓冲区估计达到 512 MiB 时,绘制会停止;这不是浏览器总内存的限制。停止或取消绘制后,仍可查看头部、字节统计和时间信息。未绘制帧按头部描述,完整的像素使用总量和浏览器原生动画预览不可用。初始解析以及原生内存和画布操作无法在一次调用中途停止。网站含有广告,但广告不会收到任何文件信息。

断网能用吗?

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