WikiPlus

QR Scanner

Decode QR codes from uploaded images or directly with your phone camera. Supports URLs, Wi-Fi, vCards, text, one-time-password seeds. 100% client-side, nothing is uploaded.

Local processing
1.4s avg
4.8 out of 5 — based on 1,247 uses

By Sergio Robles — Founder

Drop a QR code image here or click to upload
PNG, JPG, WebP, GIF — any image with a visible QR code
PNG · JPG · WebP
Your files are processed locally in your browser. We never upload or store your data.

What is QR Scanner?

The QR Scanner decodes standard QR codes from either an uploaded image or your device's rear camera. Drop a screenshot, photo of a poster, receipt, boarding pass, or business card onto the dropzone and the decoded text appears in seconds — URLs become clickable links, Wi-Fi payloads are flagged so you can safely copy the password, vCard blocks are recognised, and otpauth:// seeds for two-factor authentication are labelled as sensitive so you know to handle them carefully. The camera mode uses the live rear camera through the standard getUserMedia API and a frame-by-frame decoder that stops automatically the moment a valid code is found. Everything runs client-side through the open-source jsQR library — the image bytes and camera frames never leave your browser, which is essential when what you are scanning is a Wi-Fi password, a crypto-wallet address, or a 2FA recovery code. Works offline once the page has loaded.

When should I use this tool?

  • Quickly paste the Wi-Fi password from a café's wall sign into your phone without retyping a long random string.
  • Grab the URL behind a restaurant table QR menu into a regular browser when the default scanner app opens an ad-laden wrapper.
  • Save a new contact from the vCard QR on a business card directly into your address book instead of manually typing the details.
  • Decode a 2FA QR from a screenshot to re-enrol a new phone without losing access to an authenticator-protected account.

How do I scan a QR code from an image or camera?

  1. 1Pick your input source: 'Upload image' for a photo or screenshot, or 'Use camera' to decode live frames from your device.
  2. 2If uploading, drag and drop the image onto the dashed zone or click it to open the file picker — PNG, JPG, GIF, and WebP all work.
  3. 3If using the camera, tap 'Start camera' and grant the permission prompt; point the rear lens at the QR code until a green result appears.
  4. 4Read the payload classification badge (URL, Wi-Fi, vCard, etc.) so you know what kind of data just came out of the code.
  5. 5Click 'Copy' to put the decoded string on your clipboard, or click the URL link directly if the payload is a web address.

Frequently asked questions

Is my image or camera feed uploaded to your server?

Absolutely not — the QR scanner runs entirely in your browser using the JavaScript ZXing-js library, a port of the battle-tested ZXing (Zebra Crossing) barcode decoding engine originally written in Java. When you upload an image file, it is read directly into a Canvas element via the FileReader API and decoded in memory; it never touches a network socket. When you use the live camera mode, the MediaDevices.getUserMedia() Web API streams frames from your camera directly into a video element, and still frames are captured onto a Canvas for decoding — all within the browser process, with no frames sent anywhere outside your device. WikiPlus has no backend endpoints that receive image data, and there is no telemetry capturing what codes you scan or what data they contain. This architecture is intentional: QR codes often carry sensitive payloads such as authentication tokens, personal URLs, payment addresses, or private text, and processing them locally ensures that data stays private. You can verify this yourself by opening your browser's DevTools Network tab before scanning — you will see zero outbound requests during the decode operation. The library supports multiple barcode symbologies and decodes synchronously in the main thread, making results near-instantaneous. As a practical tip, for best privacy on sensitive QR codes such as 2FA setup keys or payment links, use this tool in airplane mode after the page has loaded — everything will work identically with no network at all.

Why does the camera mode fail to start?

Camera access in browsers is governed by the Permissions API and the MediaDevices.getUserMedia() specification, both of which impose strict requirements that can cause startup failures in several ways. The most common reason is that the browser either has not been granted camera permission for this site, or a previous denial is cached — check your browser's site settings and reset the camera permission, then reload the page. A second frequent cause is that getUserMedia() requires a secure context: the page must be served over HTTPS or from localhost; if you somehow access it over plain HTTP, the API is entirely unavailable. On mobile devices, many browsers route camera access through the system-level permission manager, so even if the browser permission appears granted, the operating system permission for that browser app may be off — check iOS Settings or Android App Permissions. If another application such as a video call app currently holds an exclusive lock on the camera, the browser may receive a NotReadableError or TrackStartError and fail silently or with a generic message. On desktops with multiple cameras — a built-in webcam plus a USB device — the browser may try to open the wrong device; refreshing sometimes selects the correct one, or you can modify the facingMode constraint if the tool exposes that option. Finally, some privacy-focused browsers or browser extensions block getUserMedia() entirely. As a practical tip, if camera mode keeps failing, switch to the image upload mode instead — screenshot a QR code and upload it for equally accurate results.

Which QR code types can it read?

The scanner uses ZXing-js, which supports a broad range of one-dimensional and two-dimensional barcode symbologies beyond standard QR codes. In the 2D category it decodes QR Code (all versions 1–40, including Micro QR), Data Matrix, Aztec Code, and PDF417. In the 1D barcode category it handles EAN-13, EAN-8, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF (Interleaved 2 of 5), Codabar, RSS-14, and RSS Expanded. Standard QR codes can encode URL, plain text, Wi-Fi credentials, vCard contact data, geographic coordinates, calendar events, email addresses, phone numbers, and arbitrary binary data — the scanner returns the raw decoded string regardless of content type, so all of these work. QR code version capacity ranges from version 1 (21×21 modules, up to 41 alphanumeric characters) to version 40 (177×177 modules, up to 4,296 alphanumeric characters or 2,953 bytes of binary data). Inverted QR codes — white modules on a dark background — are supported by some builds of ZXing; if decoding fails on an inverted code, inverting the image manually before uploading usually resolves it. Damaged or partially obscured codes are recoverable up to the erasure tolerance of the error-correction level embedded in the code (7% for level L up to 30% for level H). All decoding runs entirely in your browser — no data leaves your device. As a practical tip, crop tightly around the QR code before uploading for significantly faster and more reliable detection, especially on complex photographic backgrounds.

Why did decoding fail on my perfectly good-looking photo?

A visually clean QR code in a photo can still defeat a decoder for several technical reasons. The most common culprit is perspective distortion: if the code was photographed at an angle rather than face-on, the modules become trapezoidal, and while ZXing includes a perspective-correction pass, extreme angles beyond roughly 30 degrees can push it past recovery. Lighting is the second major factor — a glare hotspot or deep shadow that appears subtle to the human eye can cross the binary threshold and flip critical modules from black to white in the sampled pixel data. JPEG compression is another frequent cause: JPEG uses discrete cosine transform encoding that blurs high-frequency transitions, which are exactly the sharp black-to-white edges a QR decoder relies on. If the image was re-compressed multiple times, edge ringing artifacts can corrupt finder pattern detection. Very small QR codes in high-resolution photos can also fail because the decoder's finder-pattern search operates on a fixed scale — downsampling the image so the QR occupies a larger portion of the frame often resolves this. Dark or low-contrast color combinations, such as dark navy on black, may look readable to your eye but fall below the luminance contrast threshold the binarization algorithm needs. All processing runs entirely in your browser — no data leaves your device. As a practical tip, open the photo in any image editor, crop to just the QR code, boost contrast slightly, save as PNG rather than JPEG, and then try the upload again — this resolves the vast majority of stubborn failures.

Content on this page is available under CC BY 4.0.