QR Code Scanner — Read QR from Camera, Photo or Screen Online
Point your phone or laptop camera at a QR code and the page decodes it in real time, or drop an image (PNG, JPG, screenshot) and let the page scan it once. Decoded text appears below with a one-tap copy button, and if it looks like a URL we surface it as a clickable link so you don't have to retype it. The whole pipeline runs in your browser — no upload, no server-side OCR, no record of what you scanned. That makes it safe for the QR codes you actually want to scan but don't trust enough to point a sketchy app at: bank receipts, ID cards, MFA enrollment codes, or restaurant menus.
About this tool
On Chromium-based browsers (Chrome, Edge, Opera, modern Android Chrome) the page uses the native BarcodeDetector API, which is hardware-accelerated and supports QR plus 12 other 1D/2D code formats. On Firefox, Safari, and older browsers the page lazy-loads the well-known jsQR library on first use — same accuracy on QR specifically, just adds ~50KB to the initial page weight only when the camera mode is opened. Camera frames are processed on a hidden canvas via requestAnimationFrame and discarded immediately, never stored. The image-upload path runs the same decode against a single canvas snapshot. Use cases: reading a Wi-Fi share code, decoding a vCard from someone's email signature, verifying that a printed QR points where it claims, scanning legacy MFA codes during account migration, or just satisfying curiosity about a QR code you spotted somewhere.
- Live camera scanning with real-time decode
- Image upload mode for screenshots and saved photos
- Native BarcodeDetector on Chromium for hardware-accelerated decode
- jsQR fallback (lazy-loaded) on Firefox, Safari and older browsers
- Auto-detects http/https URLs and renders them as clickable links
- One-tap copy of the decoded text to clipboard
- Camera frames never persisted — discarded after each decode pass
- No upload, no analytics, no record of what you scanned
- Works with Wi-Fi share codes, vCards, payment links, MFA enrollment, restaurant menus
- Mobile-friendly UI with full keyboard support on desktop
Free. No signup. Your inputs stay in your browser. Ads via Google AdSense (consent required).
Frequently asked questions
Why does the reader use BarcodeDetector on Chromium but jsQR on Safari and Firefox?
BarcodeDetector is part of the Web Platform Incubator CG's Shape Detection API (wicg.github.io/shape-detection-api/), an incubation specification — not on the W3C Standards Track. Chromium-based browsers (Chrome 83+ shipped May 2020, Edge, Opera) include a hardware-accelerated implementation that supports QR plus several other 1D and 2D code formats. Firefox and Safari have not shipped the API: Mozilla's published standards-position on Shape Detection is neutral with concerns about the WICG specification's incubation status, and Apple/WebKit raised similar concerns about the spec's API design. To work everywhere, the page lazy-loads the well-known jsQR library (~50 KB minified pure JavaScript) on first camera-mode use; jsQR achieves comparable QR-decoding accuracy to the native API in practice, just without hardware acceleration.
How does QR detection work — finder patterns and timing patterns?
ISO/IEC 18004:2024 specifies three finder patterns — the three concentric squares in three corners of every QR — that scanners use to locate the QR within an image. Once finder patterns are found, the scanner derives orientation and version from the timing patterns (alternating dark and light modules running between two finder patterns) and the format-information region near the finder patterns. In practice, finder-pattern damage is a common scan failure mode: even moderate dirt or motion blur on a finder square makes the entire QR invisible to the decoder, even if the data modules are intact. A QR with minor data-area damage but pristine finder patterns can still scan thanks to Reed-Solomon error correction (Reed & Solomon, 1960).
What payload formats does the reader recognize as actionable?
The reader returns the raw decoded string from the QR. The page then runs lightweight detection on the string prefix to surface common payload types: HTTP and HTTPS URLs become anchor tags, mailto: / tel: / sms: URIs (defined by RFC 6068, RFC 3966 and RFC 5724 respectively, dispatched via the HTML navigation algorithm) become clickable links, the ZXing Wi-Fi format (`WIFI:...;;`) gets a 'Copy network details' button, and `BEGIN:VCARD` strings (RFC 2426 v3.0 or RFC 6350 v4.0 syntax) are not auto-imported (browsers do not allow contact-list write access from JavaScript) but can be copied for paste into a contacts app. Unknown payloads are rendered as monospaced text.
Why does the camera mode sometimes fail in low light or at oblique angles?
The ISO/IEC 18004 reference decoding algorithm assumes the QR is roughly orthogonal to the camera and well-lit enough for finder patterns to register clear contrast. BarcodeDetector and jsQR both implement perspective correction for moderate off-axis tilt, but extreme angles, severe motion blur, low contrast (a printed QR under indoor LED lighting often has insufficient contrast), or camera autofocus mid-scan can all defeat the decoder. Practical fixes include moving the camera closer so the QR fills more of the frame, pointing roughly perpendicular to the QR, and allowing the autofocus to settle for a moment before expecting a decode.
How does this tool handle accessibility for screen readers?
The decoded text region is marked aria-live="polite" (W3C WCAG Success Criterion 4.1.3 Status Messages, introduced in WCAG 2.1, Recommendation 5 June 2018; carried unchanged into WCAG 2.2, Recommendation 5 October 2023), the camera-mode toggle is keyboard-operable, and the upload-image button accepts both pointer and keyboard activation. The decoded URL detection-and-link rendering means screen readers announce 'link, https://…' rather than reading out the entire URL character by character. Camera frames are processed but never persisted beyond the decode pass, so privacy concerns around stored video do not arise.
Sources (5)
- ISO/IEC (2024). ISO/IEC 18004:2024 — QR code bar code symbology specification (finder patterns, timing patterns, reference decoding algorithm). International Organization for Standardization, Edition 4 (August 2024).
- Web Platform Incubator Community Group (WICG) (2024). Accelerated Shape Detection in Images — BarcodeDetector API. WICG draft (not on the W3C Standards Track), wicg.github.io/shape-detection-api/ — shipped in Chromium since Chrome 83 (May 2020).
- Reed, I. S., & Solomon, G. (1960). Polynomial Codes Over Certain Finite Fields (error correction). Journal of the Society for Industrial and Applied Mathematics, 8(2), 300–304 (DOI 10.1137/0108018).
- ZXing Project / jsQR (2024). Open-source QR decoding libraries (Wi-Fi share format, vCard payload prefix detection). github.com/zxing/zxing + github.com/cozmo/jsQR (pure-JS QR decoder fallback).
- World Wide Web Consortium (W3C) (2018). Web Content Accessibility Guidelines (WCAG) 2.1 — Success Criterion 4.1.3 Status Messages. W3C Recommendation 5 June 2018; carried unchanged into WCAG 2.2 (Recommendation 5 October 2023).
These are the original publications the formulas in this tool are based on. Locate them by journal name and year on Google Scholar or PubMed.
By Marco B. ·