Godot
AtlasTexture · SpriteFrames
- Import as AtlasTexture
- Filter clip + padding
- Mipmaps off for pixel art
Use the Godot bundle — editor script builds AtlasTextures from trim-aware regions.
Pack multiple sprites into optimized texture atlases for Godot, Unity and modern 2D engines.
Upload once · inspect the atlas · export for your engine
Generated atlas
Your packed atlas preview
Your atlas will appear here
Upload PNG / JPEG / WebP. Packing stays in your browser.
Frame strip
Drag to reorder · order maps left→right, top→bottom in grid mode
PNG · JPEG · WebP
How sprites are arranged on the atlas
Bin-packs each sprite tightly. Best default for mixed sizes and photos.
Selected sprite
Production metrics from the current atlas — not marketing copy.
Supported exports and import notes for common 2D engines.
AtlasTexture · SpriteFrames
Use the Godot bundle — editor script builds AtlasTextures from trim-aware regions.
Sprite Atlas · Multiple mode
Drop the Unity bundle into Assets/ and run the helper to apply sprite metadata.
Texture pages · PNG
Export PNG + JSON, then assign frames on a texture page.
Atlas JSON · Multi-atlas
Phaser preset JSON loads directly with the atlas PNG.
Sprite sheet · PNG
Use the PNG atlas; define frames from the exported JSON sizes.
Production advice from shipped 2D games
Keep 1–2px between sprites so bilinear samples never bleed. Extrude 1px duplicates edge colors into the gap.
Bleeding shows as colored fringes. Fix with padding + extrude, or Point filtering for pixel art.
Pixel art → Point / Nearest. Smooth HD → Bilinear with enough padding. Never mix both on one atlas without care.
Prefer 512² / 1024² / 2048² when targeting older GPUs, mipmaps, or compressed formats.
Enable only if sprites shrink on screen. Mipmaps + zero padding = bleed. Prefer POT + padding first.
Keep frame order stable. Grid packing preserves cell rhythm for AnimationPlayer / Animator clips.
Sprites that share one atlas can batch. Split atlases by material/shader, not by character pose.
RGBA8 ≈ width × height × 4 bytes. A 2048² atlas is ~16 MB uncompressed — trim and pack before upscaling max size.
Compress in-engine (ETC2 / ASTC / DXT). Export clean PNG here; let the engine compressor handle blocks.
Click a preset to update packing configuration instantly
Idea → level → art → collision → audio → progression
GDD Generator
Earlier step
Level Generator
Earlier step
Sprite Sheet Packer
You are here
Autotile Generator
Build a full 47-tile terrain set from two source tiles.
Auto Hitbox
Trace a sprite's alpha into a collision polygon automatically.
Collider Simplifier
Reduce collision vertex count without changing hit behaviour.
Retro SFX
Synthesize 8-bit jumps, coins and explosions in the browser.
XP Balancer
Model level curves, gold flow and stat progression.
Loot Simulator
Verify drop rates with Monte Carlo simulation before shipping.
More free browser-based game development tools
Turn a game idea into a structured, scoped design document.
Generate seeded 2D levels and export them as engine-ready tilemaps.
Build a full 47-tile terrain set from two source tiles.
Trace a sprite's alpha into a collision polygon automatically.
Six steps from a folder of frames to an atlas your engine can read, using the Packer tab above.
The Packer tab takes PNG, JPEG and WebP files, as many at a time as you like. Every file is cropped to its visible pixels the moment it loads — there is no trim checkbox to find, because packing untrimmed art wastes atlas space in every case. If your sprites sit on a flat opaque background instead of transparency, the loader samples the four corners and, when they agree, floods that colour away from the border before cropping. No account, no upload: the files are read into a canvas in the page.
This is the one decision that changes the output shape. Dense pack fills space, fitting each sprite into the tightest gap left by the ones before it, which produces the smallest atlas for mixed sprite sizes. Grid rows builds a uniform cell sized to your largest sprite and drops every frame into one, which wastes some space but keeps cell coordinates predictable — what an animation timeline needs. Pick Grid rows for a walk cycle, Dense pack for a pile of UI icons.
Drag thumbnails in the frame strip, or sort the whole set A–Z or Z–A. Frame order is written into the exported metadata in strip order, so idle_00 through idle_07 arriving in that sequence is what makes the clip play correctly on the other side. Getting this right here saves reordering frames by hand inside Godot or Unity later.
Padding is empty space around each sprite, 0 to 64px. Extrude, 0 to 8px, repeats the sprite’s own outer pixel row outward into that space so a filtered sample that strays past the edge still reads the right colour. The two add together into the gap the packer leaves on all four sides. Pixel art with nearest-neighbour filtering is fine on 1px padding and 1px extrude; smooth-filtered HD art with mipmaps wants more. Zero of both plus bilinear filtering is the single most common cause of coloured seams around sprites.
Max texture size is 1024, 2048, 4096 or 8192 — pick the smallest your frames fit in, because an atlas costs GPU memory for its whole area whether or not sprites occupy it. Atlas Shape controls the rounding: square power-of-two for engines and compressed formats that want it, rectangular power-of-two, or any size when nothing downstream cares. If a layout cannot fit, the tool says which size it needed rather than silently cropping.
PNG alone is half an atlas — the other half is the frame table. Choose an export preset (Generic JSON Hash, Phaser 3 atlas JSON, or a Godot or Unity import spec) and take the ZIP bundle: it carries the PNG, the spec, and for Godot or Unity an editor script plus a README that names the files it expects. XML and CSS are there separately for pipelines that want them — the CSS output gives background-position rules for web sprites rather than game frames.
The Slicer tab runs the pipeline backwards — for asset packs that shipped a sheet and no metadata.
The Slicer tab is the opposite direction: one existing sprite sheet in, individual frames out. Use it for asset-pack sheets with no metadata, for sheets whose JSON you have lost, or to rebuild clips from a sheet somebody else packed.
Auto-detect finds frames by walking connected visible pixels, bridging gaps up to two pixels so antialiased edges and thin limbs do not split into separate frames; it then groups the detected boxes into rows and orders each row left to right. Rows / Columns is right for a sheet you know is a regular grid — it defaults to 4×4. Fixed Frame Size is for a sheet with a known cell, defaulting to 64×64. Auto-detect on a tightly packed sheet with touching sprites will merge neighbours; a regular sheet is better served by one of the two manual modes.
Auto-detect assumes the usual convention that one row is one animation, so it creates a group per detected row with the first called Idle. Rename them, add more, and move frames between them. The names matter: exported PNGs are written as run_00.png, run_01.png and so on from the group name, which is the naming your engine importer will key off.
Set FPS and play the active group. This catches the two things a still grid hides: a frame in the wrong position, and a frame whose box is a few pixels off so the sprite jitters. Fix the rectangle in the Selected Frame panel by editing x, y, w and h directly. The preview updates no faster than once every 40ms, so above about 25 FPS it stops being a faithful speed reference while remaining useful for spotting a bad frame.
The ZIP holds one PNG per frame plus a manifest — generic JSON, a Godot SpriteFrames spec with a generate_sprite_frames.gd helper, or a Unity clip spec with JaconirGenerateAnimationClips.cs. The manifest is what turns a folder of numbered PNGs back into named animations with frame order intact, rather than something you reassemble by hand.
The reasoning behind each control, and the cases where the obvious setting is the wrong one.
| Max texture size | Square atlas | Uncompressed RGBA |
|---|---|---|
| 1024 px | 1024×1024 | 4 MB |
| 2048 px | 2048×2048 | 16 MB |
| 4096 px | 4096×4096 | 64 MB |
| 8192 px | 8192×8192 | 256 MB |
Each row is the figure the insights panel reports as estimated GPU memory for a full square atlas at that cap — width × height × 4 bytes, before any in-engine block compression. Every doubling of the cap quadruples the cost, which is why the smallest size your frames fit in is worth more than a few percent of extra occupancy.
Free with no watermark, no account, and no sign-in. The packer, the slicer, the preview and the ZIP export all run in your browser, so there is nothing to pay for and nothing to register. Exported PNGs are exactly what the packer drew.
Open the Packer tab, drop in your PNG, JPEG or WebP frames, choose Dense pack for mixed sizes or Grid rows for animation cells, set padding and extrude for your filtering mode, then export the PNG together with a metadata preset for your engine. The frames are trimmed and arranged automatically; the only decisions that really matter are packing style and padding.
PNG, JPEG and WebP. PNG with real transparency gives the best results because trimming works from the alpha channel directly. JPEG and flat-background images still work — the loader detects a uniform opaque background from the four corners and removes it before trimming — but JPEG compression noise around sprite edges can survive that and show up as a faint halo.
Packing runs on your own machine, so the limit is your device rather than a server quota. Hundreds of frames are routine. Very large sets of a thousand or more take longer, mostly in decoding the source images and generating the ZIP, and a large atlas needs the memory to hold it as a canvas.
Dense pack fits each sprite into the tightest leftover gap, producing the smallest sheet for sprites of mixed sizes. Grid rows builds one uniform cell sized to your largest sprite and puts every frame in one, which uses more space but gives you predictable coordinates. Use Grid rows for animation strips where a timeline reads frames by cell index, and Dense pack for icons, FX and anything where only total size matters.
That is texture bleeding: the GPU sampled slightly outside a sprite’s rectangle and picked up a neighbour. Add padding so neighbours are not adjacent, and add extrude so the pixels just outside each sprite repeat its own edge colour rather than being empty. For pixel art, also switch the texture to nearest-neighbour or point filtering and turn mipmaps off — bilinear filtering with mipmaps and no padding is the configuration that bleeds worst.
Padding separates sprites with empty space; a stray sample lands on transparency and you get a dark or light fringe. Extrude copies each sprite’s outermost row and column outward into that space, so a stray sample reads the sprite’s own colour and the fringe disappears. They solve the same problem from opposite directions and are normally used together — 1px of each covers most pixel art.
Not if the importer reads the metadata. Each trimmed frame is exported with its original uncropped size and the offset it was cropped by, which is enough for the engine to place it exactly where the artist drew it. If an animation jitters after import, the importer is discarding that offset. Packing in Grid rows avoids the question entirely, since every cell is the same size.
No. Every frame is exported upright and the metadata always reports no rotation. Allowing rotation can shrink an atlas by a few percent, but it requires the engine to un-rotate each frame at draw time and it makes the sheet much harder to read by eye when something goes wrong.
Max texture size can be 1024, 2048, 4096 or 8192 pixels. Atlas shape can be square power-of-two, rectangular power-of-two, or any size at all. Power-of-two matters for older GPUs, for mipmapping and for most block compression formats; if none of those apply, any size wastes less space. Pick the smallest max size your frames fit in — an atlas costs GPU memory for its whole area regardless of occupancy.
Yes, that is the Slicer tab. Upload one sheet and either let auto-detect find frames from the visible pixels, or give it a row and column count, or a fixed frame size. You can then group frames into named animations, scrub them on a timeline at a chosen frame rate, correct any rectangle by hand, and export individual PNGs with a manifest. It is the practical answer to an asset pack that shipped a sheet and no metadata.
From the packer: a PNG atlas plus generic JSON, Phaser 3 atlas JSON, or a Godot or Unity import spec, and separately XML and CSS. The Godot and Unity bundles include an editor script and a README naming the files it expects, so the import is a run rather than a manual rebuild. From the slicer: numbered PNGs plus a generic JSON manifest, a Godot SpriteFrames spec, or a Unity animation clip spec. CSS output is for web sprites and gives background-position rules rather than game frame data.
It reduces draw calls and texture binds, which is usually the win on mobile and on anything drawing a lot of 2D. Sprites sharing one texture can be batched into a single call; the same sprites as separate files cannot. The gain depends on how many separate textures you started with — going from a hundred loose PNGs to two atlases is significant, going from three atlases to two is not. Split atlases by shader and filter mode rather than by character, or the batching you gained is lost again.
No. Reading the files, trimming, packing, slicing, the live preview and building the ZIP all happen in the page. There is no upload step, no account, and nothing is stored after you close the tab, which also means unreleased art never leaves your machine.
Complete Guide to Sprite Sheets
The long version: atlas packing techniques, filtering and bleed, and the Godot and Unity import workflows end to end.
Pack, Slice & Export Sprite Sheets
A worked pass through both tabs of this tool, from loose frames to clips playing in-engine.
Sprite Sheet Animation Guide
Frame rates, timing, loop points and how many frames an action actually needs.
Godot 4 2D Pipeline
Where atlas packing sits relative to tilesets, collision shapes and audio in a full 2D pipeline.