QR Code Decoder
QRRead a QR code from an uploaded image and copy its decoded text.
On this page
What is a QR code decoder?#
A QR code decoder does the reverse of a generator: you give it an image containing a QR code, and it hands back the text encoded inside. Point it at a screenshot of a payment QR, a photo of a restaurant menu sticker, or a saved image of an event ticket, and it reads out the URL, WiFi string, contact card or plain text that was baked into the matrix when the code was created.
Under the hood the decoder needs pixels, not a picture file. The page draws your uploaded image onto an in-browser canvas, reads the raw RGBA buffer, and hands those pixels to the decoding library, which walks the matrix — finding the three corner finder patterns, aligning the grid, and reading off the modules — to reconstruct the original byte stream. Because that byte stream is UTF-8, the decoded text comes back exactly as it went in, including non-Latin scripts and emoji.
Everything happens in your browser. The image is processed on a local canvas; it is never uploaded to a server, so a QR containing a WiFi password, a private URL, or personal contact data stays private.
How to use it#
- Drag an image onto the dashed drop zone on the left, or click Upload to pick a file. PNG, JPEG and other browser-supported image formats all work.
- A thumbnail of the image appears below the drop zone so you can confirm you loaded the right one.
- The decoded text appears immediately in the output pane on the right.
- Click Copy to copy the decoded text, or Clear to remove the image and start over.
- The status line reports the outcome: a successful decode, a warning that no QR was found, or an error if the file was not a usable image.
If the decoder cannot find a QR code, that is reported honestly as not-found — see the FAQ for the common reasons.
Key features#
- Image-in, text-out. No camera, no pointing and waiting — load any saved image and the text is read off in one pass.
- Any image format the browser reads. PNG, JPEG, GIF, WebP, BMP — if the browser can decode the file, the tool can draw it to canvas and read the QR.
- UTF-8 faithful. Decoded text preserves non-Latin scripts and symbols exactly as encoded, so Chinese, Arabic, emoji and mixed-script payloads come back intact.
- Round-trips with the generator. A QR produced by the
/en/qr/generate/tool decodes back to the exact original text — useful for verifying that a code you created actually carries the payload you intended. - Stays private. The image is drawn to a local canvas and the pixels are decoded in-page; nothing is uploaded, so sensitive QR codes (private WiFi, personal contacts) never leave your device.
- Honest failure messages. A non-image file or a truncated buffer is reported clearly, and “no QR found” is distinguished from “the image could not be read”, so you know what to fix.
Worked example#
The most reliable test is a round-trip. Generate a QR with the companion generator tool — say, encoding the URL https://example.com — and download the PNG. Then come back to this page, drop that PNG onto the drop zone, and the output pane reads:
https://example.com
The decoded text is byte-for-byte identical to what was encoded. The same round-trip works for a WiFi string:
WIFI:T:WPA;S:HomeNetwork;P:supersecret;;
It also works on a photo of a QR code, not just a clean render: take a picture of a printed menu sticker with a phone, transfer the JPEG here, and the decoder reads the same URL it would if you had scanned the sticker directly. The finder patterns in the three corners are what let the library locate and align the matrix inside an arbitrary photo.
FAQ#
It says “no QR found” — what went wrong?#
Usually one of four things: the image is too blurry or low-resolution for the modules to be distinguished; the QR is partially cropped or rotated so the three corner finder patterns cannot all be found; the code has no quiet zone (the white margin around it) so the edges blur into the background; or what you uploaded is not a QR code at all — for example, a 1D barcode, which needs the /en/qr/barcode/ tool instead. Try a sharper, better-cropped image with a clear white border.
Does it work on a photo taken with my phone, or only on clean screenshots?#
Both. The decoder locates the QR by its three corner finder patterns and aligns the grid accordingly, so it tolerates rotation, perspective and moderate blur. A clean screenshot is the easiest case; a reasonably sharp phone photo of a printed code works too. Extremely low light, heavy glare, or a code smaller than a few dozen pixels on a side are where it starts to fail.
What image formats can I upload?#
Anything the browser can decode: PNG, JPEG, GIF, WebP, BMP and similar. Animated GIFs are read from their first frame. If the file is not an image at all, or is corrupted, the tool reports that it could not be read rather than pretending to decode nothing.
Is the image or the decoded text sent anywhere?#
No. The image is drawn to an in-browser canvas and the pixel buffer is decoded locally by a library bundled with the page. Neither the image nor the text it contains is uploaded — there is no backend. This makes the tool safe to use on QR codes that carry WiFi passwords, payment details, or personal contact information.
Can it decode other 2D codes like Data Matrix?#
Not with this tool — it decodes standard QR codes specifically. A Data Matrix code (common in logistics and electronics) needs the /en/qr/data-matrix/ path, and a 1D retail barcode (EAN, UPC, Code128) needs the /en/qr/barcode/ tool. They look superficially similar but use different matrix shapes and decoding algorithms.