GIF frame extractor

Locally extract complete composed GIF frames, then download one PNG or all frames and their metadata in a ZIP.

One GIF up to 1 MiB; up to 32 frames and 512 pixels per side. Summed patch pixels and summed complete-frame pixels must each stay within 2,000,000. Read/decode and each export have separate 5-second deadlines. Each PNG: 2 MiB; the complete ZIP including metadata and framing: 8 MiB. These limits do not measure total browser memory.

Every PNG is a complete composed frame, including local palettes, transparency and disposal 0–3. Choose the logical GIF background or an explicitly transparent canvas; they can produce different pixels after disposal 2. No animated preview or playback-delay normalization. Zero and missing delay remain distinct.

Supports the bounded GIF87a/89a subset only. Plain Text, user-input flags, nonzero pixel aspect ratio, unknown application/extension blocks, duplicate or dangling graphic controls and disposal 4–7 are refused. One well-formed NETSCAPE2.0 loop extension is supported; comments are ignored after validation. ZIP uses STORE, with frame-001.png… and metadata.json. PNG pixels are composed; source GIF bytes and comments are not exported.

No upload or automatic storage. Cancel terminates the owned worker and aborts FileReader. Native PNG encoding cannot be forcibly stopped: the shared session remains busy until its callback releases the canvas, even after cancellation or timeout. Retry afterward. Background tabs may delay the deadline callback.

How to use

Choose the file and policy, then select Extract frames. Select a frame number to preview its complete still image and read its raw delay and disposal in the table. Download the selected PNG or the ZIP of every frame. Changing the file or background clears the old result. There is no upload or autosave, and the original file stays unchanged.

Try an example

If a first frame fills the screen red and the second draws a small green square, the second PNG contains both the red screen and square, not only the patch. Disposal 2 restores the previous frame rectangle to the logical GIF background or transparency according to your choice, so the two policies can differ. Disposal 3 restores the saved previous pixels before drawing the next frame.

Support & limits

Supports a limited GIF87a/89a subset: global/local palettes, interlace, transparency and disposal 0–3. Plain Text, user-input flags, nonzero pixel aspect ratio, unknown extensions, disposal 4–7 and duplicate/dangling graphic controls are rejected; one well-formed NETSCAPE2.0 extension is accepted. Comments are bounded then ignored. metadata.json stores version=1, dimensions, the policy, raw repeatCount, PNG names, raw centisecond delays and disposal. Null means absent, while zero is preserved: delay=0 is not changed to 100 ms, and repeatCount=0 means unlimited NETSCAPE looping without duplicating frame data. There is no animation playback or preservation of every source byte. Filenames are fixed and ZIP uses uncompressed STORE. PNG comes from native Canvas; pixel expectations do not imply identical PNG file bytes across browsers.

Common questions

Why can the session remain busy after cancellation?

FileReader can be aborted and the worker terminated, but native PNG encoding has no force-stop callback. Its late output is discarded and the shared session stays reserved until the canvas is released; another operation cannot overlap that late resource. Retry after it finishes. Browser suspension can delay deadline delivery. Byte, pixel and work limits do not measure or guarantee total browser memory.

Related tools