Skip to content

Sprite Sheet to GIF — One Animated GIF per Animation

Cut the sheet into frames, split them into animations with their own timing, and export one GIF per animation — each frame at its own delay, with 1-bit transparency — or an APNG that keeps every pixel.

Cut the sheet into frames (Nerulio measures the grid or finds each sprite as an island), make each row an animation, give it a speed, and export Animated GIF: one GIF per animation, each frame with its own delay. The sheet itself has no timing, so you choose the frame rate; GIF stores 1/100 s, so 10, 20, 25 or 50 fps come out exact while 12 fps (83.3 ms) becomes 80 ms. Transparency is on/off, and up to 255 colours stay exact.

Drop a sprite sheet, numbered frames, a GIF / APNG or an .aseprite file
Runs in your browser. Files are not uploaded.
Studio Sprite workspace: one frame with its pivot, a hit box and a hurt box, and the timeline with animation tags
The real Studio with a CC0 asset (OpenGameArt).
Exports to
  • Godot 4Verified· Godot 4.7.2
  • Unity 6Verified· Unity 6000.5.3f1
  • Phaser 3 / 4Verified· Phaser 3.90 + 4.2
  • PixiJS 8Verified· PixiJS 8.21
  • Aseprite JSONVerified· Phaser load.aseprite · PixiJS 8.21
  • .asepriteVerified· Aseprite 1.3.18
  • Spine / libGDXVerified· spine-canvas 4.2
  • Starling / Sparrow XMLVerified· Phaser 4.2
  • LÖVEVerified· LÖVE 11.5
  • DefoldBuilt· Defold bob.jar 1.13.1
  • GameMakerUNVERIFIED
  • CSS spritesVerified· Chromium
  • GIF / APNGDecoded· Pillow

From a still sheet to a timed GIF

A sprite sheet is a grid of poses in one PNG. To animate it you need three things the image does not say: where each frame is (cell size, margin, spacing), which frames belong together (usually one row per animation), and how long each frame shows. Nerulio measures the first from the pixels, proposes the second from the rows, and starts the third at 100 ms per frame.

A GIF can only wait whole hundredths of a second. A frame rate is stored exactly when 100 divided by it is a whole number: 10 fps (10), 20 fps (5), 25 fps (4), 50 fps (2). Any other rate is rounded frame by frame, and no frame is written shorter than 20 ms.

If the sheet sits on a flat colour instead of transparency, key it out during the import, or the GIF shows the colour. Frames are placed on one cell per animation, aligned on their pivots, so rows cut as islands of different sizes do not wobble.

Frame rate (fps)
Frames per second; frame time = 1000 ÷ fps milliseconds.
Delay
GIF's wait per frame, in 1/100 s.
Grid
Cell size, margin and spacing of the sheet.
Ping-pong
Forward then back without repeating the end frames: 0-1-2-3-2-1.

Example: a 384 × 256 sheet at four speeds

sheet   384 × 256 px, 6 columns × 4 rows
cell    384 / 6 = 64 px wide, 256 / 4 = 64 px high
rows    row_1 … row_4, 6 frames each

fps   frame time   GIF delay          one cycle of 6 frames
 8    125 ms       13 /100 → 130 ms   780 ms (750 intended)
10    100 ms       10 /100 → 100 ms   600 ms (exact)
12     83.3 ms      8 /100 →  80 ms   480 ms (500 intended)
25     40 ms        4 /100 →  40 ms   240 ms (exact)

Ping-pong on a 6-frame row plays 10 steps per cycle (0-1-2-3-4-5-4-3-2-1), so at 10 fps one cycle lasts 1.0 s.

What maps to what

Sheet / StudioNerulioGIF
Grid cell (or island)One frame; empty cells are left outOne GIF frame
RowOne animation row_n, renamed on the TimelineOne file per animation
Key colour (magenta, green …)Made transparent at importThe transparent index
Frame rate or ms per frameA duration per frameDelay in 1/100 s, at least 2
Direction, repeatWritten out as frame order; repeat keptFrame order; loop count
Frames of different sizesOne cell per animation, pivots alignedOne frame size per GIF

What it does

  • The sheet is cut by its measured grid or by islands; each row can become its own animation.
  • Per-frame durations, direction (forward, reverse, ping-pong) and repeat count.
  • GIF with one adaptive palette per animation (exact up to 255 colours) and 1-bit transparency; APNG exact.
  • Also: WebM video at 4× nearest on a solid background, for sharing.

How to do it

  1. Drop the sprite sheet and press Apply.
  2. Check the animations and their timing on the timeline.
  3. Open Pack & Export.
  4. Export "Animated GIF" (or APNG).

Files you get

FileWhat it is for
sheet_gif.zipThe download for a sheet named sheet.png, with a folder sheet_gif/.
sheet_gif/sheet_row_1.gifThe first row's animation; rename the tag first for a readable name such as sheet_walk.gif.

Use the GIF

  1. Unzip; each animation is its own GIF.
  2. Open one in a browser to check the speed: a 6-frame row at 10 fps loops every 0.6 s.
  3. Check the edges on the background where the GIF will appear; if they need soft alpha, export APNG from the same panel.
  4. For a video post, export WebM video (4× nearest) instead; for the opposite direction see GIF to sprite sheet.

Check the result

  • The GIF of a 6-frame row has 6 frames, or 10 for ping-pong.
  • No frame shows the old background colour; if one does, the key colour was not applied at import.
  • The export notes list rounded delays; there are none at 10, 20, 25 or 50 fps.

Troubleshooting

SymptomLikely causeHow to checkFix
The GIF shows half frames or two frames at onceThe grid guess is off (margin, spacing, or a cell size a few pixels wrong)Sheet view: the grid lines over the artPick another grid proposal or type cell size, margin and spacing; see slicing that is off
Magenta or green behind the spriteThe key colour was not appliedImport panel: Background colourSwitch it to the detected colour and apply again; see removing a sprite background
The animation wobblesFrames were cut as islands and their pivots differOnion skin (F3)Set one pivot for the tag, or align the frames; see jitter after trimming
The speed is slightly offThe frame time is not a whole number of hundredthsCompare with the table aboveUse 10, 20, 25 or 50 fps, or export APNG
Soft shadows became solid or vanished1-bit transparency: alpha ≥ 128 became opaque, lower alpha transparentThe export note about semi-transparent pixelsExport APNG

Other ways to do it

OptionWhen it is the better choice
APNG from the same panelSoft edges and millisecond timing matter; every pixel is exact.
An online GIF maker such as ezgifYou already have loose frame images and want a quick GIF without per-animation tags.
Aseprite: File > Import Sprite Sheet, then exportYou own Aseprite and want to keep editing the animation there.

Engine exports and how each was checked

"Verified" means the exported files were loaded by the real engine or tool on real CC0 assets and the result was compared with the source. Anything that was not loaded is labelled as such.

TargetFilesCheck
Godot 4.tres SpriteFrames · .tscn AnimatedSprite2D · .png.importVerified Godot 4.7.2Loaded by Godot; every animation frame drawn and compared with the source file. The scene uses Nearest filtering; rotation is never used.
Unity 6.unity.json · Editor/NerulioSpriteImporter.cs · AnimationClipVerified Unity 6000.5.3f1Batch mode: sprite rects, pivots, pixels, clip keys and durations checked.
Phaser 3 / 4atlas JSON (multiatlas) · .anims.jsonVerified Phaser 3.90 + 4.2Frames and animations drawn by both versions.
PixiJS 8spritesheet JSON · animations · anchor · meta.scaleVerified PixiJS 8.21Rotated and multi-page atlases included.
Aseprite JSONhash / array · frameTags · slicesVerified Phaser load.aseprite · PixiJS 8.21Tags keep their direction and repeat count.
.asepritelayers · tags · durations · slicesVerified Aseprite 1.3.18Opened and rendered by the Aseprite command line.
Spine / libGDX.atlasVerified spine-canvas 4.2Every region drawn by the Spine runtime, rotated and trimmed; libGDX itself was not run.
Starling / Sparrow XMLXML per pageVerified Phaser 4.2Phaser 3.90 draws trimmed XML frames wrongly (its own bug); the "Sparrow XML (Phaser 3)" preset turns trim off and passes in 3.90 and 4.2.
LÖVELua quads · nerulio_atlas.lua · main.luaVerified LÖVE 11.5Every frame drawn and every animation stepped through the shipped helper.
Defold.atlas · .tilesourceBuilt Defold bob.jar 1.13.1Built by Defold's command-line builder; the built texture's UVs were read back.
GameMakerspr_<name>_stripN.png · gamemaker.jsonUNVERIFIEDNot loaded in GameMaker (no headless GameMaker). The strips are cut the way its strip importer cuts them.
CSS sprites.css · preview .htmlVerified ChromiumEvery class drawn from the shipped stylesheet.
GIF / APNGone file per animationDecoded PillowEvery frame and delay decoded again after export; APNG is exact.

Evidence

GIF decoder: 408 of 408 frames identical to Pillow on 29 real GIFs; APNG 132 of 132 on 16 files. .aseprite: 231 corpus files imported, re-written and reopened in Aseprite 1.3.18 with the same tags, durations and pixels (231/231). Exports: 49 runs in the real engines on real CC0 assets, 47 pass — the 2 failures are Phaser 3.90's trimmed-XML bug, which the Phaser 3 preset avoids.

Limits

  • A sheet stores no timing: the speed is always your choice, starting at 100 ms per frame.
  • The GIF keeps the sheet's pixel size; there is no scale option for GIF export.
  • A grid or island guess is a preview with a confidence; nothing is cut until you press Apply, and every choice has one-click alternatives.
  • .aseprite files whose layers do not compose exactly (e.g. group opacity) are imported flattened, and the Import panel says why.
  • Rotated frames in an imported atlas stay rotated; their export is UNVERIFIED.
  • Images up to 32,768 px per side (268 million pixels), subject to your browser's memory.

Versions and sources

GIF output is checked by decoding exported files with Pillow: every frame and delay as written. Grid and key detection are the Studio importer, run on real asset sheets through the UI with correct frames on the default choices. GIF's limits follow the W3C GIF89a specification.

Official documentation used

Questions

Why is my GIF's semi-transparent edge hard?

GIF has only on/off transparency. Export APNG to keep soft alpha exactly.

Will the pixels stay sharp?

Frames are written at 1:1; nothing is smoothed. The WebM export scales 4× with nearest-neighbour.

Is it free, and do I need an account?

Everything on these pages is free and works without an account. There is no watermark and no export that is held back.

Are my sprites uploaded?

No. The Studio decodes, packs and exports in this browser tab. Projects are autosaved in the browser (IndexedDB) and can be saved as a .nerulio file.

Does it need Aseprite or an engine plugin installed?

No. .aseprite files are read and written in the browser, and each engine bundle carries what that engine needs (for Godot, the import settings and scene; for Unity and the Godot TileSet, a small editor script).