Upload a code and get measured answers rather than a tick: how many modules of quiet zone it has, what the contrast actually is, which error-correction level it carries, how much a logo covers. Test it here before you commit it to five thousand flyers.
Quick answer: drop in a QR code image and this measures the things that decide whether it survives print — clear space in modules, the real contrast ratio between the ink and background it finds, the error-correction level read back out of the code, the module count, and how much of the code a logo covers. Every figure comes with the threshold it is being judged against, because what you need to know is how much margin you have, not whether something passed.
Test a code
Drop your QR code here
or click to choose one — PNG, JPG, WebP, GIF or BMP. The artwork you are about to print, a screenshot, an export from anywhere.
Most code checkers tell you whether the code scanned on their machine. That is the least interesting thing about it, because a code that scans from a clean file on a desktop can still fail on a menu in a dim restaurant, on a window in sun, or once a printer has spread the ink a little. What decides that is how much margin the code has, and margin is a number.
So every check here reports the measurement and the threshold it is being held to. Four modules of quiet zone is the standard; yours might be 1.8. Contrast stops working below 4:1; yours might be 4.3, which passes and leaves nothing spare. A logo covering 7% of the area is a different proposition from one covering 19%. You can act on those. You cannot act on a green tick.
What each check is measuring, and where the number comes from
Check
How it is measured
The threshold, and why
Decodes
The same two-pass ZXing configuration the generator uses to check its own output
Pass or fail. Everything else depends on it
Quiet zone
Clear rows and columns outside the code, divided by the module size — so the answer is in modules, the unit the standard uses
Four. With none, the same code stops scanning as soon as it sits on a dark background
Contrast
The mean colour of the dark modules against the mean colour of the light ones, as a WCAG ratio
4:1 floor, 7:1 comfortable. Measured: 4.06:1 decoded, 4.00:1 did not
Logo
The area inside the code that is neither ink nor background, and whether it sits in the middle
No fixed limit — the honest answer is whether it still decoded
Destination
Properties of the URL text: scheme, shortener, an @ before the host, a punycode name
Flags, not a verdict on trust
The module count is worked out rather than guessed. A finder-pattern centre sits three and a half modules in from its corner, so the two centres along one edge are n − 7 modules apart; with W the code's width in pixels and D that distance, n = 7W / (W − D). On real renders that recovers 21, 25, 29, 69 and 101 modules to the second decimal, which is what makes the quiet zone measurable in modules instead of pixels — and pixels are the wrong unit, because the same four modules is a different pixel count at every size.
What it will not tell you
Three things, and they matter as much as the checks.
Whether the destination is safe. A code pointing at a real domain over https with no shortener passes every flag here and can still be a page collecting card details. The flags narrow the field; they do not clear it.
How big it will be in print. An image has pixels, not millimetres. The module size in millimetres is shown for a 30 mm width as a reference point, but what decides legibility is the size you actually print at — keep a module at or above about 0.4 mm.
Whether your printer and your customers' phones will agree with it. Nothing measured from a file substitutes for printing one on the real stock and scanning it at the distance people will stand.
What crosses the network
Nothing of yours. This page holds no fetch, no XMLHttpRequest, no sendBeacon and no form, so the image has no route off your machine; it is read with FileReader, drawn onto a canvas in your tab, and measured there. The only things fetched are the decoder library from jsDelivr — a static file, identical for every visitor — and this site's own header, fonts, analytics and ad script. That matters more here than usual, because the codes people most want to check before printing are the ones carrying a payment address or an internal link.
Frequently Asked Questions
Upload the image here. It decodes the code and then measures the things that decide whether it survives print: how many modules of clear space it has, the real contrast ratio between the ink and the background, which error-correction level it carries, how many modules across it is, and how much of it a logo covers. Each answer is a number rather than a tick, because the number is what tells you how much margin you have.
Four modules on every side — that is what the standard asks for, and it is measured in modules rather than millimetres or pixels because it scales with the code. We tested the same code with and without it: both scan on a white page, and the one with no margin stops scanning the moment it sits on a dark background. The validator reports the tightest side in modules, and says when the figure is what the image gives rather than what the page will.
More than you would guess from looking. Stepping a grey foreground against white and decoding at each step, everything at a contrast ratio of 4.06:1 and above read back and everything at 4.00:1 and below did not. So 4:1 is the floor, not a target — aim for 7:1 or more for anything printed, because ink spreads on paper and a phone camera in a dim room has less to work with than a clean file does. The validator measures the real ink and background colours it finds, not an assumed black on white.
There is no safe percentage, which is why this measures yours rather than quoting a rule. "Level H recovers 30%" is about codewords spread across the whole symbol, not a solid block you may paint over. Sweeping a centre block across payload lengths and levels, the largest that still read at H covered 15.2% of the area on a long payload and only 4% on a short link. The validator reports the area yours covers and whether it still decoded, which is the only test that settles it.
Yes. The level is encoded in the code itself, so it is read back rather than guessed: L recovers about 7% of the codewords, M about 15%, Q about 25% and H about 30%. It also reports the version and module count — a version 2 code is 25 modules across — which is what decides how fine it prints at a given size.
Upload it here and the checks are ordered by how often each one is the cause. Most failures are the quiet zone, the contrast, or a logo covering more than the error correction can rebuild. If it will not decode here at all, the picture itself is usually the problem — too small, too soft, cropped into the pattern, or photographed at an angle. What this cannot tell you is whether a code that measures well will survive a particular printer and a particular phone; for that, print one and scan it.
No. The page contains no way to send anything — no fetch, no XMLHttpRequest, no form — so the image is read by your browser and measured by JavaScript in the same tab. That matters here more than usual, because the codes people most want to check before printing are the ones carrying a payment address or an internal link.