QR Labs · Article

Why most “art” QR codes fail in print, and how to make one that actually scans

AI generated QR codes look great on a monitor and fail on a poster. Here is how we approached the design problem of weaving a real photograph into a working QR code without ruining the portrait or breaking the scan.

Every designer and marketer has felt the same frustration with QR codes. You spend hours perfecting the typography, layout and photography of a poster, badge or campaign card, only to slap a harsh black and white barcode in the corner like a price tag.

Over the last couple of years, two workarounds became popular: AI art QR codes and halftone dot QR codes. Both look impressive in a screenshot on X, and both regularly become a nightmare the moment you send them to a commercial printer.

When we set out to build the Photo QR Code tool on QR Code Spot, we didn't want another novelty generator that only scans on a bright monitor at arm's length. We approached it as a real design and print problem: what actually makes a visual QR code fail in the wild, and what does the experience need to look like so anyone can make a reliable one in thirty seconds?

Vermeer's Girl with a Pearl Earring as a working full colour QR code
Vermeer's Girl with a Pearl Earring as a full colour photo QR code. It passed all 8 scan tests.

Problem 1: the “square on the eye” portrait problem

If you drop a portrait into a traditional halftone QR generator, the tool lays a fixed grid over the face. Every QR code needs three large corner squares (finder patterns) and smaller alignment squares inside to orient the camera, and one of those solid blocks often lands right on a person's eye or mouth.

Our brains are wired to read faces first. You can dither a jacket or a background into coarse dots and still recognize the person instantly, but if a dark alignment square sits over a pupil, the portrait looks broken.

The fix: framing that knows where the face is

Instead of making people open Photoshop, nudge their crop by two millimeters, upload again and hope the grid misses the eyes, we built face awareness directly into the canvas:

Shifting has a limit, though. Every QR code of 45 × 45 squares or more has an alignment square in its exact centre, and when a face fills the middle of the picture, as it does in most portraits and ID photos, no amount of shifting gets it out of the way. So when that square would still land on the face, the tool switches to 41 × 41 squares, the largest size with no centre square at all, and tells you it did. The only fixed squares left are in the corners, well away from the face.

Faces don't have to look straight at the camera either. A face turned to the side, like the one in Vermeer's painting below, is found and protected too.

Abraham Lincoln's portrait as a full colour QR code with no fixed square on the face
A face that fills the middle: the code switches to 41 × 41 squares, so nothing sits on it.
Girl with a Pearl Earring as a QR code made of round dots
A face turned to the side, found and framed so the eyes and lips stay clear (shown with round dots).

Problem 2: why short links make clearer pictures

Most people assume the visual clutter of a QR code depends only on the image filters you apply. In reality, it depends on how much text you make the code store.

When you paste a long website link with tracking parameters, almost every square in the grid is locked down by that text. When the link is tiny, a large part of the grid is just filler space.

Instead of filling that spare space with random noise that fights your photograph, the engine arranges those spare squares so they match the light and dark shades of your picture. That way, the code doesn't have to use up its built in error correction just to make the photo visible.

A portrait of Abraham Lincoln as a black and white QR code holding a long link
A long link with tracking parameters: most squares are fixed by the text, and the face disappears.
The same Lincoln portrait as a black and white QR code holding a short link
The same photo with a short link: the spare squares follow the picture, so the face comes through.

To make this effortless, we added a single button: “Shorten it for a clearer picture” (free account needed).

With one click, it turns a long URL into a short QRSX.NET link of just 3 to 5 characters, in capitals. QR codes have a compact mode for capital letters and digits that uses about 30% fewer bits per character, and these short links fit it entirely. The link takes up almost no room, which gives the image engine far more freedom to render smooth tones. It's also an editable code in your account, so you can change where it goes later and see how often it's scanned.

Problem 3: a phone camera is not a laser scanner

Why do so many dithered QR codes work on a laptop screen during a design review, then fail when printed on a coffee cup or lanyard?

Optical blur.

In a photo QR code, every grid square is split into a 3×3 block of tiny cells. Only the center cell holds the code's actual black or white data. The outer eight cells paint the photo. On a sharp screen, that center dot is easy to read.

In the real world, phone cameras are often slightly out of focus, tilted at an angle or dealing with paper glare. When the lens blurs slightly, the eight photo cells around the center bleed into it. If eight bright photo dots surround one dark code dot, the blur averages them into light gray, and the camera fails to read the code.

The fix: an 8 test safety gate

We decided that nobody should have to guess whether their design will scan, or print a test sheet just to find out it's broken.

Every time you move a slider or change a style, the browser quietly runs 8 simulated phone camera tests: small print sizes, out of focus blur, harsh glare and camera noise, each read by two separate scanner engines.

If a test fails, Blur Safety steps in automatically, in up to 7 progressive stages. It nudges the picture cells around each code dot toward the code's shade, and as a last resort uses bigger code dots, until all 8 tests pass. If no stage passes, the Download button stays locked, so you can't export a code that fails the tests.

Built for print designers (and your privacy)

Different print surfaces call for different visual treatments, so there are four rendering styles, all held to the same 8 test gate:

And for any style, the Round dots option turns the photo and the code into one even grid of circles, with the corner squares drawn as bullseye rings.

Abraham Lincoln's portrait as a one ink black halftone QR code with ring corners
Halftone print: Lincoln's 1863 portrait in one black ink, like a newspaper photo.

The page also tells you the smallest safe print size for your exact code, since round dots, halftones and extra detail need a little more room.

Photo QR is a free beta, and free downloads carry a small QR Code Spot badge. For print work, paid plans download 2400 px PNGs without the badge, plus true SVG vectors for every style except full colour with square dots.

Your photo is never uploaded. Whether you're working with an official portrait, a family wedding photo or an unreleased brand campaign, the whole image process runs locally inside your browser tab.

The engine builds on two published techniques: the halftone QR method of Chu et al. (2013), and Russ Cox's QArt approach to choosing a code's spare bits.

Photo QR was built with the help of AI coding tools, which made it possible to turn ideas from research papers into a working, tested tool quickly.

Try it with your own photo

You can test it right now with your own portrait, or try it with three public domain paintings from The Met (The Great Wave and two Van Goghs) built right into the page.

The example codes on this page were made with the tool and passed its 8 scan tests; they open qrcodespot.com. Pictures: Girl with a Pearl Earring by Johannes Vermeer, c. 1665, Mauritshuis, The Hague (public domain). Abraham Lincoln, photograph by Alexander Gardner, 1863, Library of Congress (public domain).

Make a photo QR code

Free while it's in beta. Your photo stays in your browser.