SplitPicture

Sprite sheet splitterEvery sprite, its own file.

Set the cell size, margin and spacing; empty cells are skipped.

24 frames ready
Choose sheet

or drop a sprite sheet here · paste with Ctrl+V Drop one picture. Say how many pieces it becomes — a 3 × 3 profile grid, a row of carousel slides, or an A2 poster laid out across A4 sheets.

No photo handy?

  • Free
  • No sign-up
  • Photos stay on your device

A sheet drawn on a grid

A sprite sheet is many small pictures packed onto one canvas: the frames of a walk cycle, a set of icons, the tiles of a game level. Whoever packed it chose a cell size, and usually two more numbers: a border round the whole sheet and a gap between frames, so that texture filtering in a game engine does not bleed one frame into the next. To get the frames back you need all three numbers, and a general image splitter only asks for one of them.

This page asks for each of them separately. The cell is the size of one frame. The margin is the border before the first column and above the first row. The spacing is the gap between neighbouring cells, across and down. With those set, the number of whole cells that fit is simple arithmetic, the overlay draws every cell on the sheet, and anything past the last whole cell is reported as leftover rather than turned into a half-frame.

A worked example

The test sheet for this page is 288 × 288 pixels: 32-pixel cells, a 2-pixel margin and 4 pixels between cells. The same function the tool runs, evaluated when this page was built, finds 8 × 8 = 64 cells with 2 pixels left over on the right and 2 at the bottom — the closing margin.

Frame rectangles for the worked example
FileRow, columnFrom x, ySize
hero_1_1.png1, 12, 232 × 32
hero_1_2.png1, 238, 232 × 32
hero_2_1.png2, 12, 3832 × 32
hero_8_8.png8, 8254, 25432 × 32

Empty cells, counted rather than guessed

Packed sheets rarely fill their last row. A twelve-frame animation on a four-by-four grid leaves four cells with nothing in them, and a splitter that writes them anyway hands you four blank files to find and delete. With “Skip fully transparent cells” on, every cell is read at full resolution and dropped only if every one of its pixels is completely transparent. The overlay crosses those cells out, the status line counts them, and the JSON index lists them, so frame numbers stay honest: the file called hero_04_01 is still the cell in row four, column one, whatever was skipped before it.

Sheets with a solid background colour instead of transparency have no empty cells by this test, which is on purpose: a colour the tool decided was “background” would sometimes be the colour of a frame. Those sheets are cut whole, cell by cell.

Names and the index

Files are named after the sheet with the row and column (hero_01_01, hero_01_02 …) or with a running index (hero_01, hero_02 …), zero-padded so any file manager lists them in order. The optional JSON index records every frame’s rectangle on the original sheet, which is what an engine import or a build script usually wants.

This page cuts regular grids. Sheets packed by an atlas tool into irregular rectangles need that tool’s own data file; the custom splitter’s free guides can handle a few irregular rows by hand.

How to do it here

  1. Open the sheet. Drop the sprite sheet, browse for it, or paste it.
  2. Set the cell. Pick a common size or type the cell width and height; the overlay redraws every cell.
  3. Set margin and spacing. Type the border round the sheet and the gap between cells until every outline sits on a frame.
  4. Save the frames. Choose names and format, leave empty cells skipped, and save one ZIP with the optional JSON index.

Questions that come up

What is the difference between margin and spacing?
Margin is the border round the whole sheet, before the first cell on the left and above the first row. Spacing is the gap between two neighbouring cells. Packing tools write them as separate numbers, so they are separate fields here: a sheet with a 2-pixel border and 4 pixels between frames is margin 2, spacing 4. Across and down can differ.
My frames come out shifted by a few pixels.
The cell size, margin or spacing is off by the amount of the drift. If the first frame is right and the error grows towards the right edge, the spacing (or the cell width) is wrong; if every frame is off by the same amount, the margin is. The overlay on the sheet shows every cell before anything is written, so the fix is visible before the download.
What counts as an empty cell?
A cell where every single pixel has an alpha of 0 — fully transparent. One faint pixel of 1/255 is enough to keep the cell. Empty cells are crossed out on the overlay, counted in the status line, and listed in the JSON index under skippedEmpty, so the frame numbers of the cells that were kept do not silently shift.
Are the frames resized or smoothed?
No. Each frame is the exact pixels of its cell, copied with smoothing off at whole-pixel offsets, so pixel art keeps its hard edges. PNG and WebP keep transparency; JPEG has none, so its transparent areas are painted white and the page says so when JPEG is picked.
What happens to pixels that do not fill a whole cell?
They belong to no frame. A sprite sheet is drawn on a grid, so a partial cell at the right or bottom edge is padding, not a frame. The leftover in pixels is printed under the margin fields, which is also a quick check that the cell size is right: a correct setting usually leaves 0 or exactly the margin.
What does the JSON index contain?
The source file name and size, the cell, margin and spacing used, the grid, and one entry per written frame with its file name, index, row, column and its x, y, width and height on the sheet — enough for a game engine or a script to rebuild the atlas.
Is my sheet uploaded?
No. The sheet is decoded, scanned for empty cells and cut inside this tab; the archive is assembled in memory and saved straight to your downloads.
Illustration of a picture divided into tiles, for Sprite Sheet Splitter

Sprite Sheet Splitter