Skip to content
ImgKiloImgKiloOpen tools

QR Code Scanner

QR code scanner with webcam and image upload

Decode a QR code in your browser. Use the webcam for live scanning or upload a photo of the QR. jsQR runs locally; nothing is uploaded. The decoded payload is labelled by scheme (URL, Wi-Fi, vCard, mailto, etc.) so you know what you scanned.

Decode a QR code

Use your webcam or upload a photo of the QR. The decoded text appears on the right.

  • Files never leave your device
  • Runs in your browser
  • Free, no signup

How it works

  1. 1

    Pick camera or upload

    Live webcam scan, or pick a photo of the QR. Both run jsQR in the browser.

  2. 2

    Wait for a lock

    Camera mode auto-detects every frame. Uploads decode immediately on selection.

  3. 3

    Read and act on the payload

    Decoded text is shown with the scheme label. Copy, open the URL, or scan again.

What this QR scanner does

Local jsQR decoder

Pure JavaScript, runs in your browser. The camera stream and uploaded images stay on your device.

Scheme-aware labels

URL, Wi-Fi, vCard, mailto, tel, SMSTO, geo, UPI, ICS, plain text. The result tells you what kind of QR you scanned.

Camera plus upload

Live camera for the fast case; image upload for low light, glare and other tricky prints.

Where this helps

QA

Verify your own printed QRs

Scan the print before mass-mailing. Confirm the decoded payload is what you encoded.

Safety

Check sketchy public QRs

Decode without opening. Read the URL first, decide if it is worth tapping Open.

Desktop

Decode QRs from screenshots

Upload a screenshot from a chat or email; decode without printing or scanning again.

Contacts

Copy contact details from a business card

Scan the vCard QR, copy the parsed fields, paste into Contacts.

Wi-Fi

Read Wi-Fi QRs without joining

Decode the password to paste into the join screen. Some travel routers need this.

Calendar

Verify event invites

Decode the ICS QR to read date, location and description before adding to your calendar.

Tips that help

  • 1

    Use upload for laminated prints

    Glossy laminate reflects light into the camera. A still photo with flash off decodes more reliably.

  • 2

    Hold steady, not close

    Phone cameras hunt for focus too near the lens. 15-20 cm is the sweet spot for most cameras.

  • 3

    Always read the URL before opening

    QR codes can point at phishing pages. The scheme label and full URL appear before the Open button.

  • 4

    Sharper photo, easier decode

    Higher resolution and good light beat tight cropping every time. Re-shoot if the first scan fails.

How the decoder reads a QR

QR codes encode their payload in a Reed-Solomon protected grid of dark and light modules. A scanner finds the three corner finder squares to lock orientation, walks the alignment markers, then reads the data modules in order. The decoder reconstructs missing or damaged modules with the redundancy bits the encoder reserved.

Camera mode samples every frame

When you click 'Use camera', the browser opens a `getUserMedia` stream from the back camera. The scanner copies each video frame onto a canvas, reads the pixels, and passes them to jsQR. jsQR finds the finder squares and decodes in one pass.

QR code scanner with webcam and image upload

We loop with `requestAnimationFrame` so the scanner runs at the camera's frame rate (typically 30 fps). As soon as a QR is detected, we stop the stream and show the result. Battery and bandwidth stay low.

If your camera is busy (another app or tab), the scanner falls back to an error. Close the other app and retry.

Image upload handles edge cases

Some QRs do not scan cleanly from a live camera: laminate glare, low light, heavy crop. For those, take a still photo and upload it.

The upload path tries both polarity inversions (`attemptBoth`), so a QR printed white-on-black decodes as readily as the standard black-on-white.

Resolution helps. A 1024×1024 photo decodes faster and more reliably than a 320×240 one. Most phone cameras produce 2000-3000 px wide images by default; those are fine.

Scheme classification routes the next action

After decoding, we inspect the prefix of the payload. `https://` becomes a URL with an Open button. `WIFI:` shows the credentials but cannot auto-join (browsers cannot configure system Wi-Fi). `BEGIN:VCARD` shows the contact fields; users can copy and paste into Contacts.

Payment URIs (`upi://`) display the deep link; on mobile the user can tap Copy and paste into a UPI app, but desktop browsers cannot launch UPI directly.

Read more

Plain text stays as plain text. Copy and paste into wherever you needed it.

Why scans fail

Print quality. A blurry print, glossy laminate or low contrast between dark modules and the background all reduce scan reliability. The finder squares need clean corners.

Camera focus. Mobile cameras hunt for focus near the minimum focus distance (about 10 cm). Hold the camera further away or use the upload path.

Encoding density. A long payload (vCard with photo, long URL) produces a dense QR with small modules. Print it bigger or shrink the payload.

Frequently asked questions

Honest answers to what people ask before using this tool.

Use your webcam or upload a photo. The scanner uses jsQR to decode the QR pattern into its raw text, classifies the URI scheme (URL, mailto, Wi-Fi, vCard, etc.) and shows the decoded payload. Everything runs in your browser.

Yes, in Safari on iOS 11 and later. The first scan asks for camera permission; tap Allow. The viewfinder appears and the scanner samples every animation frame. As soon as a QR is detected, the camera turns off and the decoded text appears.

Browsers gate camera access behind explicit user consent. The first time you click 'Use camera' the browser prompts; we never see the camera stream. Click Allow once and the browser remembers for this site.

Yes. Click Upload image and pick the screenshot. The scanner reads PNG, JPG, WebP and GIF. As long as the QR is reasonably sharp and not heavily cropped, the decoder reads it. Heavy blur or partial QRs fail.

Yes for image uploads (the decoder tries both polarities). The camera mode skips the inversion attempt for speed; if a live inverted QR fails, screenshot it and use the upload path.

URL, mailto:, tel:, sms:/SMSTO:, WIFI:, geo:, upi://, BEGIN:VCARD, BEGIN:VCALENDAR and plain text. Each is labelled in the result so you know what you scanned before tapping Open.

Read the URL first. QR codes can point at phishing pages or malware. A printed sticker on a public surface should be treated with the same caution as a link in an unsolicited email. We label the scheme and show the full URL so you decide before opening.

Three common reasons. The image is too blurry (try a sharper photo). The QR is partially cropped (re-frame). The QR is encoded at a damage level higher than the print can sustain (e.g. heavy glare on a laminate). Try the upload path with a higher-resolution photo.

Only in this browser tab's memory while you stay on the page. Refreshing or closing the tab clears the history. We never send the decoded text anywhere.

Camera scanning needs enough light to focus. A dim bar with a printed Wi-Fi QR often fails on the live camera; uploading a flash-on photo of the same QR works. The image-upload path is the fallback for low light.

Further reading

Independent references if you want to go deeper on the formats and tradeoffs.