QR Code Scanner
Scan QR codes with your camera, or decode them from an image. All processing happens in your browser.
Scan QR codes with your camera or from an image file. Everything runs in your browser, nothing is uploaded. Free, offline, works on desktop and mobile. Read more Show less
What is a QR code scanner?
A QR code scanner reads the pattern of black and white squares in a QR code image and decodes it back into the original text, URL, or data. QR codes are used for sharing URLs, WiFi credentials, contact cards, payment links, and short messages that are easier to scan than to type.
This tool decodes QR codes entirely in your browser - either from your device camera (live scan) or from an uploaded image. Nothing is uploaded, and the camera stream never leaves your device.
How to use
Camera mode: click Start camera, allow the permission prompt, and point your device at a QR code. The tool scans continuously and shows the first result it can decode. Works on desktop, tablet, and phone. On phones it uses the rear camera by default.
Upload mode: drop or select an image file containing a QR code. PNG, JPG, WebP, and screenshots all work. The tool decodes the QR code in the image and shows the result.
Every scanned result appears with a copy button and, if the content is a URL, an "Open" button.
Privacy
The camera stream is processed locally in your browser using the getUserMedia API and decoded with jsQR. No frames are recorded, uploaded, or sent anywhere. Uploaded images are read into memory and discarded immediately after decoding.
You can verify this by opening your browser's Network tab - nothing is sent after page load.
Why doesn't it decode?
Three common reasons:
Camera or image quality. QR codes need to be sharp and well-lit. Blurry photos, extreme angles, or glare prevent decoding. Move the camera closer and hold steady.
Low resolution. The camera stream must be large enough to see the individual squares. On some devices the default stream is too small. Move closer so the QR code fills the frame.
Damaged or covered QR code. A QR code with a torn corner, heavy shadow, or overlaid logo may still work if error correction can recover the missing data, but too much damage makes it unreadable.
FAQ
Does the tool work offline?
Once the page is loaded, yes. Scanning uses only the browser's camera API and local JavaScript. No network calls are made.
Does my camera stay on after I close the page?
No. The camera stream is stopped automatically when you close the tab or navigate away.
Can I scan QR codes from my screen?
Yes. Take a screenshot and use the Upload mode - or point your phone's camera at your computer screen. Both work.
What formats does the decoded text come in?
The QR code itself only contains raw bytes. This tool shows them as text. If the content is a URL, it shows an Open button. If it looks like structured data (WiFi, vCard, MeCard), the raw text is preserved and you can copy it.
Can I scan multiple QR codes at once?
The tool decodes one QR code per image or per frame - whichever it finds first. To scan multiple codes, position the camera over each in turn.
Is there a size limit for uploaded images?
No hard limit, but very large images (over ~8000 pixels on a side) may be slow to process. Resize to 2000x2000 or smaller for best results.
Does it read barcodes too?
No. QR codes and 1D barcodes (EAN, UPC, Code128) are different formats. This tool decodes QR codes only.
Command line equivalent
# Python with opencv
pip install opencv-python
python3 -c '
import cv2
img = cv2.imread("qrcode.png")
data, points, _ = cv2.QRCodeDetector().detectAndDecode(img)
print(data)
'
# zbar (any Unix)
sudo apt install zbar-tools
zbarimg qrcode.png
# Node with jsQR
npm i jsqr pngjs
node --input-type=module -e '
import jsQR from "jsqr";
import { PNG } from "pngjs";
import fs from "fs";
const png = PNG.sync.read(fs.readFileSync("qrcode.png"));
const result = jsQR(new Uint8ClampedArray(png.data), png.width, png.height);
console.log(result ? result.data : "(no QR code found)");
'
# Phone
# Most phone camera apps decode QR codes natively.