Skip to content
ImageNothing leaves this tab

GIF to frames

Drop a GIF in and every frame comes back as its own PNG, in order, with the delay it was shown for.

1GIF
No GIF added yet.

Mechanism

How this splits a GIF into individual PNG frames

gifuct-js unpacks the compressed pixel data and the timing data attached to each frame. Most frames in an optimized GIF only carry a small patch covering the pixels that actually changed, not the whole image. This tool composites each of those partial patches sequentially onto a main canvas, handling transparency and disposal rules just as a standard GIF player would. What comes out after each frame is the fully built picture at that exact moment, which is what gets exported as a complete PNG rather than a fragmented patch.

Limits

Where GIF to frames falls short

  • Decoded frames remain in memory as full-canvas RGBA buffers. Canvas dimensions and frame count both increase memory use; a small GIF file can still expand into a large set of frames.
  • Output is always a full RGBA PNG, never the GIF's original indexed palette. That is a real format change, but not a loss of anything visible — the composited pixels are what the animation actually shows at that frame, and PNG stores them exactly rather than through a limited colour table.
  • Interlaced GIFs decode correctly — the rows are de-interlaced before compositing — but there is nothing on this page that tells you whether the file you dropped in was interlaced to begin with.
  • A GIF with only one frame produces exactly one PNG. There is no second frame to find, because there wasn't one.
  • Files over 60MB are turned away before decoding starts. An ordinary animated GIF rarely gets close to that; one that does is more often a video re-encoded into GIF than a normal animation.
Questions

Questions about splitting a GIF into frames

Does splitting a GIF into frames upload the file anywhere?

No. Decoding, compositing and PNG encoding all happen on a canvas in your own browser tab. There is no upload endpoint on this site to send the file to, which matters if the GIF is something you would rather not put on a server in the first place.

What format do the frames come out as, and is anything lost?

Each export is a PNG of the composited frame. The PNG files and their ZIP contain still images, without a timing manifest or GIF loop rules. Frame delays are displayed in the page.

My GIF has frames with only a small part of the image changing. Will the exported PNGs be blank or full of glitches?

They come out as full frames, not the small patch the GIF actually stored. This tool composites each patch onto the running picture using the frame's disposal method rather than pasting raw patches over each other, which is the naive approach that produces exactly the kind of transparent holes and ghosting you're asking about.

Does it handle interlaced GIFs?

Yes. The rows are de-interlaced as part of decoding, before any compositing happens, so an interlaced source produces the same correct output as a non-interlaced one. There is no separate flag telling you a file was interlaced — it just works either way.

Can I download one frame instead of the whole set?

Yes. Every thumbnail in the grid has its own download button that saves just that frame as a PNG. The button at the bottom of the page is for downloading everything at once as a single zip.

Is there a limit on frame count or file size?

Files over 60MB are rejected before decoding starts. There is no hard cap on frame count, but every frame is kept as a full-size pixel buffer until you download it, so a GIF with a few hundred frames is comfortable and one with several thousand will use noticeably more memory and time.

What happens with a GIF that only has one frame?

It decodes to a single PNG. Not every GIF is animated, and a static one is not treated as an error — you get back the one frame that exists.

How do I know if the GIF loops?

The info panel reports whether the file carries the Netscape loop extension block, which is what tells a browser or viewer to replay the animation instead of stopping after the last frame. It reports whether that block is present, not a specific loop count, since almost every GIF that has the block sets it to loop forever anyway.