Sprite Sheet Generator
Pack frames into one sheet with its atlas and CSS, or cut a sheet back into frames.
Try before you buy.
- Free preview: the sheet at preview size under a watermark with its size and frame count, the cut frames under the mark and the first lines of each code; files stay locked.
- Locked until you unlock it: download and copy.
- Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.
Ways to unlock shows how to get the full result.
Printing this result is locked in the free preview.
Frames
Layout
Packed: frames fit tightly, trimmed of their empty edges. The JSON atlas says where each one is.
Repeats each frame’s edge pixels around it, so filtered textures do not pick up their neighbours.
Files
Sheet
Add frames to make a sheet.
The sheet appears here.
The ZIP holds the PNG, the JSON atlas, the CSS and the Phaser code.
Animation
Sheet to cut
How to cut it
Choose a sheet to cut.
Your sheet appears here, with the frames outlined.
Frames and animation
JSON atlas of this cut
Locked in the free preview. Opens the ways to unlock this result.
Locked in the free preview. Batch runs unlock with a pass.
Locked in the free preview. Query results unlock with a pass.
About the Sprite Sheet Generator
A sprite sheet puts the frames of an animation, or the images of a game or a web page, into one picture, so they load as one file and draw from one texture. Drop your frames and this generator packs them: tightly, each trimmed of its empty edges, or in a grid of equal cells, with the space between frames, a border, extruded edges and power-of-two sizes that game engines often ask for. It writes the JSON atlas in the widely used TexturePacker layouts (hash or array), which Phaser’s load.atlas and PixiJS read, with animation lists for numbered frames; CSS sprite classes, including for 2× sheets; and the Phaser 3 code that loads the sheet and plays it.
It also works the other way: cut an existing sheet into frames by frame size, by columns and rows, or by its JSON atlas (TexturePacker, Phaser or Aseprite, with rotated and trimmed frames put back), play them as an animation, and get the frames as PNG files, an animated GIF, or a new, tighter sheet. Everything runs in your browser; nothing is uploaded. Without a pass, the free preview shows the sheet at preview size under a watermark and the first lines of each code.
How to use it
- Choose Make a sprite sheet, then choose or drop your frames: one image per frame (PNG, WebP, JPG, GIF, AVIF, BMP or SVG). Select Try example frames to see how it works.
- Pick the Layout (Packed, Grid, One row or One column), the space between frames, the border, extruded edges and the largest sheet size; tick Power-of-two size if your engine needs it.
- Check the sheet, its size and how much of it the frames fill, and choose the Code: the JSON atlas, CSS classes or Phaser 3 code. The animation plays your frames in order.
- To take a sheet apart, choose Cut a sheet into frames, open the sheet (and its JSON atlas if it has one), and cut it by frame size, by columns and rows, or by the atlas.
- With a Pro pass, download the PNG, the JSON, a ZIP of every file, the cut frames or a GIF, or copy the code; in the free preview they stay locked.
Examples
ball_01.png … ball_08.png, 64 × 64 each · Grid · 2 px between frames
A 196 × 196 sheet: 3 columns and 3 rows of 64 × 64 cells
The Phaser code loads it with this.load.spritesheet(key, png, { frameWidth: 64, frameHeight: 64, margin: 0, spacing: 2 }).
Frames of 64 × 64 · One row, no space between frames · CSS pixel ratio 2×
.sprite-ball-02 { width: 32px; height: 32px; background-position: -32px 0; }The base class sets background-size to half the sheet, so high-density screens get every pixel of it.
A 256 × 32 sheet · Frame size 32 × 32
8 frames of 32 × 32, as PNG files or a GIF
A sheet that is one row of square frames is recognised: the frame size is set to its height.
Common uses
- Packing the animation frames of a game character for Phaser, PixiJS or another engine that reads TexturePacker JSON.
- Combining the icons or buttons of a web page into one image with CSS classes.
- Taking apart a sheet bought or downloaded as one picture, to edit single frames or re-pack them tighter.
- Checking an animation’s timing and frames before it goes into a game.
- Turning a sprite sheet into an animated GIF to show the animation in a post or a pull request.
Packed or grid
- Packed places the frames as tightly as it can (a skyline packer tries many sheet widths and keeps the smallest sheet). Each frame is trimmed of its fully transparent edges, and the atlas records where the trimmed part sat in the original frame (
spriteSourceSizeandsourceSize), so engines draw it at its original place. - Grid, One row and One column give every frame a cell the size of the largest frame, in order. That is what loaders that take only a frame width and height expect (Phaser’s
load.spritesheet, CSS animations withsteps()). - Frames are never rotated on the sheet: rotation saves a little space, but not every engine reads rotated frames.
Space between frames, extrude and power of two
- Space between frames keeps a frame’s neighbours out of it when an engine filters or scales textures; TexturePacker’s own guidance is at least 2 pixels for OpenGL rendering.
- Extrude repeats each frame’s edge pixels around it. The frame keeps its size; the extra pixels are what a filtered texture picks up instead of empty space, which stops thin seams between tiles.
- Power-of-two size rounds the sheet’s width and height up to powers of two (32, 64, 128, 256 … pixels), which some engines need for compressed textures.
- Space around the sheet keeps frames off its edges.
The JSON atlas
Each frame gets frame (its place on the sheet), rotated (always false here), trimmed, spriteSourceSize and sourceSize; meta names the image and its size. Hash lists frames by name, Array in order with a filename; Phaser reads both, and PixiJS reads the frames and the animations lists. Frames whose names end in a number (walk_01.png, walk_02.png) are listed as one animation (walk), in number order.
Cutting a sheet
- Frame size cuts as Phaser does: from the margin at the top left, frame after frame with the spacing between them; Columns and rows divides the sheet evenly.
- JSON atlas cuts exactly where the atlas says. Frames that TexturePacker rotated are turned back, and trimmed frames are put back into their original size, so every frame comes out as it was drawn.
- Fully transparent frames (the empty end of a grid) can be left out. The animation plays the frames from and to the numbers you choose, at your speed or with the atlas’s own frame times (Aseprite writes them).
Rules used
- TexturePacker: texture settings — padding, extrude and power-of-two sizes.
- Phaser: SpriteSheetConfig — frame width and height, margin and spacing of a grid sheet.
- Phaser: the loader —
load.atlasreads the JSON Hash and JSON Array layouts. - PixiJS: Spritesheet — the frames,
animationsandmetaof the JSON.
Limitations
- Up to 1,000 frames of up to 20 MB each and 64 million frame pixels in all, and sheets up to 8,192 × 8,192 pixels, the largest canvas iPhones and iPads can draw.
- Animated GIF and WebP frames give only their first frame; split them into frames first with the GIF Splitter.
- Trimming removes only fully transparent edges; a frame with a faint shadow keeps it.
- A GIF has at most 256 colours and only fully transparent or fully opaque pixels, so soft edges become hard.
- Atlases are read in the TexturePacker JSON layouts (also as written by Phaser’s and Aseprite’s exporters); other formats, such as XML or plist atlases, are not read.
Privacy
On this device: nothing is sent
Everything happens in your browser. What you enter or open here is not uploaded or stored by MySmartCoPilot.
Frequently asked questions
What do I get without a pass?
Without a pass, Sprite Sheet Generator shows the sheet at preview size under a watermark with its size and frame count, the cut frames under the mark and the first lines of each code; files stay locked. Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.
Which engines can use the sheet and its JSON?
Phaser 3 loads it with this.load.atlas(key, png, json) (hash or array layout) and PixiJS with Assets.load() of the JSON; many other engines and libraries read the same TexturePacker JSON layout. A grid sheet also works with loaders that take only a frame size, such as Phaser’s load.spritesheet, and with CSS steps() animations.
Why trim the frames?
Most animation frames have empty space around the drawing. Trimming packs only the visible part, so the sheet is smaller, and the atlas keeps the original frame size and the offset of the trimmed part, so the engine draws each frame exactly where it was.
When should I use extrude?
When frames or tiles are drawn scaled, rotated or at positions between pixels with texture filtering on: the engine then blends in pixels just outside a frame. Extruding by 1 or 2 pixels puts copies of the frame’s own edge there, which removes the thin lines that otherwise appear between tiles.
Can I cut a sheet that came with a JSON file?
Yes. Choose Cut a sheet into frames, open the sheet and its JSON (TexturePacker, Phaser or Aseprite), and the frames are cut exactly as listed, with rotated frames turned back and trimmed ones restored to their original size.
Are my images uploaded?
No. Decoding, packing, cutting and encoding the PNG, ZIP and GIF all happen in your browser.