GIF Frame Extractor
Extract individual frames from animated GIFs as PNG images.

Click or drag and drop to add files

Image Tools

GIF Frame Extractor

Extract individual frames from animated GIFs as PNG images.

GIF Frame Extractor pulls every frame out of an animated GIF and hands them back as PNG images — the card states it plainly: "Extract individual frames from animated GIFs as PNG images." Drop an animated GIF (the dropzone accepts image/gif only), click "Extract Frames", and you get stats for Dimensions, Frames, Loop Count ("Infinite" when 0), and Total Duration (ms).

Each frame appears as a card labeled "Frame {i}" with its delay ("{delay}ms") and size ("{w}×{h}"), plus copy and download controls writing frame-{index}.png. "Download All Frames (PNG)" fires the full set. Parsing uses gifuct-js on the local ArrayBuffer — nothing is uploaded.

How it works

The page runs parseGIF on the file bytes, then decompressFrames(gif, true) so disposal patches are fully expanded. Each frame patch is written into ImageData on a canvas and serialized with toDataURL('image/png').

Loop count is read from gif.lsd.loopCount (rendered as "Infinite" when 0), and Total Duration sums frame delays (defaulting missing delays to 100ms). Download All loops anchor clicks for frame-N.png; per-frame copy writes the data URL (ClipboardItem image copy where available). Failure surfaces "Failed to extract frames" or the copy-specific error toasts.

How to use

  1. Drop an animated GIF (accept image/gif) into the dropzone.
  2. Preview the GIF and confirm its dimensions.
  3. Click "Extract Frames" (label becomes "Extracting..."); "Cancel" aborts an in-flight run.
  4. Read the stats: Dimensions, Frames, Loop Count, and Total Duration (ms).
  5. Browse the frame grid — each "Frame {i}" card shows "{delay}ms" and "{w}×{h}".
  6. Copy a data URL or download individual frame-{i}.png from any card.
  7. Click "Download All Frames (PNG)" for the whole set, or "Start Over" for another GIF; "Remove" clears the upload.

Tips

  • Frames are named frame-{index}.png from a zero-based index — first frame is frame-0.png.
  • The per-frame copy button writes data URL text; clipboard image copy uses ClipboardItem where the browser supports it.
  • GIFs with disposal methods still export full patches thanks to gifuct-js decompressFrames(..., true).
  • Loop Count displays "Infinite" when the NETSCAPE loop value is 0 — that is normal for most memes and clips.
  • Total Duration equals the sum of all frame delays in milliseconds — divide 1000 by a typical delay for rough fps.

GIF Frame Extractor FAQ

What is the output format?

Every frame is exported as PNG (frame-{index}.png).

Do frame delays survive?

Per-frame delay ms is shown on each card, and the result object carries the delay metadata through extraction.

Do only GIFs work?

Yes — the dropzone accepts image/gif only.

Is the GIF uploaded?

No — gifuct-js parses the ArrayBuffer locally in your browser.

What is Total Duration?

The sum of all frame delays in milliseconds.

Credits

  • gifuct-js — GIF parser and frame decompressor
ShareTweet
More Image Tools

Command Palette

Search for a command to run...