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 the centre one 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 is capped at 3 to 6 because both ends of that range have been shown to decode with real photographs. Below 3 there is no room for a picture; above 6 the file grows without scanning any better.
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.
This tool is the one thing on qart.uk that nobody checks for you. Everywhere else on this site an image is decoded by a real QR detector before it is offered to you, and that check runs on our GPU host. This page never talks to that host — it never talks to any server — so its output is unverified by construction. Scan the result with more than one 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.