Create a sprite sheet from your own images
This tool combines existing sprite frames into one PNG; it does not draw characters or create animation poses. Add PNG, JPEG or WebP images, then drag their thumbnails into order. For example, drag image 3 onto image 2 to change 1, 2, 3, 4 into 1, 3, 2, 4. Use Alt + Left/Right on a focused image to reorder with a keyboard. Remove appears at the top right on hover or keyboard focus, and stays visible on touch screens. Columns stay fixed after the first upload until you edit them or clear the sheet.
Automatic cell sizing is the default. The widest and tallest source images determine a shared cell size; original pixels are preserved without enlargement or shrinking. Added or removed images update that size automatically. Choose columns and spacing to arrange the sheet. Custom size / resizing reveals width, height, fit and sampling only when you need a specific game-engine cell size. The preview has one outside border showing the complete PNG boundary; that border is not exported. Transparent space between differently sized images is part of the single sheet, not separate files.
Understand the fixed grid
Frames run left to right, then top to bottom. Every cell has the same width and height, including transparent space around its image. Gap is used both between cells and around the outside edge. A partly filled last row remains transparent, and the selected number of columns is retained even if there are fewer images.
The atlas has no rotation, trimming or optimal packing. Each image is centered in its cell. Original size keeps its dimensions and reports an error if it cannot fit. Fit inside cell scales up or down with preserved proportions, rounding the final width and height down to whole pixels. Integer enlargement uses the largest whole-number scale that fits, and refuses to shrink.
Two examples you can check
Three 16 × 16 images, four columns, 32 × 32 cells and a 2 px gap produce a 138 × 36 sheet. The cell origins are (2, 2), (36, 2) and (70, 2). In Original size mode, the first image’s content starts at (10, 10) because it is centered with 8 px of transparent space inside the cell.
For five 8 × 8 images with two columns, 16 × 16 cells and a 1 px gap, the sheet is 35 × 52. Integer enlargement scales each image by 2. The fifth frame starts at (1, 35), and the unused sixth cell stays transparent. Both examples use coordinates measured from the top-left corner.
Read and save the coordinates
Save PNG writes the composed image with its transparent areas. The checkerboard is an optional viewing aid, not part of the file. The collapsed Frame data for game engines section contains optional Save JSON and a coordinate table. Use those only when a game or program needs to locate frames inside the sheet; for the image itself, PNG is enough. Table headings identify image name, left/top position and cell width/height in pixels. Visible row numbers start at 1; JSON indexes start at 0.
Each frame has a zero-based index, its filename, and integer x, y, width and height describing the entire cell. The content object gives the rectangle actually drawn inside that cell; source records the decoded original dimensions. Names can repeat, so use index to distinguish frames. JSON is a coordinate map, not an embedded image archive or a project file that this page can reload. Keep the PNG and JSON together.
Which settings preserve pixel art?
Use Original size or Integer enlargement with Nearest neighbor. Integer enlargement gives each source pixel an equal square block. Fit inside cell can use a fractional scale and therefore produce uneven pixel widths even with nearest-neighbor sampling. Smooth sampling is available for illustrations, but blends edges. JPEG has no transparency; uploading it does not remove its background.
What are the limits?
Use at most 40 files, 10 MiB per file and 40 MiB total. Each input is limited to 8192 px per side and 16,777,216 pixels; decoded images together are limited to 33,554,432 pixels. Output has the same per-side and total-pixel limits as one input. Custom cells accept 1–2048 px, columns 1–40 and gaps 0–256 px. Reduce dimensions or split the batch when a limit is reached.
What happens when an upload fails?
Damaged, unsupported and animated images are rejected. A failed batch leaves previously accepted frames intact. Clear cancels pending loads and removes the current images. Files are decoded locally and image resources are released when removed or replaced. Save your outputs before closing or changing languages; the page does not keep a project between visits.
Can this turn a GIF into sprites or animate a character?
No. This page arranges static images that you supply. It does not extract GIF frames, create AI characters, generate animation timing, rotate or trim sprites, package a ZIP, or provide third-party character assets. Its JSON is a plain coordinate map; an engine-specific importer may require you to adapt field names or coordinate conventions.