QR Code Generator
Generate a QR code from any URL or text. Download as PNG or SVG. No account, no watermark. Works offline after load.
Open toolHome › Tools › Developer Tools › QR Code Reader
Upload an image containing a QR code, or scan one live with your camera. Decodes instantly and shows the full content. Free, no account, nothing stored.
Drop a QR code image here, or click to browse
PNG, JPG, WEBP accepted · Max 10 MB
Decoding QR code…
QR Code Reader decodes QR codes from any image you upload — PNG, JPG, or WEBP — or from a live camera feed. Decoding runs entirely in your browser using jsQR, an open-source MIT-licensed JavaScript library. Neither the images you upload nor the camera frames are sent to any server. After the initial page load, decoding requires no network activity at all. The decoded result — a URL, plain text, Wi-Fi credentials, vCard contact, or other payload — appears in under a second for typical images.
Who uses it: developers verifying that a QR code generation feature produces the correct payload; security researchers checking a QR sticker's encoded URL before scanning with a phone; event staff decoding a printed QR ticket to inspect its content; IT admins reading embedded credentials from a network provisioning QR without scanning it through a phone.
jsQR (version 1.4.0) is a pure JavaScript QR decoder that works on ImageData arrays read from an HTML canvas. The decode sequence: (1) the image or camera frame is drawn to an off-screen canvas; (2) getImageData() retrieves the raw RGBA pixel values; (3) jsQR converts to grayscale and scans for finder patterns — the three bordered squares in the QR code's corners that define its orientation and boundaries; (4) a projective transform corrects for perspective tilt and rotation; (5) the module bit matrix is sampled; (6) Reed-Solomon error correction decodes the data codewords — QR codes at Level H can recover from up to 30% damage; (7) the mode indicator and character count determine how to interpret the payload (numeric, alphanumeric, byte, or kanji mode); (8) the result is returned as a UTF-8 string.
Clicking "Scan with camera" requests camera access via the browser's getUserMedia API (WebRTC). Frames are drawn to the same off-screen canvas in a requestAnimationFrame loop and decoded by jsQR on each frame. When a QR code is detected, the frame loop stops automatically and the result is shown. No camera frames are transmitted to any server. Clicking "Cancel camera scan" immediately releases the camera and stops frame capture.
Camera scanning works on Chrome and Firefox for Android, and Safari on iOS 11+. The page must load over HTTPS (which AT USE provides) for getUserMedia to be available on iOS.
jsQR decodes standard QR codes (ISO/IEC 18004). It does not decode Data Matrix codes (used in pharmaceutical and postal labels), Aztec codes (used on boarding passes and transit tickets), PDF417 barcodes (driver's licenses, some event tickets), or 1D barcodes (EAN-13, UPC, Code 128). For those formats, a different decoder is required. If the image contains a 2D code that is not a standard QR code, the tool will return "No QR code found."
QR codes can encode any byte sequence. Common payload formats: URLs (http:// or https://), plain text, Wi-Fi credentials (format: WIFI:S:NetworkName;T:WPA;P:Password;;), vCard 2.1 and 3.0 contact records, email addresses (mailto:), phone numbers (tel:), SMS drafts (smsto:), calendar events (BEGIN:VCALENDAR), and geo-coordinates (geo:). The decoded content is displayed as plain text. For URL payloads, the tool renders a clickable link — verify the full URL before clicking, as QR codes can encode phishing URLs that look legitimate at a glance.
No. jsQR runs entirely in your browser as a client-side JavaScript library. Images you upload are read with the browser's FileReader API and drawn to an off-screen canvas in memory. Camera frames are drawn to the same canvas locally. After the page loads, decoding requires no network requests. Your image and decoded content never leave your device.
Common causes: the QR code occupies a small fraction of the image (fewer than ~20×20 pixels at the code boundary), the image is blurry or motion-blurred, glare is washing out the dark modules, or the code is damaged beyond jsQR's error correction capacity. Try cropping the image to isolate the QR code and remove surrounding content, taking a cleaner photo, or photographing from a different angle. For QR codes on reflective surfaces, adjust the lighting to reduce glare.
Any byte sequence. Common formats include URLs, plain text, Wi-Fi credentials (WIFI:S:NetworkName;T:WPA;P:Password;;), vCard contact data, email addresses (mailto:), phone numbers (tel:), SMS drafts (smsto:), calendar events (BEGIN:VCALENDAR), and geo-coordinates (geo:lat,lon). The decoded result is shown as plain text; URL payloads get a clickable link button.
Yes. Camera scanning works on Chrome and Firefox for Android, and Safari on iOS 11+. The page loads over HTTPS, which is required for getUserMedia on iOS. For best results, hold the phone steady and position the QR code so it fills at least one-third of the camera frame in good lighting.
Standard QR codes as defined by ISO/IEC 18004, including all error correction levels (L, M, Q, H) and all four data encoding modes (numeric, alphanumeric, byte, kanji). It does not decode Data Matrix, Aztec Code, PDF417, or 1D barcodes (EAN, UPC, Code 128, Code 39). For a code that is clearly a square 2D matrix but not decoding, try increasing image resolution or trying a different photo angle.
Depends on the error correction level encoded in the QR code. Level L: up to 7% of modules can be damaged. Level M: up to 15%. Level Q: up to 25%. Level H: up to 30%. Most QR codes printed for public use are Level M or L. If more than 15–30% of the code is obscured, torn, or unreadable in the image, decoding will fail. A cleaner photo from a different angle sometimes recovers enough modules for a successful decode.
Yes — 10 MB per image. Most QR code images (screenshots, phone photos) are well under 1 MB. Very large photos from high-resolution cameras might exceed the limit; resize or crop the image before uploading.
Also try
Generate a QR code from any URL or text. Download as PNG or SVG. No account, no watermark. Works offline after load.
Open toolGenerate Code 128, EAN-13, UPC-A, and other standard barcodes from any value. Download as SVG or PNG.
Open toolConvert text, decimal, or hex to binary and back. Pure browser JavaScript — nothing sent to any server.
Open toolEncode any text or binary data to Base64 or decode Base64 back to readable text. Browser-only, nothing stored.
Open tool