The workflow
Screenshot the QR code, upload to our QR scanner, copy the decoded text or open the link.
The scanner uses the same decode library (jsQR / zxing-style finder pattern detection) that phone camera apps use, but runs it on a still image instead of a video feed. The result is identical: the encoded payload as text, ready to copy.
- Take a screenshot that contains the QR code (any phone or desktop screenshot tool).
- Open the QR Code Scanner.
- Drop the screenshot.
- Click Scan QR codes.
- Copy the decoded text or open the link.
When you have multiple codes
If the image contains more than one QR code, the scanner lists each decoded value separately. Use Copy all to grab every result at once.
The detector finds each code's three corner finder patterns independently, so it can decode several codes from the same image without confusion. PDFs with a grid of QR codes (event check-in sheets, batch ticket exports) decode cleanly — convert each PDF page to an image first, then run the scan.
How QR decoding actually works
Every QR code has three large square finder patterns in three of its corners. The decoder scans the image looking for the characteristic 1:1:3:1:1 ratio of dark-light-dark-light-dark bands that those patterns produce when crossed by a scan line. Once it finds three of them, it knows the code's position, rotation, and approximate size.
After locating the code, the decoder samples each module (the smallest square unit) at known grid positions and reads it as a 1 or 0. The bit stream goes through Reed-Solomon error correction, which can recover up to 30% of the code even if it's partly damaged. That's why QR codes still work when partially obscured by logos, glare, or smudges.
Screenshots are easier to decode than camera photos because there's no perspective distortion or lens blur — every module is a clean pixel block. The only failure modes for screenshot decoding are very small codes (under about 80 px wide) or codes that have been re-saved as low-quality JPGs and got smeared into illegibility.
What QR codes can contain
URLs are the obvious case, but QR codes can encode anything that fits in their data budget (up to about 4296 alphanumeric characters or 2953 bytes for the largest version). Common payload types beyond URLs:
WiFi credentials in the format WIFI:S:network_name;T:WPA;P:password;; that mobile cameras recognise and offer to join automatically.
vCard contact records that the scanner offers to add to your address book.
Email mailto links pre-filled with subject and body.
Phone numbers as tel: links that dial immediately.
Calendar events in iCal format that import directly into your calendar.
Plain text for anything that doesn't fit a structured type.
When the scanner can't read the code
Codes printed on curved surfaces and photographed at an angle. The decoder needs the finder patterns to read as squares; perspective distortion warps them into trapezoids. Re-take the photo head-on or crop and de-skew first.
Heavily compressed JPGs of QR codes. JPEG's chroma subsampling smears the boundaries between black and white modules. If the code is below about 200 px wide and saved at JPG quality 50 or lower, the modules can blur into illegibility. The fix is to find a higher-resolution source or to use PNG.
Codes with custom logos or designs overlaid. Modern QR codes often have a brand logo in the center. Error correction handles small overlays (under about 20% of the code area) but heavily styled designer QR codes sometimes push past what the decoder can recover. Try a generic scanner first; if it fails, the code may need its original error-correction-aware decoder.
Inverted colors (white modules on dark background). Standard QR specification allows either polarity, but some decoders default to assuming dark modules on a light background. If your code is white on black, invert the image first with any image editor.
Real-world cases where screenshot scanning beats the camera
QR codes in PDFs. Event tickets, boarding passes, invoices, and tax documents often arrive as PDFs with embedded QR codes. Pointing a phone camera at your laptop screen produces glare, focus issues, and inevitable failed scans. Screenshotting and uploading is faster and more reliable.
QR codes in videos and webinars. A speaker shares a QR on a slide that flashes by in seconds. Pause, screenshot, scan — done. Trying to catch the live moment with your camera is a coordination problem you'll lose.
QR codes in chat messages. Someone messages you a QR code to join a chat group, claim a discount, or download an app. The image is already on your phone; there's no camera workflow that makes sense. Upload the image directly to the decoder.
Email signatures with QR contact cards. The QR contains a vCard with the sender's contact details. Decode it, parse the vCard, save the contact — one click each step. Faster than any camera-based workflow.
Tools and alternatives
On iPhone: long-press a QR code image in Photos and iOS offers to open the encoded link directly. Built in, no extra tool needed, works for codes already in your camera roll.
On Android: Google Lens recognises QR codes in saved images via the Photos app's Lens button. Same idea as iOS, just one extra tap.
Browser extensions like 'QR Code Reader' for Chrome let you right-click any image on a page and decode it. Useful when the QR is embedded in a webpage you're already viewing.
Command-line: zbarimg and the Python qrcode library decode QR codes from image files in scripts. Useful for batch processing or automated ticketing workflows where many codes need scanning at once.
Check where the code leads before you follow it
A QR code carries no visual indication of its destination. A phishing link and a legitimate one produce patterns that look equally arbitrary, and there is no equivalent of hovering over a hyperlink to preview it.
Decoding to text separates the read from the visit. You get the URL as a string, look at it, and then decide — which removes the entire class of attack that depends on you not knowing where you are going.
Read the domain rather than the path. Everything after the first single slash is chosen by whoever made the link and proves nothing about who they are.
Malicious codes are a real and growing problem
The physical version is a sticker placed over a legitimate printed code. Parking meters, restaurant tables, electric vehicle chargers, and public transport posters are the usual targets, because payment is expected there and people are in a hurry.
The digital version has a name, quishing, and it exists because a code in an email is an image. The link-scanning that most mail security depends on has nothing to inspect, so the code passes filters that would have caught the same URL as text.
Before scanning anything physical, look at the surface. A sticker over print is usually visible as a raised edge, a slight misalignment, a different paper finish, or a code that overlaps the surrounding design.
Improving a code that will not decode
Crop tightly to the code and nothing else. Surrounding content gives the detector more places to look and more opportunities to lock onto the wrong thing.
Keep the quiet zone — the blank margin around the code — inside your crop. The detector uses it to establish the code's boundary, and cropping right up to the pattern edge is a common reason decoding fails on an otherwise clean image.
Do not upscale a small code. A blurry enlargement decodes worse than the small original, because interpolation smears the module boundaries the decoder is looking for. If the image is soft rather than small, a sharpening pass sometimes recovers enough module definition to make the difference.
Why error correction saves most codes
QR codes carry Reed-Solomon error correction at one of four levels, from roughly 7 percent recovery at the lowest to about 30 percent at the highest. That is why codes with logos printed in the middle still work.
It means partial damage is survivable. A code with a fingerprint over part of it, a fold through one corner, or a section obscured by glare will often decode anyway.
It is not unlimited. Damage beyond the correction level, or damage to the three large finder patterns in the corners, defeats it. Those squares are how the decoder locates and orients the code, and losing one usually means losing the code.
Codes that are not links
QR codes can carry plain text, WiFi credentials, contact cards, calendar events, phone numbers, and payment strings. Each type causes a different action when a phone acts on it automatically.
A WiFi code joins you to a network, which is worth considering in a public place. A contact card writes to your address book. A phone number code can dial a premium-rate line. A payment code can arrive pre-filled with an amount and a recipient.
Decoding to text tells you which type you have before your phone does anything with it, which is the practical argument for reading codes as images rather than through a camera app.
Frequently asked questions
Does it work on phone screenshots?
Yes. Phone gallery screenshots upload directly from the camera roll.
Can it decode WiFi or vCard QR codes?
Yes — anything stored as text inside the QR. You may need to format the decoded result manually.
What about PDF files?
Extract the page as an image first (any PDF-to-image tool works), then drop the image into the scanner. The decoder doesn't read PDFs directly.
Is my data uploaded anywhere?
No. The decoding runs in the browser. The image and its decoded contents stay on your device.
Can it decode partly obscured codes?
Often yes, thanks to QR's built-in error correction. Codes can lose up to 30% of their area and still decode at the highest error correction level. Heavily damaged or partly missing codes are not recoverable.
Is it safe to scan an unknown QR code?
Safer if you decode it to text first and read the destination before deciding. Camera apps decode and immediately offer to open, which puts the decision after the fact.
What is quishing?
Phishing using QR codes. A code in an email is an image, so the link scanning most mail security relies on has nothing to inspect.
Why will my code not decode even though it looks fine?
Often the quiet zone was cropped off. The decoder uses that blank margin to find the code boundary, so include it in your crop.