Skip to content

Fix AI Pixel Art — Snap Generated Art to a Real Pixel Grid

Images from image generators look like pixel art until you zoom in: the "pixels" are uneven blocks with noisy colours and soft edges. The Studio's Cleanup panel measures the block size, rebuilds one clean pixel per block and limits the colours — and tells you plainly when it cannot find a trustworthy grid.

Drop a sprite, frames, a GIF or an .aseprite file to paint on — or an upscaled picture to clean up
Runs in your browser. Files are not uploaded.
Studio Pixel workspace, Cleanup panel: a CC0 image made by an image generator, measured as unsure; nothing is applied automatically
The real Studio with a CC0 asset (OpenGameArt).
Exports to
  • Palette filesMeasured· read back
  • .asepriteVerified· Aseprite 1.3.18
  • Engine bundlesVerified· Godot 4.7.2 · Unity 6000.5
  • Frame PNG · .nerulioPlain files

What it does

  • Edge tracking follows pseudo-pixels of uneven width: significant edges above the noise floor, the largest cell size whose cuts land on at least 97 % of the edge energy, and flat runs divided evenly. It is only used when the colours are noisy and the evidence agrees.
  • On simulated generated art with known originals it found the size within 1 px in 80 % of cases (exactly: 20 %), and with the background kept 70.3 % of pixels came out exact and 92.8 % within ΔE 0.02.
  • Seven real generated images were all judged unsure and left at their size, with the best candidate shown (about 3.3 px on one set of previews) so you can type it and apply it yourself.
  • Colour merge in Oklab, a colour limit, quantizing to the sprite palette, anti-alias fringe and stray-pixel removal, then a new sprite you can fix by hand with the pencil.

How to do it

  1. Drop the generated image on this page; it opens in the Pixel workspace.
  2. Press Measure in the Cleanup panel and read the verdict and its confidence.
  3. If it says unsure, zoom in on the grid, type the pixel size you see and set a colour limit.
  4. Preview, Apply as a new sprite, and retouch the pixels that still look wrong.

Engine exports and how each was checked

"Verified" means the exported files were loaded by the real engine or tool on real CC0 assets and the result was compared with the source. Anything that was not loaded is labelled as such.

TargetFilesCheck
.asepritelayers · blend · opacity · locked · indexed palette · frames · tagsVerified Aseprite 1.3.18The real Aseprite command line reopened the file as INDEXED with 2 layers, Multiply at opacity 160 and the locked layer not editable; the frames are pixel-identical.
Palette files.gpl · .pal · .hex · .ase · .act · .jsonMeasured read backEach format was written and read back identical; Aseprite's own .gpl, .pal, .hex and .act and a real Adobe .ase (16 colours) were read.
Engine bundlesGodot 4 · Unity 6 · Phaser 3/4 · PixiJS 8 … through Pack & ExportVerified Godot 4.7.2 · Unity 6000.5The sprite you drew is packed in Pack & Export; those engine files were loaded in each engine on real CC0 assets (47 of 49 runs pass; the 2 failures are a Phaser 3.90 bug the Phaser 3 preset avoids).
Frame PNG · .nerulioPNG-8 with the palette when an indexed frame fits it · project filePlain filesPlain files for any tool; no engine run is claimed for them.

Evidence

Cleanup benchmark, 69 CC0 cases with a known 1× original: the exact size found for 81 % (±1 px: 90 %) and 74.0 % of pixels exact with the background kept; the best competitor found 30 % of sizes (perfectPixel) and the best exact-pixel score was 44.6 % (unfake.js). An Aseprite-made ×4 nearest upscale came back 100 % exact and a ×3.78 bilinear resize 99.7 %, both with the size found automatically. A 1 px outline and a drop shadow matched Aseprite pixel for pixel (1846 and 705 px). .aseprite files written here reopen in Aseprite 1.3.18 as indexed, with their layers, blend mode and lock.

Limits

  • Not in the Pixel workspace (Aseprite has them): layer groups, linked cels, tilemap layers, reference layers, RotSprite and free rotation or scaling of a selection (only flips and 90°), gradient, spray, contour and text tools, custom brushes (square or round, 1–16 px), tiled drawing, Lua scripting and a command line.
  • The symmetry axis is typed, not dragged on the canvas. On touch there is no right button, so the background colour needs the swap button or X.
  • Cleanup: JPEG input comes back close (84 % of pixels within ΔE 0.02 with the background kept) but rarely exact (12 %); simulated generated art gets the exact size 20 % of the time (±1 px: 80 %); none of 7 real generated images was snapped automatically — you type the pixel size the panel suggests.
  • Indexed conversion picks the nearest colour in Oklab, not Aseprite's RGB distance: 68 % of the test sprite's pixels got a different (perceptually closer) pick. The Lospec search is the only network request and asks first.

Questions

Does it fix "mixels" (pixels of different sizes)?

Often, not always. Uneven pseudo-pixels are what edge tracking is for, and on simulated generated art the size came out within 1 px in 80 % of cases. When the evidence is weak the panel says unsure and changes nothing until you type a size.

Is anything generated or redrawn?

No. Each output pixel is the most common colour of its cell (or its Oklab medoid), and the palette comes from the picture or from a palette you choose. The original image is never modified; the result is a new sprite.

What about palette locking and anti-alias removal across many frames?

The Cleanup panel has a colour limit and palette quantizing. The classic Pixel Lab also locks several frames to one palette and snaps anti-aliased edges; its page is linked below.

Is it free, and do I need an account?

Everything on these pages is free and works without an account. There is no watermark and no export that is held back.

Are my sprites uploaded?

No. The Studio decodes, packs and exports in this browser tab. Projects are autosaved in the browser (IndexedDB) and can be saved as a .nerulio file.

Does it need Aseprite or an engine plugin installed?

No. .aseprite files are read and written in the browser, and each engine bundle carries what that engine needs (for Godot, the import settings and scene; for Unity and the Godot TileSet, a small editor script).