Skip to content

Split a GIF into individual frames

Explode an animated GIF into numbered PNG or JPEG frames with exact per-frame delays, a contact-sheet preview and one ZIP download.

  • Runs in your browser
  • Files are never uploaded
  • Free, no account
Drop a GIF hereEvery frame comes out as a numbered image — no upload, no frame cap besides your memory.GIF · up to 512 MB each
The frame delays are read straight out of the GIF header before FFmpeg even loads, so the timing table below is exactly what the file specifies — not an estimate from a fixed frame rate.

First use downloads the 10 MB video engine from this site. After that it is cached and works offline. It is WebAssembly served by onthisdevice.com — never a third-party CDN — and your file is still processed entirely on your own device.

How to split a GIF into frames

  1. Drop the GIF in. Its dimensions, frame count and total length appear straight away, read from the file header rather than by decoding it.
  2. Choose PNG or JPEG, and whether you want every frame or a sample of them.
  3. Press extract. Each frame appears in the contact sheet with its own delay and running timestamp.
  4. Save one frame with the button under its thumbnail, or take the whole set as a ZIP.

Where the frame delays come from

A GIF stores timing per frame, not as a frame rate: ahead of each image there is a Graphic Control Extension block containing a delay in hundredths of a second. This page parses those blocks directly out of the file bytes, which means the timings shown are literally what the file specifies — not an average inferred from a nominal frame rate, which is what you get from a tool that only asks the decoder.

That matters more often than it sounds. Hand-authored GIFs frequently hold a title frame for two seconds and then run the rest at 40 ms, and screen recordings exported from capture tools routinely have irregular timing where nothing moved. A uniform "10 fps" readout hides all of that; the per-frame table does not.

What is in the ZIP

  • Every extracted frame, numbered in playback order with zero-padded names so they sort correctly in any file manager.
  • frame-delays.csv, with one row per frame: its number, the frame number it came from in the source, its delay in milliseconds, its running timestamp, and its byte size.

That CSV is what makes the round trip possible. Edit or delete a few frames, then rebuild with the GIF maker, entering the delays from the CSV — the result plays at exactly the original speed.

PNG or JPEG?

PNGJPEG
QualityLossless — a pixel-exact copy of the decoded frameLossy, though at quality 2 the loss is very hard to see
TransparencyKept as a real alpha channelNot supported — transparent pixels become black
SizeSmall for flat colour, large for photographic contentConsistently smaller for photographic content
Use it forAlmost everything — screenshots, line art, logos, anything you will editHundreds of photographic frames you only need to look through

GIF transparency is binary — a pixel is either fully opaque or fully invisible — so a PNG exported here has a hard-edged alpha channel rather than a soft one. That is a property of the source format, not of the extraction.

Sampling long animations

Extraction stops at 600 frames so the browser can hold every decoded image without becoming unresponsive. Beyond that, use the "every 2nd frame" or "every 5th frame" option: the sampling is applied during decoding, so it covers the whole animation rather than truncating it at the 600-frame mark. For a long screen recording where consecutive frames barely differ, sampling often gives you a more useful contact sheet than the complete set anyway.

Things people use this for

  • Finding the perfect still. Extract a reaction GIF and pick the one frame that works as a static image.
  • Fixing an animation. Pull the frames, delete or retouch the bad ones, and rebuild.
  • Sprite sheets. Numbered PNGs are exactly what a game engine’s animation importer wants.
  • Frame-by-frame study. Stepping through a captured bug or a demonstration one frame at a time, with the real timestamps attached.
  • Rebuilding at a different speed. Extract, then reassemble with a uniform delay to normalise irregular timing.

Everything stays on your machine

Decoding runs through FFmpeg compiled to WebAssembly inside this tab, and the ZIP is built here too with JSZip. No frame is ever uploaded, there is no per-file size cap beyond your device’s memory, and no watermark is added. After the engine has been cached once, the page works with the network switched off — a claim you can test in about ten seconds.

Questions

How do you know each frame’s delay?

The delays are read straight out of the GIF file’s Graphic Control Extension blocks before FFmpeg is even loaded, so the timing table is exactly what the file specifies rather than an average derived from a nominal frame rate. They are also written into frame-delays.csv inside the ZIP.

PNG or JPEG?

PNG for anything with transparency, flat colour or text — it is lossless and keeps the alpha channel that GIF transparency becomes. JPEG only if you need the frames much smaller and the content is photographic; transparent pixels turn black in a JPEG.

Can I rebuild the GIF afterwards?

Yes. Take the extracted PNGs into the GIF Maker, keep them in filename order, and enter each delay from frame-delays.csv. That round trip is the usual way to delete, retouch or reorder a few frames of an existing animation.

What is the frame limit?

Extraction stops at 600 frames so the browser stays responsive while holding every decoded image in memory. If your GIF is longer, choose "every 2nd frame" or higher and the sampling will cover the whole animation.