Sprite Lab

Slice, align, animate, set pivots and hitboxes and pack an atlas — one sheet, one screen.

The Sprite workspace is the step between finished art and a game engine. It imports a PNG sheet, numbered frame files, a GIF or APNG, an .aseprite file or an existing atlas with its JSON or XML, and turns it into animations (tags) with a duration in milliseconds on every frame, a pivot per frame and hit, hurt or custom boxes. Pack & Export then writes the files Godot 4, Unity 6, Phaser, PixiJS, LÖVE and other targets load. Painting pixels happens in the Pixel workspace of the same project.

Drop image files hereProcess many files at once
No upload · processed on this device

What a game-ready sprite needs besides pixels

An engine does not play a picture; it plays a list of frames. Each frame needs its rectangle on a texture, the canvas it belongs to (so a trimmed frame lands where it was drawn), a pivot that says which pixel sits on the object's position, and a duration. An animation is a named run of frames with a direction and a repeat count. Hit and hurt boxes are extra rectangles per frame that game code checks.

The Studio keeps exactly that document. A sheet is one shared image and its frames are regions of it, so reordering or re-tagging never touches pixels. A pivot is stored as 0–1 of the frame canvas (bottom-centre 0.5, 1.0 unless you set it), durations are milliseconds (100 by default, as in Aseprite), and a tag's repeat follows Aseprite: 0 loops, n plays n times. Every automatic guess on import is listed with its confidence and one-click alternatives, and Apply is one undo step.

Each export target writes what its engine can read and says what it cannot carry: Godot gets per-frame durations and boxes in resource metadata, Unity gets per-frame pivots and one clip per tag but no boxes, Defold plays one FPS per animation.

Tag
A named run of frames with a direction (forward, reverse, ping-pong) and a repeat count.
Pivot
The point of a frame that sits on the object's position; stored as 0–1 of the frame canvas.
Frame canvas
The full size a frame is drawn on, even when only its opaque part is packed.

Example: one 384 × 256 sheet to a Godot 4 bundle

A sheet of 8 columns × 4 rows of 48 × 64 frames, one move per row.

Import     grid 48 × 64, margin 0, gap 0 · 32 frames · one animation per row
Timeline   rows renamed idle, run, jump, attack
idle       8 × 100 ms = 800 ms, repeat 0 (loop)
attack     7 × 100 ms + frame 5 held 250 ms = 950 ms, repeat 1 (plays once)
Pivot      bottom-centre (0.5, 1.0) = pixel (24, 64) on every frame
Hit box    attack frames 4–6: 16 × 12 px at (34, 30), same box id on all three
Export     Godot 4 → hero.tres (4 animations) + hero.png + hero.tscn + hero.png.import
           attack in Godot: loop off; idle: loop on

The same project exports again for Unity or Phaser without redoing the timeline. What happens in Godot next is on Aseprite to Godot and sprite sheets in Godot.

Check the result

  • Play every tag with Enter before export; each frame shows for its own milliseconds, and a play-once tag stops on its last frame.
  • In Pack & Export read the line under the target: "Loaded in Godot 4.7.2" (or UNVERIFIED in amber for GameMaker) and any setting the target changes before export.
  • After export read the notes: they list what the target could not carry, such as differing pivots in one Godot animation or boxes that Unity does not receive.
  • Open the result in the engine and play one tag next to Nerulio's preview at the same zoom.

Troubleshooting

SymptomLikely causeHow to checkFix
The proposed grid is wrongUneven gaps, or sprites of mixed sizes on a sheet that looks like a gridThe decision shows medium or low confidence, with reasons about split or crossed cellsPick an alternative or Islands; see slicing that is off
An .aseprite file arrives flattenedIts layers do not compose exactly in the Studio (5 of 231 test files), or cels use z-index (4 of 231)The import panel states the reasonFrames and timing are still right; keep layered editing in Aseprite and re-import
Boxes or pivots are missing in the engineThe target has no place for them: Unity gets pivots but no boxes, Defold and CSS get neitherThe export notes under the buttonExport the Godot bundle or the generic JSON for boxes, or add them in the engine
The character hops when the animation changesFrames have different pivots but the Godot scene node has one offsetThe Godot export notes warn about differing pivotsUse one pivot for the tag, see pivots per frame

Other ways to do it

OptionWhen it is the better choice
Aseprite, then its File › Export Sprite Sheet and an engine pluginYou draw and animate in Aseprite anyway and your engine has a maintained importer; plugins that call Aseprite need it installed on every machine that imports.
TexturePackerYou mainly pack many separate images into atlases for many frameworks and want its command-line automation; it does not edit tags, pivots per frame or boxes the way a sprite editor does.
The engine's own editors (Unity Sprite Editor, Godot SpriteFrames panel)One or two animations with even timing that you prefer to set up inside the project.

What this page does not cover

  • Rotated frames from an imported atlas stay rotated, and exporting them is UNVERIFIED; repack without rotation.
  • GameMaker strips are not verified in GameMaker itself.
  • Painting tools live in the Pixel workspace, which lacks some Aseprite tools (layer groups, tilemap layers, RotSprite, text).

Versions and sources

Import: frames correct on 16 of 16 real assets with the default choices; 231 of 231 .aseprite files came back from Nerulio's writer into Aseprite 1.3.18 with the same tags, durations and pixels. Export: 47 of 49 engine runs pass (Godot 4.7.2, Unity 6000.5.3f1, Phaser 3.90 and 4.2, PixiJS 8.21, LÖVE 11.5, Spine runtime 4.2, Defold bob.jar 1.13.1); the two failures are Phaser 3.90's bug with trimmed Sparrow XML, which the Sparrow XML (Phaser 3) preset avoids.

Official documentation used

Sprite Lab

Slice, align, animate, set pivots and hitboxes and pack an atlas — one sheet, one screen.

How it works

  1. Add images
  2. Adjust settings and review the result
  3. Download a new file

Supported formats

PNG / JPG / WebP / AVIF / HEIC → PNG + JSON (ZIP) — Input decoding depends on browser support and optional engines.

What this tool does

Slice, align, animate, set pivots and hitboxes and pack an atlas — one sheet, one screen.

Implementation and verified quality

advanced · Studio Sprite workspace: measured grid (margin, spacing) or alpha islands, colour key, previewed import decisions; GIF/APNG/.aseprite decoders; timeline, pivots, boxes, alpha contour collision. Quality qualification is in progress. Pro/Flagship quality has not been established.

Before you export

Detached parts are merged by distance. Overlapping characters are not semantically separated, rotated packing is not supported, and the Unity importer is UNVERIFIED.

Frequently asked questions

What are this tool’s limitations?

Detached parts are merged by distance. Overlapping characters are not semantically separated, rotated packing is not supported, and the Unity importer is UNVERIFIED.

Are my files uploaded?

This tool processes the files you open on your device without uploading them. Images you explicitly attach to community posts are uploaded separately. Optional engines and models are downloaded from third parties; those requests expose connection information such as your IP address.

Will my work be saved automatically?

No. Images and editing state stay in this tab; media output can use local temporary storage. Changing language preserves your work; reloading, closing the tab, or following a link to another page can clear it.