← Back to home

QR Code scanner — live camera + image upload

Two modes: scan a QR live with your phone/laptop camera, or upload an image (PNG, JPG, screenshot). Auto-detects type: URL, WiFi, vCard, SMS, email. 100% in-browser — no server upload.

📹 Live camera📤 UploadAuto-detectClient-side

Why use this tool

📹
Live camera

Open your phone or laptop camera, point it at a QR — detected in <1 second. Front/back camera toggle on mobile.

📤
Upload images

Drag-drop or click to pick. Great for QRs from chat/screenshots, or stale QRs that a camera can't quite read.

🧠
Auto-detect type

URLs show as clickable links, WiFi as SSID+pass card, vCard as a contact grid, SMS as phone+body — readable at a glance.

🔒
100% private

Camera stream + uploaded image both decode in-browser via jsQR. No server upload, no logs, no QR content ever recorded.

How to use

  1. 1Pick a mode: 'Live camera' (fastest, uses your camera) or 'Upload image' (when you have a file).
  2. 2Camera mode: tap 'Start camera' → allow camera access when prompted → point at the QR inside the on-screen frame.
  3. 3Upload mode: drag the image into the upload area or click to pick.
  4. 4Wait 1–2 seconds — jsQR decodes inside the browser Canvas. The camera auto-stops once a QR is found.
  5. 5See the result: raw text + parsed card. Click Copy to copy, or Open (for URLs) to follow the link.

What is an image QR scanner?

An image QR scanner decodes a QR Code from an existing image — unlike a camera scanner that reads a real-world QR. Useful when you receive a QR screenshot via chat (WhatsApp/Messenger), download a QR from a website, or photograph a poster but don't want a live camera scan.

This tool uses jsQR — the strongest open-source QR decoder for JavaScript, used by many leading web apps. jsQR has an inversionAttempts algorithm that handles inverted QRs (white on black) and low-quality images.

The whole pipeline (load image → resize → ImageData → jsQR.decode) runs in the browser via Canvas API. The image is never uploaded — perfect privacy for QRs containing sensitive info (vCard, WiFi password).

  • Live camera: getUserMedia + jsQR realtime decode (~10fps)
  • Auto-prefers back camera on mobile devices
  • Switch front/back cameras when multiple are present
  • On-screen frame overlay + animated scan line
  • Upload: PNG, JPG, WEBP, raster SVG
  • Auto-resize large images (≥1024px) for speed
  • Inversion attempts: handles white-on-black QR (upload)
  • Auto parser: URL, WiFi, vCard, SMS, mailto
  • 100% client-side — camera stream + image never uploaded

When do you need a QR scanner?

QR in a screenshot

Receive a QR via chat as an image — no need to print and re-scan. Upload directly.

QR from an online poster

Save a Facebook poster image → decode the QR to check the destination before opening (avoid phishing).

Damaged or old QR

Blurry, scratched, faded QR — jsQR has high tolerance and may decode where a camera fails.

QR inside a PDF

Screenshot a QR in a PDF, drop into the tool to extract URL/contact without printing the PDF.

Campaign audit

Marketer inspects a competitor's QR: download the image, decode to see destination URL and UTM params.

Phishing verification

Suspicious email with a QR image — decode to inspect the URL before scanning/clicking.

Image QR decoding internals

Pipeline: (1) Load the image via URL.createObjectURL, (2) Draw to Canvas and resize ≤1024px (speed), (3) Read ImageData (Uint8ClampedArray RGBA), (4) Pass to jsQR(data, width, height, options) — returns {data, location, version}.

jsQR uses Reed-Solomon decoding + finder pattern detection (the 3 big squares at 3 corners of a QR). When a finder pattern is cropped, jsQR falls back to alignment pattern (smaller squares) to reconstruct.

After decoding raw text, our parser prefix-matches the type: starts with "http" → URL, "WIFI:" → WiFi, "BEGIN:VCARD" → vCard, "smsto:"/"sms:" → SMS, "mailto:" → email. Each type is rendered as a structured card.

QR Scanner FAQ

How fast is decoding?

Usually <1 second for images ≤2MP. Larger images (>4MP) auto-resize to 1024px before decoding — still fast.

Does it work on partially covered QRs?

Often yes, thanks to Reed-Solomon error correction. Level H (30% redundancy) can survive ~30% obstruction. Level L (7%) is weaker.

Is there an upload size limit?

No hard limit, but images >10MB load slowly. We recommend PNG/JPG ≤5MB for best performance.

Does it support Data Matrix, Aztec, PDF417?

No. Only QR Code (standard + Micro QR). Other 2D barcodes need specialized libraries.

Can I scan a QR directly with my phone camera?

Yes. Pick the 'Live camera' tab → 'Start camera' → allow camera permission. On mobile, the back camera is preferred. If multiple cameras are available, a 'Switch camera' button appears. Everything runs with getUserMedia + jsQR in the browser — no frame is ever uploaded.

Is there a scan history?

No. For privacy, nothing is saved after you close the tab. Copy and paste to your own notes if you need to keep it.