Scan QR codes from images or using your camera. Supports URLs, WiFi, contacts, emails, phone numbers, and more. 100% offline - no data uploaded.
Scan and decode QR codes from uploaded images or your device camera. Point, scan, and get the encoded content, whether it is a URL, text, contact card, or Wi-Fi credentials. The decoded result is displayed instantly and ready to copy.
Related reading
Initializing in your browser…
Scan barcodes from images or camera. Supports EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, ISBN, and more. Search products instantly.
Test how your images and designs appear to people with different types of color vision deficiency including protanopia, deuteranopia, tritanopia, and more
Crop and trim images with precision visual selection. Features aspect ratio presets (1:1, 16:9, 4:3), free-form cropping, grid overlays, and pixel-perfect adjustments for professional results.
You have a screenshot containing a QR code and need the URL it encodes without scanning with a phone.
Input
flyer_photo.jpg (QR in the corner)
Decoded
https://example.com/promo?code=SPRING24
The decoder locates and reads the QR matrix from an uploaded image (or webcam), returning the raw payload so you can inspect a link before trusting it, safer than blindly opening it on a phone. It also reads contact, Wi-Fi, and text payloads.
Scan and decode QR codes from uploaded images or your device camera. Point, scan, and get the encoded content, whether it is a URL, text, contact card, or Wi-Fi credentials. The decoded result is displayed instantly and ready to copy.
Decode a QR code from a screenshot or photo to get the link without scanning with your phone.
Read ticket or pass QR codes to verify their content.
Scan a Wi-Fi QR code to extract the network name and password.
Decoding is handled entirely in the browser by the jsqr library, which is loaded on demand only when you actually scan. The tool offers two input paths that use different decoder settings. When you upload an image, it is drawn to an off-screen canvas and the pixel buffer is passed to jsQR with inversionAttempts set to 'attemptBoth', so the decoder tries both normal (dark-on-light) and inverted (light-on-dark) codes, which catches photos of screens or inverted-print labels. The live camera path requests a getUserMedia stream at an ideal 1280x720 with facingMode 'environment' (the rear camera, with a switch button to flip to 'user'), then scans every animation frame with inversionAttempts set to 'dontInvert' for speed, stopping the camera the instant a code is found. Nothing is uploaded: images become object URLs that are revoked after the read, and camera frames stay in a canvas with willReadFrequently enabled, so the entire pipeline runs offline.
Beyond returning the raw string, the tool classifies the payload by matching well-known QR encoding schemes and renders an appropriate action. It recognizes http(s) URLs (with an Open Link button), mailto: (extracts the address, Send Email), tel: (Call), sms:/smsto: (Send SMS), geo: coordinates (which it turns into a https://www.google.com/maps?q= link), vCard payloads beginning with BEGIN:VCARD (it pulls the FN field as the contact name), and calendar events beginning with BEGIN:VEVENT or BEGIN:VCALENDAR (pulling the SUMMARY line). WiFi codes in the standard WIFI:S:...;T:...;P:...; format get special treatment: the tool parses out and lists the SSID (S:), the security type (T:, e.g. WPA), and the plaintext password (P:) as separate fields, since most phones hide the password when they auto-join. Anything that matches none of these falls back to a plain-text result, truncated to 100 characters in the preview while the full string remains copyable.
Results accumulate in an in-session Recent Scans list capped at the 20 most recent entries, each tagged with the source ('via image' or 'via camera') and a timestamp; clicking an entry re-displays it and a per-row copy button grabs its data. This history lives only in component state, so it clears on reload rather than persisting to storage. The classifier is heuristic and prefix-based, not a strict validator: it keys off leading tokens like WIFI:, geo:, or BEGIN:VCARD, so a malformed WiFi string still shows whichever of S:/T:/P: fields it can regex-match. If a scan fails, the image path reports 'No QR code found' and suggests a clearer image or different angle, which usually means the code was blurry, too small in frame, or lacked the surrounding quiet-zone margin jsQR needs to lock onto the three finder-pattern squares.
Standard QR codes encoding URLs, plain text, vCards, Wi-Fi credentials, calendar events, and more.
Yes. Upload any image containing a QR code and it will be decoded.
Yes, on devices with camera access and a supported browser.
Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.