πŸ–ΌοΈ

Extract frames from a GIF as PNG

Save one frame or every frame of an animated GIF as PNG images β€” correctly composited, even for frame-optimized GIFs.

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

Need a still from a GIF, or all frames to edit in another program? GIFmeta exports frames as PNG β€” exactly as they look when the GIF plays, including transparency.

Many simple tools just dump the pixels stored in each frame. For a frame-optimized GIF that gives you small patches and transparent holes instead of real frames. GIFmeta renders every frame with the correct disposal, verified pixel-identical to ImageMagick’s -coalesce.

With the command line

# every frame β†’ frames/frame_000.png, frame_001.png, …
gifmeta preview input.gif --all --output-dir frames/

# one frame
gifmeta preview input.gif --frame 12 --output frame12.png

# only the pixels stored in each frame (to inspect optimization)
gifmeta preview input.gif --all --raw --output-dir frames-raw/

All frames are rendered in one fast pass. Edit the PNGs and turn them back into a GIF with gifmeta create:

gifmeta create frames/*.png -o rebuilt.gif --delay 10

In the desktop app

Browse frames in the viewer: ✨ Pretty shows the frame as it plays, 🧩 Raw shows only the pixels it stores.

In Rust

use gifmeta::{FrameRenderer, PreviewMode};

for frame in FrameRenderer::open("input.gif", PreviewMode::Composited)? {
    let frame = frame?; // RenderedFrame { index, delay_cs, image }
    frame.image.save(format!("frame_{:03}.png", frame.index))?;
}