GIF to Sprite Sheet Converter — Free, In-Browser, No Upload

Make your own gif to sprite sheet
Drop a GIF, get a game-ready sprite sheet — choose columns, rows and FPS, keep transparency, download the PNG atlas. In your browser, nothing leaves your device.
A GIF to sprite sheet conversion sounds trivial until you do it by hand. A GIF is already a sequence of full frames with a palette and per-frame delays, so what you actually need is a tool that decodes each frame, composites transparency correctly, and lays those frames out on one PNG in a grid you can address with texture coordinates. Neta Studio's converter does that decode step locally on a canvas element, so your file stays in the browser and never touches a server. You drop a GIF, choose columns, rows and FPS, and download a single PNG atlas.
The hard parts are not the drawing. They are the palette, the timing, and the grid math. GIF stores transparency as an index into a color table, so a frame that looked clean in an image viewer can arrive at the canvas with a black or white matte once it is composited. Frame delays in a GIF are in hundredths of a second and often vary frame to frame, which is why a naive export produces a sheet that stutters. This page covers the settings that matter and the failure modes we hit while building the tool.
Convert a GIF to a sprite sheet
The converter is the first thing on the page: a drop zone, a frame preview strip, and four controls — columns, rows, FPS, and a toggle for preserving the alpha channel. When you drop a file, the browser creates an ImageBitmap per frame through the GIF decoder, draws each one onto an offscreen canvas at the source dimensions, and then blits them into the atlas canvas at computed cell positions. The source file is read with the File API and held in memory. No network request carrying your GIF is made.
Output is always a PNG. PNG gives you an 8-bit alpha channel, which is what you need for character work; JPEG would flatten every soft edge into a matte. If your GIF has no transparency, the atlas will still be RGBA and the unused alpha bytes cost only file size. If your GIF does use transparency, the decoder must request the full-with-disposal frame rather than a partial update, or moving elements will smear across the sheet.
Build the sheet to match how your engine samples it, not how it looks in a file browser. A 4x4 grid of 64x64 frames is a 256x256 texture and addresses frame n at column n mod 4, row floor(n / 4). Keep the sheet size a power of two when the target engine or shader atlas expects one; a 320x320 sheet will be padded or resampled on some paths and the sprite edges will soften.
01
Drop the GIF onto the converter. The frame count and source dimensions appear before you change any setting.
02
Set columns and rows to the grid you want. For a 24-frame animation, 6x4 is a common choice; a single row also works and is what VRChat needs.
03
Set FPS to the playback rate your game will use. This governs the nominal frame timing recorded for the sheet; the output is a still PNG, so the engine drives the actual rate.
04
Leave alpha on unless you are targeting a format without it. If your GIF shows a black background in the preview, the source has no transparent index and the black is real.
05
Download the PNG and check the dimensions against your target: width equals columns times frame width, height equals rows times frame height.

GIF to a sprite sheet for VRChat
VRChat's flipbook shader reads a texture as one horizontal strip, not a grid. If you hand it a 6x4 sheet, you get a strip of the first row repeated, because the UV math assumes every frame sits on the same row and the frame index only advances on the U axis. Set columns to your frame count and rows to 1. A 24-frame animation becomes a 24x1 sheet.
Make the strip's full width a power of two. A 24-frame strip of 64-pixel frames is 1536 pixels wide, which is not a power of two; the next size up that divides cleanly at 64 pixels is 2048, giving room for 32 frames. You can pad the unused cells with transparent pixels or with a duplicate of the last frame. Power-of-two matters because a non-PoT texture that goes through mipmap generation or compression on the upload path can shift sampling by half a texel, and a sprite that is one pixel wide will show it.
Key the alpha here, in the sheet, not in the shader. A cutout or alpha-test path in a shader is a rough tool; soft edges from a GIF's antialiased outline will either survive or vanish depending on the threshold, and the threshold is not something you want to tune per avatar. Export the PNG with real alpha and a premultiplied-safe edge, and the shader just samples it. Keep the loop pacing constant: VRChat's flipbook advances on a fixed time step, so if your source GIF had irregular per-frame delays, equalize them before export or the animation will run at a uniform rate that does not match the original timing.
For the full parameter list and the texture setup, see the flipbook texture guide.
GIF to a frame grid ("spreadsheet")
When people search for gif to spreadsheet, they almost never mean a .xlsx. They mean the frame grid: the frames laid out in rows and columns so each one is addressable by an index. The word gets used because a grid looks like a spreadsheet at a glance. This tool produces that grid, and the grid is the same thing as a sprite sheet — the difference is only in what you call it. What matters is that the layout is regular: fixed cell size, fixed columns, and a frame order that runs left to right, top to bottom.
The alternative people sometimes try is drawing frames one at a time in a pixel-art editor, layering onion skins until the animation looks right. That workflow is good for authored characters and terrible for a GIF you already have. A pixel editor will not read a GIF's per-frame delays, and importing 24 frames by hand into 24 layers loses the timing entirely. If your source is already an animation, converting the grid is the shorter path. The pixel-art tooling is worth using when you are authoring, not transcoding.
For hand-drawn frame work, the pixel art pages cover the drawing and palette side.
Frame size, grid and transparent backgrounds
Four things break most conversions. Each has a specific symptom.
GIF transparency dies in the palette. A GIF can use at most 256 colors and marks transparency as a palette index. When a frame is decoded with disposal method 2, the area that was transparent in one frame may be restored to the background color of a previous frame. The fix is to composite every frame against a transparent buffer, not against white. If your preview shows a black or gray shape around the sprite, that is the palette's background index, and it is now real pixels.
The last row is partial. If your frame count is 23 and you choose 6 columns, you get three full rows and a last row with five cells, not six. The atlas height still rounds up to the full row height. If your engine's flipbook math assumes a full grid and derives the frame index by dividing total frames by columns, it will read a blank cell at the end of the loop. Pad the sheet to a full rectangle with transparent cells, or reduce the columns so the count divides evenly.
Frame size must divide the sheet. If you extract a sub-rectangle of width 64 from a 320-wide sheet, you get five columns exactly. From a 330-wide sheet you get five columns and a 10-pixel remainder that is not a frame. Keep the sheet dimensions at frame size times columns, and both axes.
Off-by-one on the origin. Texture UV coordinates usually run from the bottom-left, while the frame grid is laid out from the top-left. If frame 0 renders as the last frame, your engine is inverting V. The sprite cell for column c, row r is at x = c * width, y = r * height in image space, and converting that to a flipped UV is one subtraction from 1.
- Grid controlsColumns, rows and FPS are explicit inputs. The atlas dimensions are computed from frame size times the grid, never guessed.
- Alpha preservedThe export is RGBA PNG. Transparent regions stay transparent, including the padding cells in a partial last row.
- Local decodeThe GIF is decoded in the browser. No upload step, no server-side queue, no wait for a round trip.
Where the sheet goes next
The export is the same PNG in every case; the engine differs in how it expects the texture to be sliced and what it does with alpha. Use this as the short reference.
For each target, export one sheet at the grid that target can read without a custom shader. If you are supporting two targets, export two sheets: a horizontal strip for VRChat and a grid for the engine. Re-exporting from the same GIF takes less time than writing the UV math to reconcile them.
| Target | Export |
|---|---|
| Unity | Grid sheet, power-of-two texture, Sprite Mode set to Multiple with grid slicing by cell size; filter mode Point for pixel art, Bilinear for smooth. Enable Alpha Is Transparency on the importer. |
| Godot | Grid or strip, loaded as an AtlasTexture or sliced with a SpriteFrames resource in AnimatedSprite2D. Set filter to Nearest for pixel work. Frame timing comes from the SpriteFrames sheet, not the PNG. |
| GameMaker | Grid sheet, imported as a sprite with the frame size set to your cell dimensions. The frame count must match the sheet exactly; GameMaker will not trim a partial last row for you. |
| VRChat | Single horizontal strip, power-of-two total width, columns equal to frame count, rows equal to 1. Alpha keyed into the PNG, uniform loop pacing. |
See your sheet animate in 3D
Most converters stop at the PNG and leave you to verify the result somewhere else. The 3D game builder keeps going: you can load a sheet onto a billboarded plane and watch it animate in a real scene, which is the only test that answers whether the grid and timing are right. Agent Sprite Forge is where a sprite becomes a character with a controller; the sprite is the character, and the 3D world is where it lives.
The Cyclops' Island is the playable demo of that idea — a small 3D scene you can move around in, built in the browser, using sprites as characters. Drop your own sheet in and the same rig that drives the demo frames will sample your atlas. If frame order is wrong, you see it immediately: the character walks backward, or snaps to a blank cell at the end of the loop. If the alpha is wrong, you see a hard rectangle around the body. Those are the same failures you would find in an engine, visible in about five seconds.
Try the playable Cyclops' Island scene and swap in your own atlas.
More free sprite tools
The converter is one piece. These three cover the rest of the sprite workflow on Neta Studio, and they run in the same browser session with the same local-file handling.
- Sprite sheet makerCombine individual frame images into a single atlas. Useful when your source frames are separate PNGs rather than one GIF, and you still need a regular grid.
- Sprite animatorPlay a sheet back on a timeline, adjust the frame rate, and check loop pacing without opening an engine. Catches off-by-one frame order before export.
- Sprite resource libraryReference sheets and notes on grid setup, engine import settings, and the transparency pitfalls that recur across formats.
Walk into the world it belongs to
A sprite is a character with nowhere to stand. The last step is the one nobody else offers: take the sheet you just built and put it in a world someone can walk around in — a small island, a planet, a rainy street corner. Every world on this site was made from one written description and published as a page you can play.
FAQ
Is there an ezgif alternative? +
Yes, if what you need is GIF to sprite sheet specifically. ezgif handles a wide range of format conversions; this tool does one job: decode a GIF, lay the frames out on a grid or strip, and export a PNG atlas with the alpha you chose. Nothing is uploaded, so there is no server queue.
Will transparency be preserved? +
Yes, if the source GIF actually uses a transparent palette index. The export is RGBA PNG. The common failure is the source: many GIFs have a solid background color rather than transparency, and that background will appear in the sheet as real pixels.
Why does my sprite sheet have a black background? +
The GIF's palette background index is black, or the frame was composited against the wrong buffer. GIF frames can be partial updates, so decoding without honoring the disposal method leaves previous-frame pixels in place. Recompose each frame against a transparent canvas before laying out the grid.
How do I pick columns and rows? +
Choose a column count that divides the frame count if you can, so there is no partial last row. For a 24-frame animation, 6x4 works. For VRChat, set columns to the frame count and rows to 1.
Can I set the frame rate in the sheet? +
The PNG is a still image and carries no timing. The FPS setting in the tool records the intended rate; your engine or shader drives the actual playback. VRChat's flipbook advances on a fixed step, so match your export rate to it.
Why is the animation stuttering after export? +
The source GIF probably had irregular per-frame delays in hundredths of a second, and the engine is advancing at a constant rate. Equalize the delays, or accept the uniform pacing and set the engine rate to the average.
Back to the 3D Game Builder
All 31 finished 3D worlds, games and scenes live on one page — every one of them playable.
Browse ready-made sprite sheets
Every asset in this library is a transparent, game-ready PNG with a recorded prompt — Sprite sheet resources and Free sprite sheets, tagged by action, style and subject. Free to browse and download.