选一个 GIF
浏览器自带的解码器,按文件原样播放。
- 版本
- —
- 画布
- —
- 文件大小
- —
- 帧数
- —
- 文件写的时长
- —
- 实际播的时长
- —
- 循环
- —
- 用到的颜色
- —
显眼的地方
下面每一条都是从这个文件上量出来的,没有一条是在猜你本来想做什么。
字节去了哪里
文件的每个字节都恰好落在某一行里,各行加起来正好是这个文件。要是加不上,最后一行会明说,而不是让那根条子悄悄拉长凑数。
和下面表格里同样的数字,画成一根条子。
| 部分 | 字节 | 占比 |
|---|---|---|
| 整个文件 | — | 100% |
颜色
全局颜色表
每帧各自的颜色表
里面还有些什么
不带画面的块。查看器全都跳过,而文件的每一份副本还是照样把它们带着。
# GIF 分析 — 一个 GIF 里到底装了什么 帧、延时、调色板,以及每个字节的去向。 > 在浏览器里把 GIF 拆开看:每一帧的延时和处置方式、颜色表、循环次数,以及体积去了哪里的逐字节明细。什么都不上传。 这是一个浏览器交互工具,地址是 https://abox.tools/zh/gif-analyzer/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明;使用工具请打开该地址。 ## 你的 GIF **在浏览器里处理**,无须上传处理。 文件由你自己的浏览器打开并拆解:读块结构、解 LZW、以及这个页面上画出的每一帧,都发生在这台机器上。就算这里有什么东西想把文件送走,页面的另一端也根本没有服务器可以接。 - ✗ 不上传 - ✗ 不注册 - ✓ 断网可用 - ✓ 开源 - ✓ 文件不出这台机器 ## GIF 分析的步骤 1. **选一个 GIF。** 拖到选择框里,或者自己找出来。浏览器直接从磁盘上读,这期间没有任何东西发往别处。 2. **先看概览。** 画布尺寸、帧数、动画声称自己有多长,以及它实际播多久。最后这两项对不上的次数比多数人想的要多,原因在下一节。 3. **看看有什么显眼的。** 那里的每一行都是从你的文件上量出来的:没有哪个浏览器会照办的延时、缺失的循环块、没人引用的颜色表、比某些帧还大的元数据。没有一条是在猜你本来想做什么。 4. **看字节去了哪里。** 文件的每个字节都恰好落在某一行里,各行加起来正好是这个文件。要是大部分不在“压缩像素”里,表格的其余部分会告诉你它在哪儿。 5. **逐帧看下去。** 每一帧都会显示自己的延时、矩形、处置方式和大小。在“每帧之后的画布”和“每帧实际存下的内容”之间切换,后者才能看出文件有没有优化:做得好的 GIF 存的是很小的矩形,做得糟的每次都把整幅画面存一遍。 6. **需要的话把报告带走。** 整份分析的纯文本,可以贴进消息里,也可以和文件放在一起留着。它是在页面里、用你屏幕上已有的内容拼出来的。 ## 说得更细的版本 [一个 GIF 里到底装着什么](https://abox.tools/zh/guides/whats-inside-a-gif/): 帧、延时、处置方式和调色板都讲清楚:浏览器为什么不认最短的延时,以及怎么查出一个 GIF 的体积究竟花在了哪里。 ## 工具箱里还有 - [视频压缩](https://abox.tools/zh/compress-video/): 说一个它最多能有多大。剩下的工具来算,做完先量一遍再交给你。 - [MP4 转换](https://abox.tools/zh/convert-to-mp4/): 不管从录屏、压制还是相机里出来的是什么,都变成 MP4 里的 H.264 和 AAC。能复制的原样复制,非改不可的才重新编码。 - [视频旋转](https://abox.tools/zh/rotate-video/): 转四分之一圈、半圈,或者往另一边转。使用文件头旋转时,每一帧画面保持原样。 - [图片转视频](https://abox.tools/zh/images-to-video/): 一个文件夹的图片,变成一段视频。 ## 常见问题 ### 我的 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 送出去分析,拔线那一刻就停了。 ## 这条隐私承诺怎么核实 - **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果,处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地,但已允许的主机仍可接收请求。策略不检查载荷,不能单独证明什么都没有发出。请把具体操作的请求与源码核对,或断网完成该本地操作。 - **读取器就是仓库里的四个文件。** 这里没有用浏览器自带的 GIF 解码器去弄清文件里有什么,因为那个解码器不会告诉你某个字节去了哪儿。所以格式是手写代码一步步读出来的:`src/gif.js` 走完所有块,`src/lzw.js` 展开像素,`src/frames.js` 把它们叠起来,`src/budget.js` 再把各部分加回去,核对是否正好等于文件大小。 - **注释和元数据只给你看,不给别人。** GIF 里可能带着注释块、描述某次编辑的 XMP 数据包,或者颜色配置文件,这个页面会把它们全都打印出来。它们只出现在你眼前的屏幕上,别处哪儿都不去:这个仓库里没有任何一个统计事件会捎带这些内容。 可选反馈只报告工具标识、固定的回答和原因,不报告从文件读出的元数据。 - **Google 加载了什么,又拿不到什么。** 广告脚本和统计脚本来自 Google。关于你文件的信息,一条也没有交给它们,文件、缩略图、名字、大小、帧数、注释都没有。读取、解压、绘制 GIF 的每一行代码都由这个源提供,也都摆在仓库里。 - **捐助按钮加载了什么,又拿不到什么。** 页首那个“Buy me a coffee”按钮由 cdnjs.buymeacoffee.com 的脚本画出来,字体取自 Google Fonts。它不过是个链接,不上报访问,也拿不到关于你或你文件的任何东西。不点它就什么都不会发生,点下去到的是别人的站。 - **断网也照样能用。** 断开网络,这个页面上每一部分都照常工作。这是最省事的一条证明,真要把你的 GIF 送出去分析,拔线那一刻就停了。 **你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的,构建脚本你能读,也能自己跑一遍,跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容,跟你自己从源码构建出来的结果对一遍就知道了: https://github.com/A-Box-of-Tools/website 最值得先读的几个文件:`config/site.toml` 里是 Content-Security-Policy,`src/gif.js` 是逐块走完整个文件的读取器,`src/lzw.js` 是解压器,`src/budget.js` 负责字节记账。它们里面都没有一行能碰到网络的代码。
GIF 分析的步骤
- 选一个 GIF。拖到选择框里,或者自己找出来。浏览器直接从磁盘上读,这期间没有任何东西发往别处。
- 先看概览。画布尺寸、帧数、动画声称自己有多长,以及它实际播多久。最后这两项对不上的次数比多数人想的要多,原因在下一节。
- 看看有什么显眼的。那里的每一行都是从你的文件上量出来的:没有哪个浏览器会照办的延时、缺失的循环块、没人引用的颜色表、比某些帧还大的元数据。没有一条是在猜你本来想做什么。
- 看字节去了哪里。文件的每个字节都恰好落在某一行里,各行加起来正好是这个文件。要是大部分不在“压缩像素”里,表格的其余部分会告诉你它在哪儿。
- 逐帧看下去。每一帧都会显示自己的延时、矩形、处置方式和大小。在“每帧之后的画布”和“每帧实际存下的内容”之间切换,后者才能看出文件有没有优化:做得好的 GIF 存的是很小的矩形,做得糟的每次都把整幅画面存一遍。
- 需要的话把报告带走。整份分析的纯文本,可以贴进消息里,也可以和文件放在一起留着。它是在页面里、用你屏幕上已有的内容拼出来的。
说得更细的版本
一个 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 送出去分析,拔线那一刻就停了。