GIF 倒放

GIF 反向播放/无损

411 次访问
GIF REVERSE

GIF 倒放

GIF 动图反向播放

FFmpeg 命令行(推荐)

视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:

# 用 FFmpeg 倒放 ffmpeg -i input.gif -vf reverse output.gif # 用 gifsicle(精确控制) gifsicle --resize 50%% -O3 --merge --delay-image=10 input.gif -o output.gif # 正反循环(瀑布效果) ffmpeg -i input.gif -filter_complex "[0]reverse[r];[0][r]concat,palettegen" palette.png ffmpeg -i input.gif -i palette.png -filter_complex "[0]reverse[r];[0][r]concat[v];[v][1:v]paletteuse" output.gif

桌面 FFmpeg 安装

macOS

brew install ffmpeg

用 Homebrew,5 秒安装

Linux

sudo apt install ffmpeg # 或 sudo dnf install ffmpeg

Debian/Ubuntu/Fedora

Windows

下载 Gyan FFmpeg builds

解压后将 bin 目录加入 PATH

Docker

docker run --rm -v $PWD:/work \ jrottenberg/ffmpeg -i input.mp4 ...

无需本地安装

操作步骤

步骤 1:安装 FFmpeg

按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。

步骤 2:复制本页面提供的命令

input.mp4 改为你的实际视频文件路径。

步骤 3:在视频所在目录运行

用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。

步骤 4:等待处理完成

短视频几秒,长视频几分钟。输出文件出现在同目录。

提示

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🎬

鬼畜素材制作

B站鬼畜区UP主需要将一段正常动作的GIF倒放,制造出“反重力”“时间回溯”的喜剧效果。传统方法需要逐帧拆解再反向拼接,耗时且画质损失大。本工具一键无损倒放,保留原始帧率与色彩,让鬼畜素材的创作效率提升5倍以上。

🎓

运动力学分析

体育教练或物理教师分析运动员的起跳动作时,倒放GIF能清晰展示落地瞬间的肢体角度与重心变化。本工具无损倒放后,帧序列保持原样,便于逐帧对比正反向动作差异,辅助纠正技术细节,比视频倒放更轻量、更直观。

📱

社交媒体反转梗

微博/抖音用户看到一段“液体倒流”“烟雾回收”的趣味GIF,想自己制作同款反转效果。本工具无需下载软件,浏览器上传即可生成,支持微信/QQ直接分享。倒放后的GIF保持原尺寸与文件大小,方便在朋友圈快速传播。

🎮

游戏Bug复现

游戏测试员录制了一段角色卡进墙里的GIF,但需要倒放来展示“从墙里弹出来”的异常过程。本工具无损处理,不压缩画质,倒放后帧序列完全反转,便于在Bug报告中清晰标注异常帧位置,比录屏软件自带的倒放功能更精准。

🔬

科学现象演示

科普博主制作“水珠逆重力上升”“火焰向内收缩”等反常识GIF,用于解释表面张力或燃烧原理。本工具支持高帧率GIF的无损倒放,保留原始颜色深度,避免多次转换导致的色阶断层,让科学演示的视觉说服力更强。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (ezgif.com)传统方法 (Photoshop / 手动)
数据隐私纯浏览器处理,文件不离开本地上传到服务器处理文件完全在本地,但依赖操作者设备
处理速度1-3 秒5-15 秒(含上传下载时间)1-5 分钟(含导入导出及手动操作)
离线可用支持(WASM 本地运算)不支持,必须联网支持(需安装软件)
文件大小限制受浏览器内存限制(通常 < 50 MB)通常限制 100 MB 或 200 帧无限制(取决于设备性能)
操作复杂度一步完成,上传后自动倒放需上传 → 选择功能 → 下载需导入帧 → 反向排列 → 导出
收费免费免费(有高级付费版去水印)付费(Photoshop 订阅制)
平台依赖任何现代浏览器任何现代浏览器需安装 Photoshop(仅桌面端)

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
https://example.com/animation.gif倒放后的 GIF 文件(下载链接)典型场景:用户上传一个网络 GIF 链接
本地文件(小于 10MB 的 GIF)倒放后的 GIF 文件(下载链接)典型场景:用户从本地上传 GIF 文件
本地文件(大于 50MB 的 GIF)处理超时或内存不足提示边界 case:超大文件导致浏览器端处理失败
本地文件(帧数超过 500 帧的 GIF)倒放后的 GIF 文件(帧顺序反转)边界 case:高帧数 GIF 验证倒放逻辑正确性
本地文件(单帧静态 GIF)原文件(无变化)边界 case:单帧 GIF 倒放前后无差异
非 GIF 格式(如 .png 或 .mp4)格式不支持提示易错 case:用户误传非 GIF 格式文件
本地文件(包含透明背景的 GIF)倒放后的 GIF 文件(透明背景保留)典型场景:验证无损倒放保留透明度

常见错误对照7 个常踩的坑 · 错误 → 修复

1. 上传非 GIF 格式文件

错误
上传一个 .mp4 或 .webp 文件到工具
修复
上传扩展名为 .gif 的 GIF 文件

工具仅处理 GIF 格式;FFmpeg 虽能读取其他格式,但本工具设计为纯 GIF 倒放,非 GIF 输入会触发解码失败或输出异常

2. GIF 帧数过多导致浏览器崩溃

错误
上传一个 500 帧、每帧 1920×1080 的大 GIF
修复
使用帧数 ≤ 200、分辨率 ≤ 800×600 的 GIF

WASM 版 FFmpeg 在浏览器内解码,帧数和分辨率过高会耗尽内存(Chrome 单 Tab 通常 2GB 限制),导致页面无响应或崩溃

3. 期望倒放后保持原文件大小

错误
原 GIF 1.2MB,倒放后得到 3.8MB 就认为工具出错
修复
理解倒放后文件大小可能变化,尤其是原 GIF 有优化(如 LZW 压缩方向性)时

GIF 压缩算法(LZW)对重复模式敏感;倒放后帧间差异模式改变,压缩率可能降低,文件变大属正常现象

4. 认为倒放能修复损坏的 GIF

错误
上传一个显示不全或有色块的损坏 GIF 文件
修复
先使用 GIF 修复工具修复损坏文件,再上传倒放

FFmpeg 解码损坏 GIF 时会丢弃异常帧或输出空白帧,倒放结果同样损坏;工具不包含修复逻辑

5. 混淆“倒放”与“镜像翻转”

错误
期望工具把 GIF 左右镜像(水平翻转)
修复
确认工具功能为时间轴反向播放,如需镜像请使用其他视频/图像翻转工具

倒放(reverse)是时间域操作,镜像(flip/mirror)是空间域操作;两者完全不同,工具名已明确说明

6. 上传透明背景 GIF 后丢失透明度

错误
上传带透明区域的 GIF,倒放后背景变黑或变白
修复
确认原 GIF 使用索引色透明(GIF 规范支持),倒放后透明度应保留;若丢失则检查原图是否用了非标准透明

GIF 透明度基于单色索引(通常索引 0);FFmpeg 倒放时若调色板处理不当会丢失透明色,建议使用标准工具生成的原图

7. 把倒放结果当作原始素材直接编辑

错误
下载倒放 GIF 后直接导入 Photoshop 继续编辑,发现帧顺序混乱
修复
将倒放 GIF 视为最终产物,如需编辑应保留原始 GIF 并重新倒放

倒放后的 GIF 帧顺序已反向,再次编辑时帧编号与时间轴对应关系改变,容易混淆

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

GIF 倒放:将帧序列 F[0], F[1], ..., F[N-1] 重新排列为 F[N-1], F[N-2], ..., F[0]

变量说明

  • F[i] — 原始 GIF 的第 i 帧图像数据
  • N — GIF 的总帧数

示例

一个 3 帧 GIF,帧顺序为 A→B→C。倒放后帧顺序变为 C→B→A。若原 GIF 播放时长为 1.5 秒(每帧 0.5 秒),倒放后时长不变,仍为 1.5 秒,但动作反向。

适用范围

适用于所有标准 GIF 格式(帧延迟固定或可变)。不支持跨帧混合(如透明度叠加)的 GIF,此类 GIF 倒放后视觉可能异常。

原理图

上传 GIF原始帧序列FFmpeg 帧提取解码为独立帧帧序反转末帧→首帧输出 GIF倒放结果关键说明• 所有处理在浏览器本地完成(WASM/FFmpeg),不上传服务器• 帧序反转后重新编码为 GIF,保持原始帧率与尺寸• 支持常见 GIF 格式,输出无损倒放
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

from PIL import Image, ImageSequence
import io

# 读取 GIF,提取每一帧
with Image.open("input.gif") as img:
    frames = [frame.copy() for frame in ImageSequence.Iterator(img)]

# 反转帧顺序
frames.reverse()

# 保存为倒放 GIF(保留原帧延迟)
# 使用第一帧作为基础,追加其余帧
duration = img.info.get("duration", 100)  # 默认 100ms
frames[0].save(
    "output.gif",
    save_all=True,
    append_images=frames[1:],
    duration=duration,
    loop=0,
    disposal=img.info.get("disposal", 2)
)
print("已生成 output.gif")
package main

import (
	"image/gif"
	"os"
)

func main() {
	// 读取原始 GIF
	f, _ := os.Open("input.gif")
	defer f.Close()
	g, _ := gif.DecodeAll(f)

	// 反转帧序列
	for i, j := 0, len(g.Image)-1; i < j; i, j = i+1, j-1 {
		g.Image[i], g.Image[j] = g.Image[j], g.Image[i]
		g.Delay[i], g.Delay[j] = g.Delay[j], g.Delay[i]
	}

	// 写入倒放结果
	out, _ := os.Create("output.gif")
	defer out.Close()
	gif.EncodeAll(out, g)
}
const fs = require('fs');
const { GifReader, GifWriter } = require('omggif');

// 读取原始 GIF 文件
const buf = fs.readFileSync('input.gif');
const reader = new GifReader(buf);

// 提取所有帧数据(RGBA 像素)
const frames = [];
for (let i = 0; i < reader.numFrames(); i++) {
    const pixels = new Uint8Array(reader.width * reader.height * 4);
    reader.decodeAndBlitFrameRGBA(i, pixels);
    frames.push({
        pixels,
        delay: reader.frameInfo(i).delay * 10 // omggif 延迟单位是 10ms
    });
}

// 反转帧顺序
frames.reverse();

// 写入倒放 GIF
const writer = new GifWriter(Buffer.alloc(reader.width * reader.height * 4 * frames.length + 1000), reader.width, reader.height, { loop: 0 });
frames.forEach((f, idx) => {
    writer.addFrame(0, 0, reader.width, reader.height, f.pixels, { delay: f.delay / 10 });
});
fs.writeFileSync('output.gif', Buffer.from(writer.buffer.slice(0, writer.end())));
console.log('已生成 output.gif');

常见问题

7 个高频疑问

GIF 倒放后,画面速度会变慢或变快吗?
不会。倒放只是把帧顺序反转,每帧的播放时长(delay)保持不变,所以总时长和原始 GIF 一致。如果感觉速度变了,通常是原始 GIF 本身帧间隔不均匀(比如某些帧显示 10ms、某些 100ms),倒放后节奏会镜像反转,看起来像“变速”其实是原始节奏的逆序。可以用工具预览对比原始和倒放版的帧时间轴。
为什么我上传的 GIF 倒放后画面卡顿、掉帧了?
卡顿通常由两个原因造成:一是原始 GIF 的帧数过多(超过 200 帧),浏览器或 FFmpeg 处理时内存不足导致丢帧;二是原始 GIF 的帧间隔极小(如所有帧都是 10ms),倒放后仍维持高帧率,部分播放器渲染跟不上。建议先用工具把原始 GIF 的帧数压缩到 100 帧以内再倒放,或降低原始 GIF 的尺寸(宽度控制在 500px 以内)。
GIF 倒放和视频倒放有什么区别?为什么不用视频工具做?
GIF 是逐帧索引色(最多 256 色),视频是逐帧真彩色+压缩编码。视频倒放(如 PR、Final Cut)处理的是连续帧流,输出也是视频;GIF 倒放要保留调色板(颜色表)和透明通道,直接反转帧序即可,无需重新编码颜色。如果用视频工具把 GIF 转成视频再倒放再转回 GIF,会经历两次有损压缩,画质和颜色都会劣化。本工具直接用 FFmpeg 在 GIF 层操作,不经过视频中间格式,保持原始颜色和透明度。
倒放后的 GIF 文件比原文件大很多,正常吗?
正常。原因是 GIF 的帧间压缩(LZW 算法)依赖相邻帧的相似性——原 GIF 的帧间差异通常较小,压缩率高;倒放后帧序反转,原本连续的渐变变成了突变,LZW 找不到重复模式,压缩率下降,文件体积可能增大 1.5-3 倍。如果体积过大影响使用,可以在倒放后手动减少帧数(删除间隔帧)或降低颜色数(256 色降到 128 色),体积能减少 40%-60%。
支持倒放超过 10MB 的大 GIF 吗?上传后没反应怎么办?
本工具基于浏览器端 FFmpeg(WASM)处理,最大受浏览器内存限制。10MB 以内通常流畅;超过 10MB 或帧数 > 300 帧时,浏览器可能崩溃或长时间无响应。如果上传后没反应,可以:1)先压缩 GIF(用本站的 GIF 压缩工具)到 5MB 以内再倒放;2)换用 Chrome 或 Edge 浏览器(Firefox 对 WASM 内存限制更严);3)如果文件大于 50MB,建议用本地 FFmpeg 命令处理:`ffmpeg -i input.gif -vf reverse output.gif`。
倒放后 GIF 的透明背景变成黑色了,怎么解决?
部分 GIF 用索引色中的某个颜色标记透明,但 FFmpeg 默认处理时可能丢失透明通道信息。遇到这种情况,可以:1)在倒放前确认原始 GIF 的透明色索引值(通常为 0 或 255),倒放后手动用图片编辑软件(如 Photoshop、GIMP)将黑色区域设为透明;2)如果原始 GIF 是用“全局调色板+透明索引”方式存储的,本工具会保留透明,但如果是“局部调色板+透明标记”的复杂格式,建议先转成 PNG 序列再合成倒放 GIF。
手机浏览器上能用这个工具倒放 GIF 吗?
可以,但有限制。移动端 Chrome/Safari 都支持 WASM,但内存通常只有桌面端的 1/4-1/2,建议上传 5MB 以内、帧数 < 150 帧的 GIF。如果手机 Safari 提示“此页面使用了过多内存”,可以尝试:1)在“设置 - Safari - 高级 - JavaScript”中关闭“阻止跨域跟踪”;2)用桌面浏览器处理大文件后再传到手机。另外,iOS 相册导出的 GIF 有时带有异常帧头数据,建议先用其他工具转成标准 GIF 再处理。
选择 打开 +新窗口 esc关闭