QR Code Reader
Drop a photo or point your camera and read any QR code — decoded on this device with open-source ZXing, never uploaded.
Drop a photo or screenshot of a QR code here
PNG, JPEG, WebP, GIF, BMP or AVIF — up to 20 MB, 10,000 px per side.
The camera starts only when you ask. Frames are decoded in this tab and never stored or sent anywhere.
Decoded codes appear here — drop an image or start the camera to read one.
Photos and camera frames are decoded on this device with open-source ZXing and are never uploaded.
Do it offline:$ zbarimg photo.jpg
How to use it
- Choose an image or drop it onto the source pane — photos and screenshots up to 20 MB and 10,000 px per side are read as they are.
- Or press Use camera: it starts only on that click, samples frames up to four times per second, and stops the moment a code decodes or you leave the tab.
- Read the results: every code gets a kind chip — link, WiFi network, contact, 2FA secret, plain text — plus its decoded text and parsed fields.
- Copy one code's text or all at once. Links render as text, never opened for you; a WiFi password stays masked until you reveal it.
Drop a photo or screenshot — or point your camera — and this online QR code reader decodes it in this tab. Links, WiFi credentials, contact cards and 2FA secrets come back as plain text, classified and never opened automatically. Decoding is open-source ZXing compiled to WebAssembly: the image never leaves your device, and the network panel will show you exactly that.
How it works
A QR symbol is located before it is read. The three nested corner squares are finder patterns — the decoder scans the binarized image for their 1:1:3:1:1 dark-light rhythm, which survives any rotation, then lays a sampling grid over the symbol and reads each module as a bit. Reed–Solomon error correction repairs what the photo got wrong: roughly 7 to 30 percent of modules, by level, can be dirty or missing and the payload still returns exact.
The decoder is zxing-cpp — the maintained C++ descendant of the original ZXing project — compiled to WebAssembly and run in a background worker thread. Your first decode downloads it from this site, about 450 KB compressed, once; the browser caches it after. Then: image to canvas pixels, pixels to the worker, and this page de-duplicates repeated reads, orders codes by position and classifies every payload.
Examples
https://ithomia.example/menuLink · Site: ithomia.exampleThe everyday payload: the chip says Link, the site is pulled out for a fast trust check, and the address stays plain text.
WIFI:T:WPA;S:CafeGuest;P:espresso123;;WiFi network · Network name: CafeGuest · Security: WPA · Password: masked until you reveal itThe WIFI: scheme parses into network name, security type and key. The key is in the code — that is the format's point — so its field shows masked by default.
otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example2FA secret detected · Type: totp · Issuer: Example · Account: alice@example.com · Secret: maskedAuthenticator enrollment codes carry a live second factor: issuer and account are named; the secret stays masked with no reveal, decoded in this tab and logged nowhere.
javascript:alert(document.cookie)Dangerous link · Scheme: javascript: — flagged, shown as text, never openedThe edge case: javascript: and data: URIs can run script when opened, so the scheme is classified, flagged in red and — like every result here — opened by nothing.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Several codes in one photo all decode
A label sheet reads as a list in reading order — top row first, left before right — repeated reads merged. Past 16 distinct codes the page refuses and names both numbers; crop to what you need.
Photographing a screen invites moiré
A camera aimed at a monitor adds interference bands where the screen's pixel grid beats against the sensor's, swallowing modules. If the code is on your screen, drop a screenshot instead.
Tiny or blurry codes: get closer, not bigger
Upscaling a soft photo adds pixels, not information. Retake with the code filling the frame, hold still for focus, and keep the light border in view — that quiet zone is how finder squares are found.
Why the WiFi password comes back masked
Anyone photographing a café sign can read the key — that is the format — but it should not sit glowing on screen for whoever walks past. Reveal is one click; nothing is stored or sent.
Decoded links are text, not buttons
Quishing makes the scan itself the click. Here an address is inert text with its site named beside it, javascript: and data: payloads carry a red flag — you read first, then decide.
Common errors
No QR code was found in this image — try a sharper photo, move closer so the code fills more of the frame, and keep the light border around it visible.- The decoder tried the image rotated, inverted and downscaled and found no finder rhythm. Glare, a crop that cut the quiet zone, or a code under a tenth of the frame are the usual causes — the retake hints fix all three.
Camera access was denied — allow the camera for this site in your browser settings, or drop a photo of the code instead.- Your browser remembered a No for this site, so the prompt never reappears on its own. Re-allow from the icon by the address bar and press Use camera again — or a dropped photo decodes through the same engine.
This image is larger than the 20 MB limit for this tool — export a smaller copy of the photo and retry.- Decoding holds the full pixel buffer in memory, and files this large are almost always camera originals. An export at reduced quality keeps every module at a fraction of the bytes.
FAQ
Is my photo uploaded when it is scanned?
No. The ZXing decoder is downloaded from this site and runs in this tab; the photo becomes pixels here and is decoded here. Watch the network panel while you drop an image — no request carries it anywhere.
Why does the first decode pause for a moment?
The decoder itself is the wait: about 450 KB compressed, fetched on your first decode and cached after. The pause is the price of shipping no decoder to people who only came to read this page.
Can it read barcodes too?
Not on this page. The ZXing engine underneath can read the 1D families — EAN, Code 128 and the rest — but this tool is scoped to QR codes, so the page does what its name says. Barcode reading would ship as its own tool.
Does the camera keep running after a scan?
No — it stops itself the moment a code decodes, and when you press Stop or leave the tab. Frames are decoded in memory, never saved: no capture button, no gallery.