Overview
Decode QR codes and barcodes from an uploaded image or your camera, using the browser's native BarcodeDetector engine - no library downloaded, no image uploaded, no server involved. The scanner recognises QR codes plus EAN, Code 39, Code 128, UPC, Data Matrix, PDF417 and Aztec formats, and reports both the decoded value and the format.
How It Works
Upload mode is the default: drop or select an image containing a code and the decoded value appears with its format name. Switch to camera mode to use the rear camera; the browser asks for permission, and a live loop scans frames every half second, stopping automatically on the first successful read. If the browser lacks the native detector, the page says so up front rather than failing silently. Undecodable images get a practical hint - try a sharper, closer crop - instead of a generic error.
Step-by-Step Usage Guide
- Drop an image containing the code, or switch to camera mode.
- Allow camera permission if the browser asks.
- Hold the code steady until the live loop reads it.
- Read the decoded value and format, then copy it where needed.
Technical Specifications & Standards
The detection engine is the Barcode Detection API, a browser-native interface backed by platform decoders; this site deliberately uses it rather than bundling a JavaScript decoder, which keeps the page light and the decoding fast. The trade-off is support: the API exists mainly in Chromium browsers - Chrome and Edge, including on Android - and not in Firefox or Safari, so the tool checks for the constructor at load and explains the limitation instead of pretending. Ten format filters are requested explicitly, from qr_code through the retail barcodes (EAN-13, EAN-8, UPC-A, UPC-E) to Code 128, Code 39, Data Matrix, PDF417 and Aztec. Camera access goes through a preflight helper that distinguishes a non-secure context, a blocked permission and a device without a camera, so each failure mode gets an actionable message; the rear camera is requested specifically (facingMode environment). The frame loop polls the video element on an interval and tears the stream down - tracks stopped, interval cleared - the moment a code is found.
Targeted Use Cases
- Reading a QR code from a screenshot when your phone camera is out of reach.
- Checking what a printed QR code actually links to before scanning it with a phone.
- Decoding a product barcode image for a price or stock lookup.
- Verifying event tickets' QR payloads from a PDF screenshot.
Notes & Gotchas
- Use a sharp, well-lit image; blur and glare defeat any decoder.
- In camera mode, fill the frame with the code and hold still for a beat.
- Remember the decoded string is data - inspect URLs before opening them.
- On Firefox or Safari, use upload mode on a Chromium browser instead; the API is unavailable there.
Frequently Asked Questions
Which browsers support the scanner?
Browsers with the native Barcode Detection API - chiefly Chrome and Edge, including Android. Firefox and Safari do not expose it, and the page detects this and tells you directly.
Are my images or camera feed uploaded?
No. Detection runs in your browser against the local image or live video frames. Nothing is transmitted or stored.
What barcode formats can it read?
QR codes plus EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, Data Matrix, PDF417 and Aztec. The result names the format it found.
Why does camera mode ask for permission?
The camera stream is requested through the browser's media permissions. The tool requests the rear camera specifically and explains clearly if the context is insecure, permission was denied, or no camera exists.