Skip to content
MagickCmd › ImageMagick GIF 动图命令

ImageMagick GIF 动图命令

用帧序列合成 GIF、正确缩放而不破坏动画、压小过大的 GIF、拆成逐帧图片。并解释为什么 -coalesce 是必须的。

用帧序列合成 GIF

magick -delay 8 -loop 0 frame_*.png +dither -colors 128 \
  -layers Optimize output.gif

-delay-loop 必须写在输入帧前面 —— 它们是作用于「之后读入的图片」的设置。放到最后就完全没效果。

  • -delay 8 —— 单位是百分之一秒,所以 8 大约是 12.5 fps。浏览器会把小于 2 的值统一按 10 fps 左右处理,再小没有意义。
  • -loop 0 —— 无限循环。填其他数字就循环那么多次。

帧号要补零。 通配符按文本排序,frame_10.png 会排在 frame_2.png 前面,动画顺序就乱了。命名成 frame_0002.png

缩放 GIF 动图

magick input.gif -coalesce -resize 320x -layers Optimize output.gif

-coalesce 不是可选项。优化过的 GIF 并不保存完整帧 —— 第一帧之后,大部分帧只是相对上一帧变化的那块矩形。直接缩放这些碎片,缩的是碎片本身,动画会变成一团乱码。-coalesce 先把每帧还原成完整图像,末尾的 -layers Optimize 再把体积优化加回去。

压小体积过大的 GIF

magick input.gif +dither -colors 64 -layers Optimize output.gif

两个杠杆起主要作用:

  • 颜色数量。 256 → 128 → 64,调色板成倍缩小。录 UI 这类平坦画面降到 64 色毫无压力,照片类内容就不行。
  • -layers Optimize 只保存每帧变化的那块矩形。对背景不动的录屏,光这一步经常就能砍掉一半。

+dither 关闭抖动。录屏和 UI 演示保持关闭;照片类内容打开,否则会出现色带。

抽帧

如果还是太大,去掉每隔一帧并把延迟加倍:

magick input.gif -coalesce -delete '1--1/2' -set delay 16 \
  -layers Optimize output.gif

把 GIF 拆成逐帧图片

magick input.gif -coalesce frame_%03d.png

不加 -coalesce 的话,导出的是存储的差异帧,而不是动画实际看到的画面。

查看 GIF 信息

magick identify -format '%n frames, %wx%h\n' input.gif

如果你的源是视频

ImageMagick 并不合适。它底层还是调 ffmpeg,而且调色板选得很差。直接用 ffmpeg 的两遍调色板滤镜:

ffmpeg -i input.mp4 -vf "fps=12,scale=480:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i input.mp4 -i palette.png -lavfi "fps=12,scale=480:-1:flags=lanczos,paletteuse" output.gif

相关页面

Copied