Turn a photo into a QR code that still scans — free, instant, and entirely inside your browser. The picture is dithered into the gaps between the code's modules, so the photo and the data occupy the same pixels. No account, no watermark, no limit, and the image is never uploaded anywhere: this page does the work, not a server. The tool is right below.
A scanner reads a QR code as a grid of light and dark modules, not as pixels, which leaves room to say the same thing with a picture. Each module is expanded into a block of subpixels and only its core — a single centre pixel, or a 2×2 middle if the subpixel ratio is even — has to carry the module's true value. That frees every other subpixel in the block to carry the photograph instead.
The finder squares, timing lines and alignment patterns stay locked by default. They are what a scanner uses to find and square up the code at all, and dithering them is the fastest way to make something that looks better and scans worse. The output is a 1-bit PNG, which is what you want for print.
Two knobs decide this, and the defaults are already the safe ones. Error correction defaults to H, the highest of the four levels — it spends more of the code on redundancy, which is exactly the budget the dithering spends. Subpixel ratio is how many subpixels wide each module gets, and it defaults to 4 for a reason worth knowing: an even ratio leaves each module a 2×2 core of true value, while an odd ratio leaves a single centre pixel. That is 4 subpixels in 16 at ratio 4, against 1 in 9 at ratio 3 and 1 in 25 at ratio 5 — and it is most of what a scanner has to work with once a camera has blurred the block together. Swept across six photographs, ratio 4 decoded every time where ratio 3 decoded a quarter of the time. Ratio 3 is still the prettiest and it is still there; it just is not the safe choice it looks like.
Shorter payloads scan better, always. A long URL needs a denser code, which means smaller modules and less room per module for the photo. If a code is fighting you, shortening the link does more than any other change.
Every code this page makes is decoded before you are told anything about it. The check runs in your browser, on the exact PNG the download button gives you, and it also shrinks the image until it stops decoding — that number is the closest thing to “how far away can a phone be” we can measure without a camera. It is the same promise the paid Studio makes with its GPU detector, kept locally so this page still talks to no server at all. It is a real check, not a guarantee: scan the result with an actual phone before you commit it to print, especially at small sizes or on anything glossy.
The error-diffusion approach here is a port of Andrew Tunnicliffe's dithered QR codes, which is the clearest treatment of the two-pass idea we know of. The older ancestor is Russ Cox's QArt codes, which established the point this all rests on: a QR code has enough slack that you can choose what the redundant bits look like. Neither of them is responsible for our bugs.