Create sprite sheets from multiple images with JSON metadata, or slice existing sprite sheets into individual frames. Perfect for game development.
Combine multiple individual images into a single sprite sheet with corresponding CSS coordinate data. Upload your icons or animation frames, and the tool packs them into one image file with a JSON or CSS mapping for each sprite's position.
Initializing in your browser…
Generate seamless tileable textures using Perlin noise, Simplex noise, Voronoi cells, and FBM. Customize colors with gradient editor. Export at multiple resolutions.
Create memes with customizable text overlays. Add multiple text layers, adjust fonts, colors, and positions.
Create chord diagrams for guitar, ukulele, and bass. Choose from chord library or build custom fingerings. Export as PNG or SVG.
A game needs 16 animation frames packed into one sheet with coordinates for the engine.
Input
16 frames (64×64) · 4×4 grid · 2 px padding
Output
sprite.png + a JSON atlas of each frame’s x/y/w/h
Packing frames into one image plus a coordinate atlas means the engine loads a single texture and slices it, cutting draw calls and load time. The generated JSON removes the error-prone job of writing frame rectangles by hand.
Combine multiple individual images into a single sprite sheet with corresponding CSS coordinate data. Upload your icons or animation frames, and the tool packs them into one image file with a JSON or CSS mapping for each sprite's position.
Upload your frame images in Generate mode, reorder them with the up/down buttons so they play in sequence, set Columns to match your frames-per-row, add a few px of Padding, then download the PNG plus the TexturePacker-style JSON (frames keyed by filename, meta format RGBA8888) for your atlas loader.
Switch to Slice mode, upload a sprite sheet, and set Columns/Rows (1-20 each); the Frame Width/Height auto-fill from the source dimensions and a grid overlay shows the cut lines. Slice to get columns x rows PNGs, then download them as a ZIP named frame_000.png, frame_001.png, etc.
The Sprite Sheet Generator runs two distinct modes that the rest of the page only half-covers. In Generate mode it composites multiple uploaded images onto a single canvas: it measures the widest and tallest sprite in your set and lays every frame into a uniform cell of those maximum dimensions, so a sheet of mixed-size art ends up on a regular grid. You control the layout with a Columns slider (1-10) and a Padding slider (0-20px) that inserts gutters between cells, and a Background dropdown offering Transparent, Black, White, or 'Magenta (debug)' (#ff00ff) - the magenta option is the classic trick for spotting stray edge pixels against a high-contrast fill. Each smaller sprite is centered inside its cell rather than pinned to a corner, and you can reorder the input list with up/down buttons before generating so frame order in the sheet matches your animation sequence.
Alongside the PNG (exported via the canvas as image/png), Generate mode emits a JSON sidecar in a TexturePacker-style hash format: a 'frames' object keyed by each source filename with its extension stripped, where every entry stores x, y, w, and h, plus a 'meta' block declaring format 'RGBA8888', scale 1, the output image name 'spritesheet.png', and the full sheet size. Note that the frame width and height written to JSON are the uniform cell size (max dimensions), not each sprite's original size, and the format is the flat per-frame variant - it does not include TexturePacker's spriteSourceSize, rotated, or trimmed fields, and there is no CSS background-position export. You can copy the JSON to the clipboard or download it next to the PNG, and the hash-keyed structure loads directly in atlas loaders that accept this shape.
Slice mode does the inverse: upload an existing sprite sheet and the tool cuts it into individual frames. You set Columns and Rows (1-20 each) plus a Frame Width and Frame Height; on upload it auto-fills the frame size by integer-dividing the source dimensions by your column/row counts (Math.floor of width/columns and height/rows), and a live grid overlay drawn with CSS linear-gradients previews the cut lines on the source. Slicing draws each cell onto its own temporary canvas and exports it as a PNG, producing exactly columns x rows frames regardless of the actual image content. Because the cut is a fixed-step grid, it assumes evenly spaced tiles - irregular or trimmed atlases won't line up. You can download any single frame, or bundle them all into a ZIP (built with a lazily-imported jszip) where files are named frame_000.png, frame_001.png, and so on, zero-padded to three digits. Everything happens in the browser canvas, so images are never uploaded to a server.
Combining many small images into one file reduces the number of HTTP requests, which can improve page load performance.
Consistent sizes work best, but the packer handles mixed dimensions too. Icons in the 16-64px range are the most common use case.
Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.