Quick Response (QR) Code Decoder
Decode a QR image locally, inspect the recovered payload, and flag suspicious links or sensitive OTP and Wi-Fi data before opening.{{ summaryTitle }} {{ summaryValue }} {{ summaryLine }} {{ badge.label }} {{ badge.value }}
Recovered payload
{{ resultValues.safety_label }}{{ decodedSuccessfully ? resultValues.payload_text : resultValues.error_message }}
{{ resultValues.safety_detail }}
| Field | Value | Review note | Copy |
|---|---|---|---|
| {{ row.label }} | {{ row.value }} | {{ row.note }} |
| Check | Status | Detail | Suggested action | Copy |
|---|---|---|---|---|
| {{ row.label }} | {{ row.status }} | {{ row.detail }} | {{ row.action }} |
The square pattern is only the transport. The recovered payload may be plain text, a website, a contact card, a Wi-Fi setup string, a phone action, or an authenticator secret. Decoding the symbol before acting exposes that difference.
A Quick Response (QR) symbol arranges data and recovery information in a grid of light and dark modules. Large finder patterns establish orientation, alignment features help with distortion, and a quiet zone separates the symbol from surrounding artwork. Error correction can recover some damage, but it cannot compensate for every blur, crop, reflection, perspective change, or low-contrast design.
Image quality and payload safety are separate questions. A perfectly readable code can point to a spoofed login page or contain a secret. An unreadable code may simply be too small, sideways, inverted, over-compressed, tightly cropped, or missing enough quiet zone for the detector to locate it.
| Payload | Possible action | Review before continuing |
|---|---|---|
| Web URL | Open a browser destination | Host spelling, HTTPS, redirects, punycode, private hosts, and embedded credentials |
| OTP setup | Add an authenticator account | The provisioning URI may contain an account secret |
| Wi-Fi | Join a network | Network name, security mode, and password exposure |
| Email, phone, SMS, or map | Start a device action | Recipient, number, location, and prefilled content |
| vCard or MeCard | Import a contact | Every personal-data field before saving or sharing |
How to Use This Tool:
Begin with the smallest scan plan that fits the image, then add retries only when the first pass cannot recover a payload.
- Choose Local image file and add one PNG, JPEG, WebP, GIF, or SVG image. Use the text-source mode only for a direct image URL, a data-image URI, or raw base64 PNG data.
- Select Decode QR with the upright, original-scale defaults. A decoded result opens Payload review; a failed search reports that no payload was found in the configured plan.
- If the image is sideways, select a wider Rotation search. Add Extra scale passes for a small or compressed symbol and Inverted-color pass for light modules on a dark background.
- For a very large screenshot, set a Longest-edge cap to create a smaller base raster. Then decode again and compare the winning angle, scale, polarity, and attempts in Search effort.
- Read the recovered text and Safety review before selecting Open link. Confirm a URL independently when the host is shortened, private, encoded as punycode, or otherwise unexpected.
Interpreting Results:
A decoded payload proves that one raster pass produced text. It does not prove that the text is benign, that a URL reaches the visible host after redirects, or that an OTP or Wi-Fi value is safe to share. HTTPS link means only that the parsed URL uses HTTPS and avoids the specific local warning rules.
The safety labels are focused cues. Sensitive OTP, Wi-Fi secret, and Credentials in URL call for restricted handling. HTTP link, Private host, Punycode host, and Short link call for verification. Plain text receives no open action, but its contents can still be deceptive.
A no-payload result is not proof that the image contains no QR code. It means every configured angle, scale, and polarity was tried without a successful decode. A sharper image, more quiet zone, a tighter but complete crop, or another scanner may still succeed.
Technical Details:
The source image is decoded into pixels and optionally reduced so its longest edge does not exceed the requested cap. Each configured scale is rasterized at every configured quarter-turn angle. Normal polarity is tried first, followed by an inverted pass when enabled. Each pass is offered to two QR decoders before the search advances.
Formula Core:
The maximum number of raster attempts is the product of angles, scales, and polarities.
Upright mode has one angle, left/right mode has three, and all-quarter-turn mode has four. Extra scale passes change the scale count from one to three by adding 85% and 70% rasters. Inversion changes the polarity count from one to two. The largest plan is therefore 4 × 3 × 2 = 24 attempts.
Transformation Core:
- Resolve a local file, direct HTTP(S) image, data-image URI, or raw base64 PNG source and require dimensions from 1 to 16,384 pixels per side.
- Apply the optional longest-edge cap, then create scale, rotation, and polarity passes in a deterministic order.
- Stop at the first successful decoder result and record recovered text, decoder, angle, effective scale, polarity, byte or bit metadata when available, and attempts used.
- If the full budget is exhausted, return a no-payload result rather than empty decoded text.
Rule Core:
Payload classification recognizes web and FTP-style URLs, email, phone, SMS, geographic, OTP, Wi-Fi, MeCard, vCard, other URI schemes, and plain text. Only HTTP and HTTPS destinations become openable links. Safety review follows the first matching rule below.
| Match | Result |
|---|---|
| OTP or Wi-Fi payload | Sensitive content warning |
| HTTP(S) URL with username or password | Credentials in URL warning |
| Non-HTTPS web URL | HTTP link review |
| Localhost, private IPv4 range, link-local address, or internal-looking host | Private host review |
| Punycode or known shortener host | Lookalike or redirect review |
| Other HTTPS URL | HTTPS link, with host confirmation still required |
| Device action or contact card | Recipient or personal-data review |
| Other text | Text payload |
Local files are limited to 25 MiB, decoded payloads to 32,768 characters, and load timeout to 0 to 60,000 milliseconds. A zero timeout adds no timer. The source-text field accepts up to 2,000,000 characters, while the decoded image dimensions remain bounded separately.
Privacy and Safety Notes:
Local image files are read and decoded in the browser; their pixels are not uploaded by this workflow. A direct remote URL is requested by the browser from that host and can expose ordinary network request information. Cross-origin rules may also prevent readable pixel access, in which case saving and loading the image as a local file is the safer recovery path.
The safety review does not visit destinations, expand redirects, test reputation, scan downloads, or detect every deceptive domain. Treat OTP and Wi-Fi payloads as secrets, and verify unexpected URLs through a known contact method before opening them.
Worked Examples:
Authenticator setup code
An otpauth: payload is classified as OTP and receives Sensitive OTP. Even when the image decodes cleanly, do not paste the recovered URI into chat or a ticket because it may contain the account provisioning secret.
Sideways dark-mode screenshot
Choose all quarter turns, extra scale passes, and inverted color only after the upright pass fails. That creates a 24-attempt budget. A hit at 90°, 85% scale, and inverted polarity identifies the successful recovery path; it does not change how the payload itself should be judged.
References:
- ISO/IEC 18004:2024 QR code bar code symbology specification, International Organization for Standardization, 2024.
- Scammers hide harmful links in QR codes to steal your information, U.S. Federal Trade Commission, December 6, 2023.
- How to detect a QR code with OpenCV, Simplified Guide.