DevTools Logo

Pixel Art Sprite Studio

About this tool

Pixel Art Sprite Studio is a grid-based pixel editor purpose-built for game sprites: a square canvas from 8x8 up to 64x64, five curated retro palettes (PICO-8, Game Boy, NES, C64, Endesga-32) with their canonical hex values, and a pencil/eraser/flood-fill/ordered-dither/eyedropper toolset with horizontal, vertical and quad symmetry for fast, mirrored character and tile work.

Each frame supports multiple layers with per-layer visibility and opacity, composited with standard Porter-Duff alpha blending, so you can sketch a silhouette on one layer and shade or add an outline on another without disturbing the base art.

The frame timeline turns a single sprite into an animation: add, duplicate and reorder frames, set a per-frame duration, and toggle onion skinning to see the previous frame ghosted behind the one you're editing.

Export covers both static and animated use: a single-frame PNG, a full animated PNG (APNG), an animated GIF, a horizontal sprite-sheet PNG with matching atlas JSON (Pixi/Phaser's native TexturePacker format, plus documented region lists for Godot and Unity import scripts), or a CSS steps() snippet for background-position sprite animation.

Projects can be saved and reloaded as JSON (run-length encoded per layer) so you can pick up an in-progress sprite later without re-drawing it.

How to use

  1. Pick a size and palette

    Choose a grid size (creates a fresh sprite) and a retro palette from the toolbar; click a swatch to set the primary color, right-click to set the secondary.

  2. Draw

    Select Pencil, Eraser, Fill, Dither or Eyedropper, optionally turn on symmetry, then click or drag on the canvas.

  3. Dither a gradient

    Pick the Dither tool, set primary/secondary colors and density, then click a region to flood-fill it with an ordered Bayer dither blend.

  4. Layer your art

    Add layers in the Layers panel, adjust each layer's opacity or visibility, and reorder them to control what's on top.

  5. Animate

    Add frames in the timeline, set each frame's duration, enable onion skinning to trace the previous frame, and press Play to preview.

  6. Export

    Download a PNG, APNG, GIF, sprite-sheet PNG, atlas JSON for your engine, or a CSS steps() snippet from the Export panel.

Use cases

Game jam sprites

Draw and animate character or item sprites in the browser, then export a sheet + atlas JSON straight into Pixi, Phaser, Godot or Unity.

Retro-style icons and avatars

Use a locked palette like PICO-8 or Game Boy to keep icon sets visually consistent with a project's retro art direction.

Sprite sheet prototyping

Block out an animation's frame count and timing quickly, preview it with Play, and iterate before committing to final art.

CSS sprite animations

Export the steps() snippet to drive a lightweight background-position animation for web UI without a GIF or video file.

Common mistakes

Mistake:Expecting the grid-size selector to resize the current sprite

Fix:Changing the size starts a brand-new blank sprite rather than scaling existing art — pick your size before you start drawing, or export/save first.

Mistake:Using Fill on a layer with semi-transparent pixels expecting it to blend

Fix:Flood fill and dither fill both match the exact source color at the clicked pixel (including null/transparent) and replace it outright — they don't blend into existing colors.

Mistake:Assuming Godot or Unity load the atlas JSON natively

Fix:Only the Pixi/Phaser export is a format either engine loads directly (TexturePacker JSON Hash); the Godot and Unity exports are documented region lists meant to drive a short import script.

Mistake:Forgetting a hidden layer still exists in Save/Load

Fix:Hidden layers are skipped when compositing exports (PNG/GIF/APNG/atlas) but are preserved in the saved project JSON, so toggling visibility back on later still works.

Frequently asked questions

References & standards