How to use it
- Drop an image (PNG, JPG, WebP, GIF or BMP) on the page or paste it with Ctrl+V. The preview appears at once with the default settings: 8-pixel blocks and the Game Boy palette with Floyd–Steinberg dithering.
- Set the resolution by pixel size (source pixels per block) or by output width (blocks across). Average sampling blends each block’s pixels; Nearest picks one pixel and keeps hard edges.
- Choose a palette. “Reduce to N colours” builds one from the picture; the classic systems use their documented colour sets; “Custom palette” lets you add hex colours, pick with the colour well or extract the most used colours from the image.
- Tune dithering and its strength, colour matching, brightness, contrast, saturation and the outline threshold. Use “Before / after” and the split slider to compare, and the pixel grid to see the blocks.
- Download the PNG (native size, one pixel per block) or the ×N version for sharing; download the .gpl palette or copy the hex list for your pixel editor; copy the settings link to reproduce the look on another image.
Example
A 1200 × 800 photo with pixel size 8 gives 150 × 100 blocks: every block averages 64 source pixels. With the Game Boy palette each block becomes one of the four DMG greens – the nearest one by Lab distance – and Floyd–Steinberg dithering spreads each block’s rounding error to its neighbours so the sky still reads as a gradient. The native download is a 150 × 100 px PNG; “Download ×8” produces a 1200 × 800 px file in which every pixel-art pixel is a crisp 8 × 8 square, and the .gpl file lists the four greens (0f380f, 306230, 8bac0f, 9bbc0f).
How the conversion works
blocks across = ⌊source width ÷ pixel size⌋ (or the chosen output width)
block colour = average of the source pixels it covers (Nearest: the pixel at its origin)
adjust = (c × brightness − 128) × contrast + 128, then mix with luma by saturation
nearest colour = argmin over the palette of ΔE (CIE76 Lab), redmean-weighted RGB or plain RGB distance
error diffusion = (pixel − chosen) × strength spread 7/16 3/16 5/16 1/16 (Floyd–Steinberg) or 6 × 1/8 (Atkinson)
ordered = colour + (Bayer[y mod n][x mod n] + ½) / n² − ½) × spread × strength
outline = |Δ right| + |Δ below| (summed over R, G, B) > threshold → darkest palette colourThe working copy is at most 2048 px on the long side (larger images are reduced first, with a note). “Reduce to N colours” runs median cut on the pixelated image and refines the palette with three k-means passes, so the palette fits the picture at its final resolution. The classic system palettes are plain colour lists: the Game Boy’s four DMG shades, the NES 2C02 palette (54 distinct colours), the C64 “Pepto” colours, ZX Spectrum normal and bright levels, IBM CGA/EGA RGBI, PICO-8, 16 common Commodore Plus/4 and Apple II colours and the 128-entry Atari 2600 NTSC palette. Per-cell attribute limits (two colours per 8 × 8 cell on the C64, sub-palettes on the NES) are not enforced here – the Sprite Sheet Generator has those modes.
Dither strength scales the diffused error (or the ordered pattern’s amplitude): 100 % is the textbook algorithm, 0 % is plain nearest-colour mapping. Transparent pixels in the source stay transparent and never receive diffused error. The outline pass runs on the pixelated, adjusted image before colour mapping; a lower threshold produces more lines.
Sources: Floyd & Steinberg (1976), Atkinson and Bayer ordered dithering, NESdev wiki – PPU palettes, Pepto – Commodore 64 colour palette, DawnBringer 16 and ENDESGA 32 palettes (Lospec), PICO-8 manual – palette.
Questions
- What is the difference between pixelating an image and making pixel art?
- Pixelating only lowers the resolution (big blocks, original colours) – choose “Original colours” for that, for example to blur a face or a licence plate. Pixel art also limits the colours to a small palette and usually dithers; that is what the retro palettes and the automatic palette do.
- Why does the download look tiny?
- The native PNG has one pixel per block, which is what game engines and pixel editors expect. For posting or printing use “Download ×N”: the same image scaled with nearest-neighbour sampling, so every block stays a crisp square. ×8 of a 150 × 100 result is 1200 × 800 px.
- Can I get a transparent background?
- Transparency is kept where the source already has it (a PNG with a transparent background stays transparent). The converter does not remove backgrounds itself – run the Background Remover first and bring the result here.
- Which palette file formats are exported?
- A GIMP .gpl file, which Aseprite, Krita, Inkscape, LibreSprite and Pixelorama import directly, and a plain hex list (one #rrggbb per line) for everything else. The list contains the colours actually used in the result, so an “auto palette” export matches the picture.