QR Code Scanner
Scan a QR code with your camera or from an image file and read its contents in your browser, with a look at the destination before you decide to follow it.
"Thirty per cent error correction" is not thirty per cent of the picture
The four error correction levels are usually quoted as recovering 7%, 15%, 25% and 30%. Those are shares of codewords, not of the image. To find out what they mean to a scanner, the figures below encode a real URL at each level, blank out a square in the middle, and try to decode it with the same library this page uses:
| Level | Headline figure | Largest readable blank square | Share of the area |
|---|---|---|---|
| L | 7% | 6 × 6 modules | 4.3% |
| M | 15% | 8 × 8 modules | 7.6% |
| Q | 25% | 13 × 13 modules | 15.5% |
| H | 30% | 17 × 17 modules | 21.1% |
Every level survives less of the picture than its headline number suggests. A logo dropped in the middle is the common case, and the highest setting buys you about a fifth of the area rather than a third.
Correction is not free either. Higher levels need more room for the check data, which pushes the code to a larger version:
| Level | Version | Grid | Modules | Module size at 25mm |
|---|---|---|---|---|
| L | 3 | 29 × 29 | 841 | 0.862 mm |
| M | 3 | 29 × 29 | 841 | 0.862 mm |
| Q | 4 | 33 × 33 | 1089 | 0.758 mm |
| H | 5 | 37 × 37 | 1369 | 0.676 mm |
For this payload L and M come out the same size, so stepping up from the lowest level to the second costs nothing at all — versions are quantised, and there was slack going spare. Going all the way to H is a different matter: 1.63 times the modules, which at a fixed printed size makes each one 22% smaller. Past a point, buying more error correction makes a code harder to scan rather than easier.
Scattered damage is far worse than the same amount in one lump
Flipping individual modules at random rather than blanking a block, and staying away from the corner markers, the same decoder gives up after a handful:
| Level | Scattered modules | In one block | Advantage of a lump |
|---|---|---|---|
| L | 4 | 36 | 9× |
| M | 4 | 64 | 16× |
| Q | 4 | 169 | 42× |
| H | 4 | 289 | 72× |
Error correction is organised in codewords of eight modules. A solid block ruins a small number of codewords completely; the same modules scattered across the code ruin one codeword each, and burn through the budget many times faster. Speckle, dirt and print noise are the expensive kind of damage. A sticker is the cheap kind.
One honest caveat about that column: it is flat across all four levels because it is measured against a real decoder rather than against the arithmetic. Isolated flipped modules disturb the step where the scanner fits a grid to the image, and that happens before error correction is involved at all — so it does not care which level you chose.
And none of it protects the three corner squares
Erasing part of one finder pattern — the large squares in three corners — breaks the code almost immediately, and how much it tolerates has nothing to do with the level:
| Level | Finder corner tolerated | Blank in the middle tolerated |
|---|---|---|
| L | nothing at all | 6 × 6 modules |
| M | nothing at all | 8 × 8 modules |
| Q | 3 × 3 modules | 13 × 13 modules |
| H | nothing at all | 17 × 17 modules |
The highest setting does worse here than the second highest, which is the giveaway: this is not error correction failing, it is detection failing. Those squares are how a scanner finds the code and works out its perspective in the first place. Correction only applies once the data has been read, and if the code cannot be located there is no data to correct. They are the one part of a QR code carrying no redundancy at all, and buying more of it does not help them.
Which is the practical advice for anything you point this scanner at: a fingerprint over the middle is usually survivable, and a thumb over a corner is not.
How to use
- Allow camera access, or upload an image of the code.
- Point the camera at the code.
- Read the decoded contents.
- Inspect any URL carefully before opening it.
Frequently asked questions
Does my camera feed get uploaded?
No. Decoding runs entirely in your browser and the video never leaves your device. Camera access is requested by the browser and can be revoked at any time.
Why should I check a QR code before following it?
Because a QR code is unreadable to humans, so you cannot tell where it goes until it is decoded. Criminals exploit this by placing stickers over legitimate codes on parking meters, restaurant tables and posters — a practice common enough to have earned the name quishing. Seeing the URL before opening it is the entire defence.
What can a QR code contain?
Any short text. Most commonly a URL, but also wifi credentials, contact details, calendar events, payment information and plain text. A wifi code will offer to join a network, which is convenient and worth reading first.
Why do some codes still scan when damaged?
Because QR codes include Reed-Solomon error correction, at one of four levels. At the highest, roughly 30 per cent of the code can be destroyed and still recovered. This is also what allows a logo to be placed in the middle of a code without breaking it.
How much data fits in one?
Up to about 4,300 alphanumeric characters at the largest size and lowest error correction, though a code that dense is hard to scan reliably. In practice, keeping the content short produces a code that scans quickly from further away, which is why link shorteners are common in printed codes.
What are the three squares in the corners for?
Position detection. They let a scanner find the code and work out its orientation and angle, which is why a QR code can be read upside down or from a distinct angle. The fourth corner carries alignment information instead.
🔒 This tool runs entirely in your browser. Nothing you enter is uploaded, logged, or stored.