Skip to content

QR code reader

Read what a QR code actually contains without pointing a phone at it. Drop in a photograph or a screenshot and you get the contents as text, along with what kind of code it is.

The decoding happens in your browser. The image is never uploaded, which matters here more than it does for most tools: people check codes precisely because they do not trust them.

Drop an image here, or choose one. It never leaves your device.

Why read a code instead of scanning it

Scanning acts on the contents. A phone camera pointed at a code will offer to open the link, join the network or start the payment, and on some setups it does more of that automatically than you would like. Reading shows you the payload as text and does nothing with it.

That is useful whenever the code came from somewhere you cannot vouch for: a sticker on a parking meter, a flyer through the door, an unexpected letter, a code in an email. Quishing — phishing through QR codes — works precisely because a printed square reveals nothing about where it goes.

What gets flagged

The contents are shown as plain text and never as a clickable link, because turning an untrusted payload into something clickable would make the reader itself the delivery mechanism for whatever was being checked.

A few types get a warning: a WiFi code, because the password is in there in plain text and anyone who sees the code can read it; an http:// address, because anything sent to it travels unencrypted; and a crypto payment request, because those cannot be reversed and the address deserves checking against a source you trust.

Getting a photograph that decodes

Include the whole code and the light margin around it. The margin is part of the symbol — decoders use it to find the edges — so a tightly cropped photograph often fails when the same code scans fine in person.

Shoot square to the code rather than at an angle, get close enough that it fills a good part of the frame, and avoid glare across the middle. A screenshot is usually easier than a photograph, and both work here.

When a code will not read at all

Damage to a corner is the usual reason. The three large corner squares are how a decoder finds and orients the symbol, and unlike the data area they are not protected by error correction — a worn or obscured corner means no decode at all, rather than a partial one.

Very low contrast, heavy reflections and light-on-dark printing are the other common causes. This reader tries the image both normally and inverted, which handles most light-on-dark codes, but a code printed in two similar tones may not be recoverable from a photograph at all.

Common questions

Is the image uploaded anywhere?
No. The file is drawn to a canvas and decoded in your browser, so it never leaves your device. That matters here because people check codes they do not trust, and a reader that shipped those images to a server would be asking for the wrong kind of trust.
Why not just scan the code with my phone?
Scanning acts on the contents — a camera will offer to open the link or join the network, sometimes with less confirmation than you would like. Reading shows the payload as text and does nothing with it, which is the point when the code came from somewhere you cannot vouch for.
Why does my photograph fail to decode?
Most often the margin is cropped out. The light border around a code is part of the symbol and decoders use it to find the edges. Include the whole code plus its margin, shoot square rather than at an angle, and avoid glare.
Can it read a damaged QR code?
Sometimes. Error correction recovers scattered damage in the data area, but the three corner squares are not protected — if one is worn or covered, the decoder cannot locate the symbol and no amount of redundancy helps.
Does it work with light-on-dark codes?
Usually. The image is tried both normally and inverted, which handles most inverted printing. Codes in two similar tones may still be unrecoverable from a photograph, because the contrast a decoder needs is simply not there.

More tools

QR Code Reader — Decode an Image in Your Browser