在浏览器里,把视频或一堆图片变成 GIF
从视频里抽帧,或把一组图片排成序列,编辑时间轴,再用全局调色板和帧间压缩导出 GIF——全部在浏览器里完成。
拖入一段视频或一组图片
MP4、WebM、MOV、MKV、AVI,或 PNG、JPG、WebP、AVIF、GIF、BMP 和 HEIC 图片。
拖入文件不会启动任何处理:设置由你选,按钮由你按。
怎么用
把文件丢进来
一段视频,或者一堆图片。什么都不会上传,也不会自己跑起来。
选好范围
定好入点、出点和帧率再抽帧——或者一帧一帧手动挑。
编辑时间轴
删帧、倒序、让某一帧多停一会儿,再调颜色和抖动。
编码并核对
在预览上按住 Alt,把 GIF 和原图比一比,然后下载或直接送去下一个工具。
整段共用一套调色板
颜色是对所有帧一次性做中位切分选出来的,循环播到一半也不会串色。
只写动过的地方
和上一帧相同的像素直接继承,不再重新编码。录屏文件里,这部分几乎就是全部。
消掉色带的抖动
蛇形扫描的 Floyd–Steinberg 误差扩散,强度可调,64 色下渐变也不脏。
可编辑的时间轴
删帧、倒序、做成回文、把某一帧拉长。撤销不花代价:存的是编号,不是位图。
把你的核心都用上
动画被拆给一组 web worker,标签页仍然能操作,进度条数的是真实帧数。
什么都不会离开这个标签页
解码器、调色板和压缩器都是跑在你机器上的 JavaScript。没有上传,也没有从 CDN 拉模型。
和整套工具串起来
把画面上的这一帧直接送去裁剪、压缩或抠图,不用先下载下来。
一个真正的 GIF 编码器,不是画布导出
帧是从已解码的视频里直接读取的,采用高质量缩放,中途绝不经过 JPEG。调色板对整段动画做中位切分得出,像素用蛇形扫描的 Floyd–Steinberg 抖动映射,而一帧与前一帧相同的部分会写成透明并被继承。工作被拆给一组 web worker,所以页面依然跟手,进度条跟的是真实帧数。
适合缺陷复现、演示和反应循环
把一个 bug 录一次,剪到真正关键的那四秒。把设计走查变成能在 pull request 里自动播放的东西。或者排几张截图,手工定好每张停多久。在你按下编码之前,时间轴一直可以改。
不上传,也不下载
每一步都在这个标签页里跑:视频解码用的是浏览器自己的解码器,量化器和 LZW 压缩器是随页面一起送达的 JavaScript,结果是一个从不离开你机器的 Blob。没有可以发文件的服务器,也没有要从 CDN 拉的模型或编解码器。代价说清楚:一切都受限于你的内存,所以 4K 片段得先剪短、缩小才编得动。
常见问题
Q有文件大小限制吗?+
没有写死的限制,但有实实在在的限制:帧就放在这个标签页的内存里。480 像素宽、4 秒、12 fps 的 GIF 大约是 50 MB 的工作数据,几秒钟就能编完;4K 片段则会在编完之前先把标签页耗尽。把范围剪短、把工作尺寸调低——那些控件就是干这个用的。
Q为什么我的 GIF 还是这么大?+
GIF 是 1987 年的格式:256 色,没有运动补偿。先减宽度,再减帧率,最后减调色板。把「复用没有变化的像素」保持开启,通常比这三样加起来还管用:录屏文件的大部分体积会因此消失。
Q为什么帧率不是我选的那个数?+
GIF 把每个延时存成百分之一秒,所以只存在 100/n 形式的帧率。要 12 fps 实际上是每帧 8 个单位,也就是 12.5。面板上显示的是你真正会得到的帧率,而不是你要求的那个。
Q能吃哪些格式?+
浏览器能播的视频都行——MP4/H.264、WebM、MOV,很多时候还有 MKV;图片方面支持 PNG、JPG、WebP、AVIF、GIF、BMP 和 iPhone 的 HEIC。作为图片放进来的 GIF 动图,只会贡献它的第一帧。
Q有东西会被上传吗?+
不会。没有上传步骤,也没有任何外部请求:编码器随页面一起送到,在这个标签页的 web worker 里运行。
Q可以保留透明吗?+
可以,打开「保留透明」开关。GIF 只支持一种完全透明的颜色,所以柔和的边缘会变成硬边。它不能和像素复用同时使用,因为两者需要同一个透明槽位。