๐ŸŽฌ

Make a GIF from images

Turn a set of PNG, JPEG or WebP images into an animated GIF โ€” choose the order, the speed and the loop. Free, offline, no upload.

Updated 2026-10-26T00:00:00.000Z

You have a few images โ€” screenshots, drawings, frames exported from a video or a design tool โ€” and want one animated GIF. GIFmeta turns them into a GIF in a few clicks or one command, on your own computer.

Before you start: all images must have the same width and height (for example 800 ร— 600). PNG, JPEG and WebP all work, and you can mix them.

With the desktop app

  1. Open GIFmeta and click ๐ŸŽฌ New from images โ€” or simply drop the image files onto the window.
  2. The images appear in the frame list in the order you picked them. Drag the โ ฟ handle (or press Alt + โ†‘/โ†“) to put them in the right order.
  3. Set the speed: each frame shows for 10 cs (100 ms) by default. Change one frame in the viewer, or all frames at once under โš™๏ธ Settings โ†’ Delay for all frames.
  4. Press โ–ถ Play to preview the animation.
  5. Under Settings โ†’ Loop, keep Loop forever or choose how many times it plays.
  6. Click ๐Ÿ’พ Create GIF, pick a file name, and click again to save. The new GIF opens right away so you can keep editing it โ€” insert more frames, duplicate one, or fine-tune timing.

With the command line

gifmeta create frame1.png frame2.png frame3.jpg -o animation.gif

The images become frames in the order you list them. Useful options:

# 200 ms per frame, but show the last frame for 2 seconds
gifmeta create intro.png step-*.png outro.png -o tutorial.gif --delay 20 --delays 5=200

# play three times instead of forever
gifmeta create a.png b.png -o once-more.gif --loop-count 3

Delays are in centiseconds (1 cs = 10 ms), so --delay 20 means 200 ms per frame.

Good to know

  • Colours: a GIF frame can hold 256 colours. Images with โ‰ค 256 colours are stored exactly; photos and gradients are colour-reduced per frame (GIFmeta tells you which frames).
  • Transparency: fully transparent pixels stay transparent, and each frame shows only its own image โ€” nothing from the previous frame shines through. Semi-transparent pixels are drawn opaque, because GIF has no partial transparency.
  • Different sizes? Resize the images to the same size first. GIFmeta tells you exactly which files differ.

In Rust

use gifmeta::{create_gif, CreateOptions};

create_gif(&["a.png".into(), "b.png".into()], CreateOptions {
    output: Some("out.gif".into()),
    delay: Some(20),
    ..Default::default()
})?;