Sprite Sheet Generator
Pack images into one sprite sheet with a JSON or CSS map. Every sprite keeps its own pixels.
Drag & drop files here, Ctrl+V to paste, oror
Runs in your browser
Original Size, Exact Rects
No sprite is scaled to fit. Each is drawn at its own pixel size, and the map gives the rect it sits in, so no frame shows a sliver of its neighbour.
Checked Before Download
The PNG is decoded again and every sprite is compared with its rect. The JSON is parsed back frame by frame. A mismatch stops the download with a message.
Privacy-First
Images are read and packed on your own device. Nothing is uploaded, nothing is stored, and no account is needed.
How it works
What a sprite sheet is for
A sprite sheet puts many small images into one file and records where each one sits. A game engine loads one texture instead of hundreds and swaps frames by moving a rectangle. A web page loads one request for all its icons and shows each one with CSS background-position. The picture is only half of it: the map of rectangles is what the engine or the stylesheet actually reads.
Why the rect has to be exact
If a frame rectangle is one pixel off, every frame shows a thin line of its neighbour, and scaling the sprite in the engine makes it worse. This page never scales a sprite to make it fit. Each is drawn at its own pixel size, the map is written from the same placements, and spacing keeps a clear gap so texture filtering does not blend edges together.
Compact, grid, row or column
Compact packs sprites into shelves, tallest first, for the smallest sheet; the sheet order changes but the map keeps every name. Grid gives equal cells the size of the largest sprite in your order, which is what Phaser load.spritesheet expects with frameWidth and frameHeight; smaller sprites are centred in their cell. Row and column keep your order in a single strip, handy for CSS hover pairs.
JSON hash, JSON array or CSS
The JSON files follow the TexturePacker layout: a frame rect, sourceSize, and a meta block with the sheet size. Hash keys frames by file name and is the form PixiJS reads; Phaser reads both hash and array, where array lists frames in order. Grid sheets also carry the cell size in meta.grid. CSS gives one .sprite rule and one class per sprite with its width, height and background-position. Every JSON map is parsed back and compared before it is downloaded.