Skip to the tool
CALCPARK

Pixel Art Converter

Turn any photo into pixel art in your browser: set the pixel size, pick from 20+ retro palettes (Game Boy, NES, C64, PICO-8), add dithering and outlines, export PNG.

Files stay on your device
Loading the tool…

How to use it

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 colour

The 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.