gifski

Highest-quality GIF encoder based on pngquant. Written by Kornel Lesiński (AKA “that ImageOptim guy”)

gifski converts video frames to GIF animations using pngquant's fancy features for efficient cross-frame palettes and temporal dithering. It produces animated GIFs that use thousands of colors per frame.

(it's smooth and colorful)
This is a GIF. It's hugely inefficient like any GIF, but now at least looks fine!

Another example.

It's open-source! It's a CLI tool, but it can also be compiled as a library for seamless use in other apps (ask me or get a commercial license if you want to use it in a closed-source app or web service).

Download GUI

Download macOS app by Sindre Sorhus from the Mac App Store (source code)

Please note the GUI is only for macOS. There is no GUI for Windows. If you double-click gifski.exe, nothing will happen, and that's expected, because the Windows version is for command line only.

Download CLI

For Windows and Debian download the latest CLI version.

You can also get it with cargo install gifski if you have Rust installed.

Usage

The CLI version must be run from a command line (terminal).

gifski --fps 10 --width 320 -o anim.gif video.mp4

The above example converts "video.mp4" file to GIF (replace the path with your video's actual path. Most terminals allow you to drag'n'drop the file!), with max resolution of 320 pixels and 10 frames per second. If you get erros about command not found, use full absolute path to gifski(.exe).

You may need ffmpeg to convert video to PNG frames first. In your favourite command line/terminal, run:

ffmpeg -i video.mp4 frame%04d.png

This command takes a file named "video.mp4" and makes files "frame0001.png", "frame0002.png", "frame0003.png", etc. from it (%04d makes the frame number. Windows may need %%04d). You can usually drag'n'drop files into the terminal window to avoid typing the paths.

and then make the GIF from the frames:

gifski -o file.gif frame*.png

This command makes file "file.gif" from PNG files with names starting with "frame" (* stands for frame numbers). It's equivalent of gifski -o file.gif frame0001.png frame0002.png frame0003.png, etc.

See gifski -h for more options. The conversion might be a bit slow, because it takes a lot of effort to nicely massage these pixels. Also, you should suffer waiting like the poor users who will be downloading these huge files.

Large file sizes

Gifski maximizes quality at cost of file size, so it is expected that the GIF files will be massive. If you need smaller files:

gifski app icon

Follow @kornelski on Twitter.

Other GIF stuff I wrote: lossy GIF encoder and GIF to video converter (which you should really do).

Logo designed by Valera Nazarov.

The example anim is from Cosmos Laundromat (CC) Blender Foundation.