How to Make Pixel Art From a Photo Without It Reading as Fake
Real pixel art from a photo is grid-first, edge-aware, and deliberately dithered — not a blurry downscale with a filter on top. Exact block-size, palette, and…
01/ ARTICLE
Why does pixel art from a photo look fake?
Most "photo to pixel art" results online are a blurry downscale wearing a filter. You can tell immediately, even before you know why: pixels drift off a uniform grid instead of snapping to fixed cells, edges stay soft where they should be hard, and in anything animated the grid and palette shift from frame to frame. That drift is the tell. Not the color choices, not the subject — the drift.
The off-grid tell. Real pixel art sits on a uniform cell grid: every block the same size, aligned to the same lattice. Fake pixel art skips that step entirely. Pixels land at irregular sizes and positions because nothing ever forced them onto a grid in the first place. It's the giveaway a viewer — or a trained detector — picks up on first.
Why naive resize causes it. Just resize a photo down and call it done, and you'll hit one of two failures. Nearest-neighbor downscaling grabs one source pixel per output cell and discards everything else, producing jagged, misaligned "stair-step" edges. Bilinear or bicubic downscaling avoids that jaggedness by blending adjacent pixels — which trades it for the opposite problem, a soft, out-of-focus blur with no hard block boundaries anywhere. Neither path produces clean, uniform blocks unless an explicit target grid is driving the whole conversion.
Why AI-generated "pixel art" fails specifically. Diffusion models output a smooth, continuous image. There's no discrete grid underneath for the result to snap to, even when the prompt asks for pixel art directly. That's why grid-repair tools exist as their own category: Canny edge detection to find likely pixel boundaries, a Hough transform to find candidate grid lines, clustering those lines to infer true grid spacing, then remapping every cell to a single flat color. A real, documented repair pipeline for a real, common failure — which tells you how systemic the problem actually is. The Obra Dinn look works for the same reason a real grid works: every pixel commits to one value, nothing left soft in between.
What is the grid-first method for turning a photo into pixel art?
Pixel art from a photo is a grid-aligned image where every cell holds exactly one flat color, drawn from a small fixed palette. That's the whole definition. The block alignment and the flat color-per-cell are what separate it from a low-resolution photo.
Pick the block size before you touch color. Order of operations matters more than any single setting here. Choose your output pixel-cell size first — palette reduction, dithering, edge handling all operate on that fixed grid downstream. Resize-first workflows fail because there's no grid yet for the color step to respect. Grid-first workflows can't produce off-grid pixels, full stop, because the grid was locked before color ever entered the pipeline.
The three levers that actually matter. One widely used photo-to-pixel converter exposes exactly three tunable parameters, and documents that all three together — not a single downscale step — separate real pixel art from a blurry reduction:
pixel_size— the block dimensions (16px is a common starting default). This is the grid itself.kernel_size— controls smooth color transition across regions. Larger values blend more between blocks; smaller values produce harder, more separated blocks.edge_thresh— governs edge line rendering. Lower thresholds push more black line into edge regions, sharpening the read of the silhouette.
A workable starting point on an 800–1200px source: 12px blocks keep facial or object detail recognizable without collapsing into a blurry-looking downscale. Drop below about 6px and you lose the deliberate blockiness entirely. Push past 24px and you start losing the subject itself.
Edge-aware downsampling beats flat averaging. A naive downscale averages every pixel inside a block equally, erasing fine silhouette detail — whiskers, fur edges, thin structural lines. A better approach analyzes the gradient direction inside each tile before collapsing it. One implementation divides the image into 3×3 tiles, uses a Sobel operator to find the dominant edge orientation in each tile, then collapses the tile to a single pixel based on that gradient's magnitude and angle rather than a flat color average — an approach borrowed straight from classical computer-vision edge detection. The payoff: silhouette detail a flat-average downscale would have thrown away.
How do you reduce the color palette without losing detail?
Palette size and grid size work together, not separately. A tight grid with an uncontrolled palette still reads as noisy, because too many near-duplicate colors compete inside a small number of blocks. A generous palette with a sloppy grid reads as a filtered photo, not pixel art. Neither half fixes the other.
Why k-means isn't the best default. The obvious move for palette reduction is k-means clustering, but it has a specific weakness: small, rare-but-important colors get absorbed into larger, nearby dominant clusters and vanish. One pixel-art library skips k-means on purpose and uses a Bayesian Gaussian Mixture model instead, because tied Gaussians give a better distance estimate than raw Euclidean distance and let smaller color centroids survive rather than getting swallowed by whatever color dominates the frame. That matters most on subjects with a small but important accent — a colored eye, a highlight, a logo — that k-means would flatten right out of existence.
Palette count is a creative choice as much as a technical one. Lower counts, 4 to 8 colors, read as retro-console and mechanical. Higher counts, 16 to 32, start reading as "a reduced photo" instead of pixel art proper — there's enough color information left for the eye to reconstruct a photographic gradient rather than see discrete flat cells. For most single-subject photo conversions, 8 colors is a solid starting palette: enough range to hold skin tones or fur texture, tight enough to force real commitment at every cell.
Which dithering algorithm should you use for pixel art?
Dithering decides how a limited palette approximates colors it doesn't actually have, by mixing available colors at the pixel level so the eye blends them at a distance. The algorithm you pick changes the entire read of the final image — independent of block size, independent of palette count.
| Algorithm | Type | Read | Best for |
|---|---|---|---|
| Floyd-Steinberg | Error diffusion | Organic, photographic | Photos with gradients, skin tones |
| Atkinson | Error diffusion (lighter) | Classic 1-bit Mac look, more pure background | High-contrast portraits, UI mockups |
| Ordered / Bayer (2×2, 4×4) | Matrix-based | Mechanical, retro-console | Flat color areas, game-asset style |
| Clustered 4×4 | Matrix-based | Print-safe, screen-like dot pattern | Riso and screen-print prep |
Error-diffusion methods like Floyd-Steinberg and Atkinson scatter each pixel's quantization error into its neighbors as they go, which produces a softer, more organic texture — it reads as photographic. Atkinson diffuses less error than Floyd-Steinberg and leaves more pure background, and that's exactly why it's tied to the classic 1-bit Macintosh look rather than a denser, noisier dither. Ordered dithering skips error diffusion altogether and applies a fixed repeating threshold pattern (a Bayer matrix), producing a more mechanical, structured look — closer to what original console or arcade hardware actually rendered. One open-source pixel-art editor exposes all six variants — Floyd-Steinberg, 2×2 Bayer, 4×4 Bayer, Ordered, Clustered 4×4, and Atkinson — with a 0–100 strength slider, which is the practical range worth testing on a given source photo before you commit to one.
Want the deeper breakdown on a single algorithm? See what makes Atkinson dithering work at the settings level or the fuller Floyd-Steinberg vs ordered dithering comparison.
Before and after: converting a real photo to pixel art
Here's the full pipeline, run on one source photo, every setting logged so it's reproducible.
Source: a straight-on snow leopard photograph, no existing filters, natural light.
- Grid. Block size set to 12px. At this source resolution, that's tight enough to keep whisker and eye detail readable, loose enough to commit fully to visible blocks instead of a soft downscale.
- Edge handling. Edge-aware tiling (Sobel-based gradient collapse) instead of flat block averaging — this is what keeps the whisker lines and ear outline intact instead of smearing them into the surrounding fur.
- Palette. Reduced to 8 colors using mixture-model reduction rather than k-means, specifically so the amber eye color stays its own centroid instead of collapsing into the surrounding fur tones.
- Dither. Floyd-Steinberg at full strength, chosen over Atkinson here because the fur texture benefits from denser error diffusion. Atkinson's lighter diffusion left too much flat background across the coat.
The failure mode each step avoids: skip the grid step and you get off-grid, jagged or blurry pixels no matter how good the palette is. Skip edge-aware tiling and the whisker detail vanishes into a flat average. Use k-means instead of a mixture model and the eye color gets swallowed by the surrounding fur. Pick the wrong dither algorithm for the subject and you land on either a flat, noisy mess or a coat that looks under-detailed. None of these are palette problems or grid problems in isolation — they compound. That's why the pipeline has to run in this order, not get patched afterward.
No access to a dedicated conversion tool? The honest manual method in Photoshop walks through the same grid-and-quantize logic by hand. It's slower, and it demands more manual grid discipline — but it's a real technique, not a shortcut.
Run this exact pipeline — 12px grid, edge-aware tiling, 8-color mixture-model palette, Floyd-Steinberg dither — on your own photo in kott's pixel art studio, settings preloaded.
Frequently Asked Questions
Why does AI-generated pixel art always look fake?
Diffusion models output a smooth, continuous image with no underlying discrete grid, so even when prompted for a pixel-art style the result lacks a true pixel grid to snap to. The giveaways are consistent: pixels drift off a uniform grid, edges stay soft instead of snapping to hard block boundaries, and in animation the grid and palette shift frame to frame, producing visible jitter. Post-hoc fixers exist specifically to repair this — detecting edges, inferring a grid from line spacing, then remapping each cell to one flat color.
What pixel block size should I use for a photo?
There's no single right number — it depends on source resolution and how abstracted you want the result. As a starting point, an 800-1200px source with an 8-16px block size keeps recognizable detail while still reading as unmistakably blocky; going below 6px tends to look like a blurry downscale rather than pixel art, and above 24px starts destroying facial or object detail entirely. Test two or three block sizes on the same source before committing — the right size is the one where the silhouette still reads at a glance.
Should I use error-diffusion or ordered dithering for pixel art?
It depends on the look you're chasing. Error-diffusion methods like Floyd-Steinberg and Atkinson scatter quantization error into neighboring pixels, producing a softer, more organic, photographic texture. Ordered dithering (Bayer matrices) applies a fixed repeating pattern instead, which reads as more mechanical and retro-console — closer to what you'd see on original hardware. Atkinson specifically leaves more pure background than Floyd-Steinberg, which is why it's associated with the classic 1-bit Macintosh look.
Does palette size matter more than pixel size?
They matter together, not separately. A tight grid with an uncontrolled palette still reads as noisy because too many similar colors compete inside a small number of blocks. A generous palette with a sloppy grid reads as a filtered photo, not pixel art. Reduce the palette using a method that preserves rare-but-important colors — a Gaussian mixture model beats plain k-means here — at the same time you lock the grid; doing them as separate, sequential passes is what produces muddy mid-tones.
Conclusion
Real pixel art from a photo is grid-first, edge-aware, and deliberately dithered — never a blurry downscale with a filter slapped on top. Lock the block size before touching color. Reduce the palette with a method that protects rare colors. Pick the dither algorithm for the read you actually want, not by default. The same grid-and-palette discipline carries straight over into animated and live pixel-art work, where a single off-grid frame — or a palette that drifts between frames — is the fastest way to break the illusion in motion.
02/ OUT
Every setting described above is a real control. Open your own image and sweep it.
All journal entries