Which photo works inside a QR code
A dithered QR code gives you roughly a 300-pixel canvas with a code fighting for the same space. Most photographs do not survive that. A few look better than the original. The difference is almost entirely decided before you upload, by what the picture is and how it is cropped.
The size you are really working with
A short link produces a code of about 29×29 modules. At nine pixels per module that is a 261-pixel square, and a chunk of it is already spoken for by the corner patterns and by every module the code forces solid. Whatever you upload is going to be reduced to a few hundred pixels of two-colour speckle. Plan for a poster stamp, not a print. This is the single most useful mental shift: a photograph that looks rich at two thousand pixels wide has to make its point in about thirty modules across, and each module can only carry one rough tone. The finder squares in three corners take a 7×7 block each plus their margins, which removes the corners from play; the alignment square and the timing lines remove a little more. What is left is a roughly square field, a bit smaller than the code, in which the picture must be recognisable at the resolution of a coarse newspaper halftone. Pictures that were designed to be read that way — logos, icons, posters — tend to survive; pictures that depend on detail tend not to.
Real contrast, not high saturation
Dithering only sees brightness. A vivid red-on-blue image with both at the same lightness turns into uniform mush, because to the dither they are the same grey. Convert your candidate to greyscale before you decide; if it looks flat in grey, it will look flat in the code. Images with an actual dark-to-light range — a lit face against a dark background, a black logo on white — carry. The reason is mechanical rather than aesthetic: the dither reproduces tone as dot density, so a picture whose tones are all near the middle becomes an even field of half-density dots, and an even field of dots is a chequerboard. A chequerboard is the one texture that genuinely competes with the code's own modules, because it has energy at exactly the scale a scanner is looking for. The studio measures the light-to-dark range of an uploaded picture and warns when there is almost none; if it tells you that, believe it. That is not an opinion about your photo, it is a report that the dither will have nothing to work with and the code will be weaker for it.
One subject, filling the frame, in big shapes
The code is a square and the image is cropped to fill it. A wide landscape loses its sides; a group photo becomes six unreadable smudges. Crop to a single subject that already fills most of the frame before uploading, rather than hoping the automatic crop guesses right. Then think in shapes, not details: anything smaller than about three modules across simply is not there. Text disappears. Hair strands, fabric weave, foliage — all of it becomes noise indistinguishable from the code's own speckle. Silhouettes, strong shadows and large flat masses are what read. Faces are the most reliable subject because we recognise them from very little information — two dark eye sockets, a mouth line, a jaw edge. But that only holds if the face fills the square. A head-and-shoulders shot works; a full-body shot puts the face across four modules and it is gone. A tight portrait lit from one side is the best case and reads as a face immediately; a solid logo or wordmark on a plain ground is excellent and stays legible; a single product on a clean background is good with a contrast boost; a close-cropped animal works for the same reason a face does. Landscapes, cityscapes and crowds read as texture, and a flat, evenly lit, low-contrast image is the worst case.
Prepare the picture first
Crop square, with the subject filling most of the frame. Push contrast further than looks right on screen — the dither eats midtones, and a picture that looks slightly harsh as a photograph comes out balanced as a code. If the background is busy, darken it or blank it out; the code will use that area anyway, and a plain field behind the subject gives the modules somewhere to sit without fighting a texture. Do not pre-posterise or pre-dither: the generator needs the greys to distribute error properly, and an image that is already two-colour gives the error diffusion nothing to diffuse, so the forced modules stand out as blobs instead of hiding in the grain. Upload a JPEG or PNG; the studio rejects files it cannot read. Expect the export to be PNG only, since a photo code is made of pixels and cannot be expressed as vector shapes, and expect it to come out at a whole multiple of the module grid so the modules stay square. If you had a logo on the code, it is removed when a photo is added, because the photo fills the whole square.
And the link matters as much as the photo
A long destination makes the code denser, and a denser code leaves the picture less room. Every extra character in the encoded text pushes the code towards a higher version with more, smaller modules in the same square; at nine pixels per module the square grows, but the share of it that the code forces solid grows with it, and the photograph is squeezed between. The studio warns when the destination is long enough to crowd out the picture. If the photo matters, point the code at a short redirect link and change the destination behind it later — which is what dynamic codes are for anyway. That has a second benefit for artistic codes specifically: a photo code is the last thing you want to regenerate and reprint, because the image, the balance and the print test all have to be redone. With a dynamic code the picture is settled once and the destination can move as often as it needs to. Whichever you choose, print one and scan it with a real phone at the real size before the run.
| Subject | Result |
|---|---|
| Tight portrait, lit from one side | Best case — reads as a face immediately |
| Solid logo or wordmark on plain ground | Excellent, and stays legible |
| Single product on a clean background | Good with a contrast boost |
| Animal, close crop | Good — same reason faces work |
| Landscape, cityscape, crowd | Poor — reads as texture |
| Flat, evenly lit, low contrast | Worst case — dithers into a chequerboard and weakens the code |
Frequently asked questions
Can I put text or a slogan in the photo?
Not legibly. Anything narrower than about three modules disappears into the speckle, and text almost always is. A solid wordmark that is large enough to be a shape can work; a sentence cannot.
Does a colour photo work?
The colour is discarded; only brightness matters. Check the picture in greyscale first. If it still has a clear dark-to-light range, it will work; if it goes flat in grey, it will go flat in the code.
Why was my logo removed when I added a photo?
A photo code fills the whole square with the dithered picture, so there is no separate logo layer. Put the logo in the photo itself, on a plain background, if you want it in the code.
Why is the photo code PNG only?
It is made of individual pixels produced by the dither, which cannot be expressed as vector shapes. It is exported at a whole multiple of the module grid so the modules stay square when printed.
Print the square once. Decide later where it goes. SWAPQR makes static QR codes for free, with every style option, no account and no watermark. A paid plan turns a code dynamic: the printed square stays the same while you change its destination, and you see how often it was scanned, by day and by device.
Make a QR code in the browser