Drop in a screenshot or a photo and see exactly what the code contains — the link, the WiFi password, the contact card — before you act on it. The image is read in your browser and never uploaded.
or click to choose one — PNG, JPG, WebP, GIF or BMP.
A screenshot, a photo of a poster, a code saved from an email.
A QR code is unreadable to a person. That is the whole appeal and it is also the whole problem: nothing about the pattern tells you where it goes, so a sticker placed over a real code on a parking meter, a restaurant table or a parcel locker is invisible until somebody has already scanned it. The practice is common enough to have a name — quishing — and it works on exactly the people who are being careful in every other way.
Phone cameras have started showing the destination before opening it, which helps, but the preview is small, it is shown for a moment, and a long address is truncated in the middle where the interesting part usually is. Dropping the image here shows you the whole thing as text, in a form you can read at your own pace, and it does not make the link clickable until you have.
There is a second case the camera cannot do at all: a code that arrives as a picture. A screenshot somebody sent you, a code in a PDF or an email, a photo taken from across a room. Your phone will not scan its own screen, and pointing one phone at another is a poor substitute for reading the file.
Four things are worth a second look, and all four are properties of the text itself rather than guesses about intent:
| Flag | Why it matters |
|---|---|
Not https | A plain http link is readable and alterable in transit. For a login or a payment that is disqualifying. |
| A link shortener | The address you can see is not the address you will land on. A shortener is normal in marketing and also the easiest way to hide a destination. |
An @ before the domain | In https://paypal.com@evil.example/ the real host is evil.example; everything before the @ is ignored by the browser. It is an old trick and it still works on people. |
| A lookalike domain | A host written with non-Latin characters can be made to resemble a familiar brand. The address bar may show it correctly and the eye still reads the wrong thing. |
What it cannot tell you is whether a perfectly ordinary-looking address is trustworthy. A code pointing at a real domain over https with no shortener passes every check here and can still be a page collecting your card details. These flags narrow the field; they do not clear it.
Most QR codes hold a plain link, but the useful ones hold structured text in a format phones understand, and that text is not meant to be read raw. A WiFi code is WIFI:T:WPA;S:MyNetwork;P:hunter2;;, which says rather more once it is laid out as three fields. The scanner recognises and labels links, plain text, WiFi, vCard and MeCard contacts, phone numbers, SMS, email, WhatsApp, locations, calendar events, UPI and SEPA payments, crypto addresses and app store links.
That list is the same one the generator writes, which is not a coincidence — this page reads the formats that page produces, using the same decoder the generator already runs against its own output before letting you download it.
Usually one of four things, in rough order of how often it happens.
Cropping tightly to the code — but leaving a little white around it — fixes most of the first two.
Nothing of yours. This page contains no fetch, no XMLHttpRequest, no sendBeacon and no form, so the image has no route off your machine; it is read with FileReader, drawn onto a canvas in your tab, and decoded by JavaScript there. The only things fetched are the decoder library from jsDelivr — a static file, identical for every visitor, that carries nothing of yours — and this site's own header, fonts, analytics and ad script, as on any page here.
You can check that in about thirty seconds: open your browser's Network tab and drop an image in. If the camera is used, the frames stay in the page too — nothing is recorded and nothing is sent.