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.

- 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 / Studio | Nerulio | GIF |
|---|---|---|
| Grid cell (or island) | One frame; empty cells are left out | One GIF frame |
| Row | One animation row_n, renamed on the Timeline | One file per animation |
| Key colour (magenta, green …) | Made transparent at import | The transparent index |
| Frame rate or ms per frame | A duration per frame | Delay in 1/100 s, at least 2 |
| Direction, repeat | Written out as frame order; repeat kept | Frame order; loop count |
| Frames of different sizes | One cell per animation, pivots aligned | One 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
- Drop the sprite sheet and press Apply.
- Check the animations and their timing on the timeline.
- Open Pack & Export.
- Export "Animated GIF" (or APNG).
Files you get
| File | What it is for |
|---|---|
sheet_gif.zip | The download for a sheet named sheet.png, with a folder sheet_gif/. |
sheet_gif/sheet_row_1.gif | The first row's animation; rename the tag first for a readable name such as sheet_walk.gif. |
Use the GIF
- Unzip; each animation is its own GIF.
- Open one in a browser to check the speed: a 6-frame row at 10 fps loops every 0.6 s.
- Check the edges on the background where the GIF will appear; if they need soft alpha, export APNG from the same panel.
- 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
| Symptom | Likely cause | How to check | Fix |
|---|---|---|---|
| The GIF shows half frames or two frames at once | The grid guess is off (margin, spacing, or a cell size a few pixels wrong) | Sheet view: the grid lines over the art | Pick another grid proposal or type cell size, margin and spacing; see slicing that is off |
| Magenta or green behind the sprite | The key colour was not applied | Import panel: Background colour | Switch it to the detected colour and apply again; see removing a sprite background |
| The animation wobbles | Frames were cut as islands and their pivots differ | Onion skin (F3) | Set one pivot for the tag, or align the frames; see jitter after trimming |
| The speed is slightly off | The frame time is not a whole number of hundredths | Compare with the table above | Use 10, 20, 25 or 50 fps, or export APNG |
| Soft shadows became solid or vanished | 1-bit transparency: alpha ≥ 128 became opaque, lower alpha transparent | The export note about semi-transparent pixels | Export APNG |
Other ways to do it
| Option | When it is the better choice |
|---|---|
| APNG from the same panel | Soft edges and millisecond timing matter; every pixel is exact. |
| An online GIF maker such as ezgif | You already have loose frame images and want a quick GIF without per-animation tags. |
| Aseprite: File > Import Sprite Sheet, then export | You 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.
| Target | Files | Check |
|---|---|---|
| Godot 4 | .tres SpriteFrames · .tscn AnimatedSprite2D · .png.import | Verified 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 · AnimationClip | Verified Unity 6000.5.3f1Batch mode: sprite rects, pivots, pixels, clip keys and durations checked. |
| Phaser 3 / 4 | atlas JSON (multiatlas) · .anims.json | Verified Phaser 3.90 + 4.2Frames and animations drawn by both versions. |
| PixiJS 8 | spritesheet JSON · animations · anchor · meta.scale | Verified PixiJS 8.21Rotated and multi-page atlases included. |
| Aseprite JSON | hash / array · frameTags · slices | Verified Phaser load.aseprite · PixiJS 8.21Tags keep their direction and repeat count. |
| .aseprite | layers · tags · durations · slices | Verified Aseprite 1.3.18Opened and rendered by the Aseprite command line. |
| Spine / libGDX | .atlas | Verified spine-canvas 4.2Every region drawn by the Spine runtime, rotated and trimmed; libGDX itself was not run. |
| Starling / Sparrow XML | XML per page | Verified 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ÖVE | Lua quads · nerulio_atlas.lua · main.lua | Verified LÖVE 11.5Every frame drawn and every animation stepped through the shipped helper. |
| Defold | .atlas · .tilesource | Built Defold bob.jar 1.13.1Built by Defold's command-line builder; the built texture's UVs were read back. |
| GameMaker | spr_<name>_stripN.png · gamemaker.json | UNVERIFIEDNot loaded in GameMaker (no headless GameMaker). The strips are cut the way its strip importer cuts them. |
| CSS sprites | .css · preview .html | Verified ChromiumEvery class drawn from the shipped stylesheet. |
| GIF / APNG | one file per animation | Decoded 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).