Pixel and bitmap editor
Draw sprites, tiles, and screens with real hardware palettes — Amiga, C64, NES, Game Boy, ZX Spectrum, Atari 2600, PICO-8, and 1-bit OLEDs — then export C arrays, bitplanes, CHR tiles, sprite data, PNG, or animated GIF.
Added
How to use it
Pick a preset first: it sets the canvas size, the palette, the pixel shape, and the best export for that hardware. Everything is paletted — you paint with palette indices — and colour 0 is the background (transparent for sprite presets).
-
Drawing: pencil (B), eraser (E), line (L), rectangle ®, ellipse (O), flood fill (G), colour picker (I), and select (M). Left button paints the primary colour, right button the secondary; X swaps them and
[]step through the palette. Fill shapes makes rectangles and ellipses solid; Mirror draws symmetrically. -
Selection: drag to select, drag inside to move, arrow keys nudge (Shift for 8 px), ⌘/Ctrl C, X, V copy, cut, and paste, Delete clears, Esc drops it. Flip (⇧H, ⇧V) and rotate (⇧R) work on the selection, or on the whole frame when nothing is selected.
-
View: + and − (or ⌘/Ctrl + wheel) zoom, 0 fits, # toggles the pixel grid; the tile grid shows 8×8, 16×16, or C64 sprite boundaries. Pixel aspect shows C64 multicolour and Amiga hires pixels at their true shape.
-
Animation: add, duplicate, reorder, and delete frames;
,and.step between them; Onion skin shows the previous frame; the preview plays at the chosen fps, or tiles the current frame 3×3 to check that a tile repeats seamlessly. -
Import: bring in a PNG or JPG — it is quantised to the current palette with optional Floyd–Steinberg or ordered dithering — or paste a C array / XBM / hex bytes to turn a 1-bit bitmap back into pixels.
-
Palettes: fixed hardware palettes; NES and Atari palettes chosen from the console’s master palette; Amiga colours with 4-bit R, G, B sliders and 1–5 bitplanes; custom palettes with import and export (GIMP
.gpl, JASC.pal, hex). -
Your work is saved in this browser automatically; Save downloads a project file you can Open later.
| Export | Layout | Suits |
|---|---|---|
C array — 1bpp rows |
1 bit per pixel, rows padded to bytes, MSB = leftmost |
Adafruit GFX |
XBM |
1 bit per pixel, LSB = leftmost |
U8g2 |
C array — SSD1306 pages |
8-row pages, one byte per column, bit 0 = top |
SSD1306 / SH1106 OLEDs written directly, Nokia 5110 |
C array — RGB565 |
16 bits per pixel, optional byte swap |
TFT_eSPI |
C array — indices |
One byte per pixel plus the palette |
Your own renderer, PICO-8 style engines |
Amiga bitplanes |
16-bit words per plane, interleaved or not |
Blitter bobs and screens (Devpac / vasm |
Amiga hardware sprite |
POS, CTL, then DATA/DATB per line, then 0,0 |
16-pixel 3-colour hardware sprites (chip RAM) |
Amiga palette |
|
Setting the palette from the copper |
C64 sprites |
63 bytes + padding per sprite; multicolour uses bit pairs |
VIC-II sprites: BASIC |
NES CHR |
16 bytes per 8×8 tile: plane 0 then plane 1 |
Pattern tables ( |
Game Boy 2bpp |
16 bytes per tile: low byte then high byte per row |
RGBDS |
ZX Spectrum |
Bitmap bytes (row-major or screen order) + attributes |
Spectrum screens and sprites; clashes are flagged |
Atari 2600 |
One byte per line per 8-pixel player, colour table |
DASM |
PNG, sprite sheet, GIF |
Scaled, with the pixel aspect applied |
Anything else |
The Atari 2600 and VGA palettes are close approximations; every other palette is the standard published one.
⛶ Full screen (or F) gives the drawing the whole screen — the browser’s full screen where it is
allowed, otherwise a full-window layer (iPhone) — and Fit zooms to it; ◫ Panels hides the
palette column and the export panel. Escape leaves.
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser; nothing you type leaves this page.