QR Code Decoder
{{ validCount }} / {{ totalItems }} decoded
Invalid: {{ invalidCount }}
Text input Image input Try harder: {{ tryHarder ? 'On' : 'Off' }} Also inverted: {{ alsoInverted ? 'On' : 'Off' }} Angles: {{ angles.sort((a,b)=>a-b).join('°, ') }}° Downscale ≤ {{ downscaleMax }} px Timeout {{ timeoutMs }} ms
Images / URLs / data URIs
{{ recentNotice }}
Ignored {{ ignoredItems }} extra input item(s). This tool processes one item at a time.
{{ t.name }} {{ (t.size/1024).toFixed(0) }} KB
# Source Status Type Content Bytes Format Charset EC ZX Bits Raw Angle° Scale Inv WxH Copy
{{ row.idx }} {{ row.sourceLabel }} {{ row.valid ? 'OK' : (row.error || 'Error') }} {{ row.derivedType || '—' }} {{ row.text || '—' }} {{ row.bytes || '—' }} {{ row.format || '—' }} {{ row.charset || '—' }} {{ row.ec || '—' }} {{ row.zx || '—' }} {{ row.bits !== '' ? row.bits : '—' }} {{ row.raw !== '' ? row.raw : '—' }} {{ row.angle !== '' ? row.angle : '—' }} {{ row.scale !== '' ? row.scale : '—' }} {{ row.inv || '—' }} {{ row.wh || '—' }}
Field Value Copy
{{ row.label }} {{ row.value }}
Trace Field Value Copy
{{ row.label }} {{ row.value }}

  
:

Introduction:

QR codes are built to move quickly from a printed or on-screen square into an action such as opening a site, joining a Wi-Fi network, importing a contact card, or provisioning an authenticator app. That speed is useful, but it also hides the payload until you trust your camera app enough to follow it. This decoder slows that moment down just enough to let you inspect what is really inside the symbol before you copy it, open it, or hand it to someone else.

The page is for situations where the code already exists as an image. You can paste or drop one screenshot or image file, enter one direct image URL, paste one data:image/... string, or provide one long raw base64 image string. The tool then tries to recover the embedded text and shows the result in four views: a decoded table, a payload breakdown, a decode trace, and a JSON export.

That makes it useful for routine checks that should happen before a scan turns into a click. A conference badge might hide a vCard, a router sticker might contain Wi-Fi setup text, and a support page might show a QR image for an OTP seed or a download link. Seeing the payload as ordinary text first gives you a chance to spot the wrong host, the wrong network name, or a setup string you did not expect.

The page is intentionally narrow in scope. It works on one item at a time, ignores extra pasted lines or extra dropped files, and focuses on recovering readable content rather than proving that the content is safe. A result labeled OK means the image was readable under the current search settings. It does not mean the destination is legitimate, the payload is benign, or the image was captured from a trustworthy source.

Privacy depends on how you feed the tool. Local files and pasted screenshots stay inside the browser while the page rasterizes and inspects them. A remote image URL is different: your browser has to request that image from its host before decoding can begin, so the network exposure comes from the source you entered rather than from a site-side upload service.

Technical Details:

QR Code is standardized under ISO/IEC 18004, and DENSO WAVE's public material describes the familiar square symbol as a grid of modules whose version grows from 21 by 21 to 177 by 177 modules in steps of four modules per side. More stored data means more modules, and more modules usually mean a denser image to recover from a screenshot or photograph. The same family also includes Micro QR, which uses a smaller symbol for tighter spaces.

This page does not generate a code or validate a business workflow around the code. It starts with one image, turns that image into pixel data, and searches for a readable payload. The first successful read ends the search and becomes the row you see in the results. If the richer decode path returns extra metadata, you also get supporting fields such as character set, reported error-correction level, bit count, raw-byte length, and which frame settings produced the hit.

The advanced controls widen that search in predictable ways. Downscale cap limits the longest image edge before testing begins. Angles chooses which rotations to try. Try harder adds two smaller scale passes after the base raster size. Also try inverted adds a second polarity pass for light-on-dark or otherwise reversed symbols. The trace tab shows the exact combination that finally worked.

One Image Input file, screenshot, direct image URL, or data URI Candidate Frames downscale cap rotation set normal or inverted Decode Search primary pass first fallback if needed stop at first hit Review Output payload table breakdown, trace, CSV, DOCX, JSON
The page works like an inspection pipeline: one image goes in, several frame variants may be tested, and only the first readable payload is reported.

Frame Selection Rules

The first raster size depends on the original image dimensions and the optional downscale cap. With no cap, the browser keeps the original size. With a cap, the longest edge is reduced to the cap and the shorter edge is scaled to match.

baseScale = min ( 1 , downscaleCap max(width,height) )

After that, the tool builds an attempt budget from three variables: the number of angles you selected, the number of scale levels in play, and whether the inverted pass is enabled.

attempts = angles × scaleLevels × inversionModes

Default settings produce a small search space: angle 0 only, one scale level, and normal polarity only. Turning on Try harder expands the scale list to 1, 0.85, and 0.7. Turning on Also try inverted doubles the polarity modes. The trace tab reports this exact attempt budget so you can see whether the successful read came from the first pass or from a wider search.

Accepted Input Routes

Accepted input routes for the QR decoder
Input route Accepted form What the page does Common limit
Local image One dropped or pasted image/* item Reads the file locally, loads it into an image element, then samples pixels in the browser Only the first image is processed
Direct image URL One http or https link ending in .png, .jpg, .jpeg, .gif, .webp, .bmp, or .svg Lets the browser fetch the image, then tries to decode the loaded pixels A page URL or API URL without a real image extension is rejected as Unsupported line
Data URI One full data:image/... string Loads the embedded image data directly Very large pasted strings can be awkward to handle even before decoding starts
Raw base64 One long base64 string with image bytes Wraps the string as a PNG data URI before loading it Non-PNG raw data may fail to render as an image

Payload Label Map

How the QR decoder derives payload labels
Observed prefix Displayed type What that means
http://, https://, ftp://, or www. URL The payload looks like a link and should be checked for host and path before opening.
mailto:, tel:, smsto:, geo: Email, Phone, SMS, or Geo The payload appears to be an action URI rather than plain text.
otpauth: or wifi: OTP or WiFi The payload likely carries setup data for an authenticator app or a network profile.
MECARD: or BEGIN:VCARD MeCard or vCard The payload looks like a contact record.
Any other URI-style scheme URI The text begins like a structured URI, but the page does not validate the full scheme semantics.
No recognized prefix Text The page treats the recovered value as ordinary text.

That label map is intentionally simple. It helps you triage the payload quickly, but it is not a full parser for every QR application profile. A Wi-Fi or OTP label tells you what kind of text was found, not that every field inside that text is valid or safe to use.

Everyday Use & Decision Guide:

Start with the cleanest source you can get. A direct screenshot or dropped image file is usually the most predictable option because the browser already has the pixels locally. If you paste text instead, make sure it is the actual image source rather than a landing page that happens to display a QR code somewhere inside it.

Leave the defaults alone for the first attempt unless the image obviously needs more help. Upright, normal-polarity decoding is faster and easier to reason about. If that fails, widen the search in a deliberate order: add the missing rotation angles, then enable the harder scale passes, then turn on inversion for white-on-black or otherwise reversed symbols.

  • Use a local screenshot when you want the least network exposure and the fewest loading surprises.
  • Use a direct image URL only when the host clearly serves the QR image itself.
  • Turn on Also try inverted when the code looks reversed or sits on a dark background.
  • Set a Downscale cap when a very large photo is slowing the search without adding useful detail.
  • Use the trace tab as evidence about image quality. A read that only succeeds after extra rotations and smaller scales is often a sign that a cleaner capture would be safer to archive or share.

When the result is a link, the first thing to read is not the status badge but the destination itself. Check the host, then the path, then the query string if one exists. A QR code can decode perfectly and still lead to the wrong site, a phishing page, or a stale route that no longer belongs to the organization printed next to the symbol.

When the result is setup data such as Wi-Fi, a vCard, or an OTP URI, compare the decoded text with the context that produced it. The network name on a sticker, the account label on a badge, or the issuer name in an authenticator seed should look familiar before you copy or reuse the payload elsewhere.

Step-by-Step Guide:

  1. Paste or drop one input into the main field. The tool accepts one image file or screenshot, one direct image URL, one data:image string, or one long raw base64 image string.
  2. Click Decode. If the image loads and the symbol is readable, the summary switches to a decoded count and the result tabs become available.
  3. Open Decoded Payloads first. Read Status, then inspect Type and Content. Use the row copy action only after the payload looks sensible.
  4. Open Payload Breakdown next. For links, this separates host, path, and query. For Wi-Fi and OTP payloads, it tells you that the content contains provisioning fields so you know you are looking at setup data rather than ordinary text.
  5. If the first pass fails, expand the search from Advanced. Add the needed angles, enable Try harder for extra scale levels, or use Also try inverted for reversed symbols. If network loading is the problem, a timeout or image error can appear before the QR search itself has a fair chance.
  6. Use exports only after the decoded text and trace look correct. The main result table can be copied or downloaded as CSV and exported as DOCX. The payload and trace views have CSV actions, and the JSON tab gives you a structured record of inputs, totals, breakdown, trace, and result rows.

The safest workflow is decode first, inspect second, and act only after the payload matches the source you expected to read.

Interpreting Results:

OK means the page recovered a payload from the current image under the current settings. It does not certify the intent behind the code. A failed row means the page could not produce a readable payload from that image path, which may be caused by the wrong input format, a blocked or broken image load, low image quality, or a symbol that is not a readable QR code at all.

The extra fields matter because they tell you how the decode happened, not just that it happened. That is useful when you are comparing two captures of the same printed code or deciding whether a blurry photo is worth trusting.

How to interpret the main QR decode result fields
Field Read it as Practical use
Status Readable payload or error text Tells you whether the page actually found a QR payload.
Content The recovered text This is the value you should verify before opening, saving, or sharing anything.
Bytes UTF-8 size of the recovered text Helpful when you suspect truncation or want to compare payload sizes.
Charset, EC, Bits, Raw, ZX Supporting metadata from the richer decode path when available Useful for inspection, but blanks do not automatically mean the payload text is wrong.
Angle°, Scale, Inv, WxH The winning frame settings Shows whether the symbol decoded in the obvious pass or only after a rotated, resized, or inverted retry.

A good habit is to read the decoded host or provisioning label before you copy anything out of the page. That small pause is often more valuable than any single metadata field because it catches social-engineering problems that a technically successful decode cannot detect.

Worked Examples:

Checking a conference poster link before opening it

Drop a phone photo of the poster into the page and run the default pass. If the result returns Type = URL, use the payload view to inspect the host and path before visiting the site anywhere else. This is a quick way to catch a shortened link, a typo-squatted host, or a code that points somewhere unrelated to the event brand printed beside it.

Confirming a Wi-Fi sticker on shared equipment

Paste a screenshot of a router label and decode it. A successful read may show Type = WiFi and a payload beginning with WIFI:. That is enough to verify the advertised network name and security string before you hand the sticker to a guest or copy the credentials into documentation.

Rescuing a sideways or high-contrast reverse print

Start with a failed read from a sideways image or a white-on-black print. Then add 90 and 270 under Angles and enable Also try inverted. If the next run succeeds, the trace can show a non-default angle and an inverted winning pass, which tells you the symbol was readable but the original capture was not in the easiest orientation for the decoder.

FAQ:

Can I decode multiple QR images in one run?

No. The page is single-item by design. It keeps only the first usable image or first non-empty text line and reports extra inputs as ignored.

Why does a normal web link fail with Unsupported line?

Because the text box expects an actual image source, not a general web page. A direct image URL with a supported file extension works. A page that merely contains a QR image does not.

Why are some metadata fields blank even when the payload is readable?

The page has a simpler fallback path for payload recovery. That path can still read the text while returning less supporting metadata than the richer path.

Are my files uploaded to the site?

Local files and pasted screenshots are decoded in the browser. Remote image URLs are fetched by your browser from their original host so the page can inspect them, but the site does not use a server-side upload step for decoding.

Does OK mean the QR code is safe to use?

No. It only means the symbol was readable. You still need to inspect the decoded destination, account label, network name, or other setup details before taking action.

Can the page handle Micro QR codes?

Its primary search path asks for QR decoding and can also attempt Micro QR when that format is exposed by the browser decoder. In practice, support depends on the image and the decoder path that succeeds.

Glossary:

Glossary of QR decoding terms
Term Meaning here
Module One dark or light square in the QR symbol grid.
Payload The text or URI content recovered from the symbol.
Data URI An inline resource string such as data:image/png;base64,....
Error-correction level A redundancy setting embedded in a QR symbol and reported as EC when the richer decode path exposes it.
Inverted pass An extra decode attempt that treats the symbol as light-on-dark instead of dark-on-light.