Sprite Sheet to GIF

Drop a sprite sheet and play it back as an animated GIF — choose your frames, frame rate and scale, then download.

Drop a sprite sheet, or a set of frame images, or click to choose

PNGWEBPGIFBMPJPEG

Drop several images at once and each one becomes a frame, ordered by filename: walk1, walk2, walk10.

What This Tool Does

Drop a sprite sheet and it plays back as an animated GIF. The same detection, row and range selection, and playback controls used for slicing frames apply here — pick the frames you want, set the frame rate and a scale, choose how the background should be handled, and download a single looping GIF file.

Why the Timing Isn't Exact

A GIF does not store delay as milliseconds; it stores it as a whole number of hundredths of a second per frame, and the encoder never emits a step shorter than two hundredths of a second — a shorter one is easily misread as ten times slower by real players, which would defeat the point. Most frame rates a game or an app actually uses — 24, 30, 60 — do not land on an exact multiple of that unit either, so the encoder rounds to the closest one it can represent. The gap is usually small, but at high frame rates it stops being negligible: 60 fps rounds to a 2-step delay and plays at roughly 50 fps rather than 60, and that 50 fps ceiling holds for every frame rate above it too. Whenever the rounded rate differs from what was requested, the effective fps is shown next to it, so the difference is stated rather than hidden.

Transparent or Flattened

GIF transparency is binary — a pixel is either fully opaque or fully invisible, never partway. Pixel art built with hard-edged, one-bit alpha survives that unchanged, which is why the tool defaults such sheets to a transparent export. A sheet with soft, anti-aliased edges is a different case: cutting its partial-alpha edge pixels at the 50% mark leaves a ring of the wrong colour around every sprite, most visible against a busy background. Flattening those sheets onto a solid background colour first removes the fringe entirely, in exchange for the sprite no longer being see-through. Either mode is one click away regardless of which one is suggested by default.

One Palette For Every Frame

A GIF carries a single colour table, shared by the whole animation, capped at 256 colours. Building it by looking at every selected frame at once — rather than picking a fresh palette per frame — is what keeps a character's skin tone or a UI element's colour from drifting as the animation plays; a per-frame palette would let each frame round the same colour to a slightly different nearest neighbour. The tradeoff is that a sheet using many more than 256 distinct colours across its frames will see some of them merged into their closest match, which is usually invisible on pixel art but can show as light banding on sheets with painterly gradients.

Frequently asked questions

Is my sprite sheet uploaded anywhere?
No. The sheet is decoded, sliced and encoded into a GIF by JavaScript running in your browser tab, and the file is written to disk without ever leaving your device. That is also why the tool keeps working offline once the page has loaded.
Why does the GIF play at a different speed than I asked for?
GIF timing is stored in steps of 1/100 of a second, not milliseconds, so most frame rates do not divide evenly into that grid, and the encoder never emits a step shorter than two hundredths of a second — a shorter one is easily misread as ten times slower by real players. Ask for 60 fps and the closest GIF can get is a step of two hundredths of a second, which plays back at roughly 50 fps rather than 60; ask for 7 fps and the nearest step lands closer to 7.14. Whenever the requested rate cannot be hit exactly, the tool rounds to the nearest reachable step and states the actual fps next to the one you typed, so the mismatch is never a silent surprise.
Should I export with a transparent background or flattened onto a colour?
It depends on the edges. A GIF's transparency is one bit per pixel — a pixel is either fully see-through or fully opaque, with nothing in between — so pixel art with hard edges and no anti-aliasing survives transparency untouched. A sheet with soft, anti-aliased edges does not: forcing those partial-alpha edge pixels through a one-bit cutoff leaves a visible fringe of the wrong colour around the sprite. Flattening onto a solid background colour first removes that fringe, at the cost of no longer being see-through. The tool defaults to flatten for anything it detects as soft-edged, and to transparent for anything it detects as pixel art, and either is a click away regardless.
Why do the colours look slightly different from the original sheet?
A GIF stores one shared palette of at most 256 colours for the whole animation, not a fresh palette per frame. That palette is built by looking at every selected frame together, so a colour that is common in one frame but rare across the set can be nudged toward its nearest neighbour to make room. The upside is that a colour stays visually consistent as the animation plays — nothing shifts hue from frame to frame the way a per-frame palette would.
Does the exported GIF loop forever?
Yes, every export is written to loop indefinitely, matching how the preview plays before you download.
What should I do if the estimated file size looks too large?
Scale is the biggest lever: dropping from 2x to 1x roughly quarters the pixel count the encoder has to touch. Exporting fewer frames — narrowing the range or skipping empty ones — helps too, and so does a lower frame rate, since GIF stores one full palette-indexed image per frame regardless of how similar it is to the last one.
Which frames end up in the GIF?
Exactly the ones selected in the frame strip above, in playback order — the same selection the ZIP export would use. Toggle frames off, narrow the range, or isolate a single row, and the GIF reflects it.