Find out if it will scan before you pay the printer.
Drop in any QR code image — one a designer sent you, one from an old campaign, one you found in a folder — and Frame decodes its contents and runs practical readability checks so you can review it before you print.
Upload a PNG, JPG or WebP image of a QR code to test whether it decodes and check common scan-quality problems before printing.
Upload an existing QR code image and Frame tries to decode it right in your browser. If it reads, you see exactly what the code contains and what kind of content it is. You also get three diagnostics: contrast, edge clearance and image size. Fix any warnings before the code is printed or published.
Use it to check QR codes online for exported PNGs, screenshots, logo QR codes, print proofs, and designs that a phone struggles to scan. The result is a diagnostic from Frame's own checks, not a certification.
A QR code generator creates a new code from your data. A QR code checker works the other way round: it examines a QR image that already exists. Frame's checker is a QR code tester and quality checker in one, and it answers six practical questions:
That makes it a QR code readability test you can run on any image before you trust it. It works whether you made the code yourself, a designer placed it in artwork, or you found it in an old campaign folder.
Software testing checks the file, not the print. Paper, ink, lamination, lighting and distance only exist in the real world, so a printed proof scanned with real phones is always the final test.
Every uploaded image gets the same set of checks. Here's what each one looks at and where its limits are.
| Check | What Frame examines | What the result means | Important limitation |
|---|---|---|---|
| QR decoding | Whether its QR decoder can find and read a code in the image. | Decoded means the image contains a readable code. Otherwise you see "No QR code detected". | One decoder reading one image is strong evidence, but other phones and scanner apps can behave differently. |
| Decoded content | The exact text stored in the code. | This is what a scanner receives: a link, WiFi details, a contact card or plain text. | Very long content is shortened on screen after 320 characters. The destination is never opened. |
| Content type | How the content starts (such as WIFI: or mailto:) and, for web links, the hostname. | A label such as Website URL, WiFi network or WhatsApp chat. | A label describes the format, not whether the destination is safe or who runs it. |
| Contrast | The dark and light parts inside the detected code, separated at a brightness split calculated from your image. | A measured ratio, rated strong, borderline or low by Frame's heuristic. | It measures the file, not the printed colours. The cut-offs aren't an official QR standard. |
| Edge clearance | The distance from the detected code to the nearest image edge, in estimated modules. | Roughly how much room the image leaves for a quiet zone. | It doesn't check whether that space is blank. Text or artwork inside it isn't detected. |
| QR size in pixels | How many pixels wide the detected code is in your original image. | Whether there's enough detail for print, by Frame's heuristic. | Pixel size alone doesn't tell you how large the code will be printed. |
| Estimated module count | The module size measured from the image, divided into the code's width. | How dense the code is. Longer content means more modules. | It's an estimate. Logos, resizing, JPEG compression and screenshots can shift it by a few modules. |
| Approximate size at 300 DPI | The code's pixel width converted to centimetres at 300 dots per inch. | How large the image would print at a common print resolution. | It isn't a recommended print size. Density and scanning distance decide that. |
| Error correction level | Not read from the image. | Always shown as Not available. | Frame doesn't guess the error-correction level of an uploaded code. |
| Overall diagnostic score | A 0–100 summary of the decoding, contrast, edge-clearance and size checks. | Looks print-safe, Usable with caveats, or Needs attention before printing. | It's Frame's own summary, not a certification, a security rating or a scan guarantee. |
Decoding counts most towards the score, followed by contrast and edge clearance, then size. Any single Issue caps the score at 55, so one serious problem can't be averaged away by passes elsewhere.
The image passed the main checks, possibly with a minor warning such as size. Still print a proof.
At least one warning is worth fixing before the code goes to print.
There's an Issue, or several warnings. Fix them and test the new image.
The checker reads pixels. It can't judge anything that depends on the destination, the physical print or a particular phone. It doesn't check:
For the link itself, read the decoded content and only open destinations you recognise. For the physical side, print a proof.
| Frame QR Code Checker | Typical QR scanner app | |
|---|---|---|
| Input | An uploaded image file | Usually the live phone camera |
| Main job | Decode the image and diagnose its quality | Read the content so you can act on it |
| Output | Content, type label, contrast, edge clearance, size and a diagnostic score | The content, often with a button to open it |
| Opens the link | Never. The content is shown as text | Often offers to open it straight away |
| Camera | Not used | Used |
| Best for | Checking artwork and exports before printing or publishing | Using a code in the real world |
So Frame works as a QR code image scanner: it can scan a QR code from an image. It isn't a live webcam scanner, though. To read a code that's in front of you, use your phone's camera. The guide on how to scan a QR code explains the options.
To upload a QR code to scan, drop a PNG, JPG/JPEG or WebP file onto the checker, or click to choose one. That could be a saved export, a screenshot, an image from an email, or a photo of a printed code. Very large images are scaled down to 1,400 pixels on their longest side for analysis, which keeps checking fast. The reported pixel size still refers to your original image.
Some images won't decode, especially very light, heavily stylised or badly damaged codes. "No QR code detected" means Frame's decoder couldn't read a code in that image. It doesn't mean the code is malicious, empty or corrupt.
When a code decodes, Frame shows the content exactly as stored, shortening it on screen after 320 characters. It also gives the content a type label based on how it starts:
| Label | Shown when the content is |
|---|---|
| Website URL | Any http or https link without a more specific label |
| WhatsApp chat, YouTube link, Instagram link, Facebook link, Spotify link, Telegram link | A web link whose hostname belongs to that service |
| PDF document | A web link whose address ends in .pdf |
| WiFi network | WiFi login details starting WIFI: |
| vCard contact | A contact card starting BEGIN:VCARD |
| Calendar event | An event starting BEGIN:VEVENT or BEGIN:VCALENDAR |
A mailto: link | |
| Phone number | A tel: link |
| SMS message | An sms: or smsto: link |
| Location | Map coordinates starting geo: |
| Crypto payment | A bitcoin: or ethereum: request |
| Plain text | Anything else |
A generic Website URL label is completely normal. Most links, such as your own site, a Google Maps link, or a PDF shared from cloud storage without .pdf in its address, are labelled Website URL, and the code works just as well.
Use the content to confirm the details that matter: the domain and path of a link, the network name and password in a WiFi code, or the name and number on a contact card. If something is wrong, the code needs regenerating. The QR code generator makes a fresh one.
Frame shows labels such as Facebook link, WhatsApp chat, Telegram link, Instagram link, YouTube link or Spotify link only when the hostname of the decoded address matches that service. Facebook subdomains such as m.facebook.com also count. The check respects real hostname boundaries, so lookalikes such as facebook.com.login-help.example or wa.me.promo.example stay Website URL.
A matching label only means the address belongs to that service. It doesn't vouch for the account, the content, where a chat leads, a payment or the safety of the destination, because anyone can create a profile or channel on a real platform. Frame runs no reputation or security lookup, so judge the destination yourself before you share it, sign in or pay.
A scanner has to tell the dark modules from the light background. Frame measures that separation from your image itself. It builds a brightness histogram of the detected code area, finds the split between the darker and lighter pixels (Otsu's method), and averages the colour of each group. It then reports the contrast ratio between them.
Strong dark/light separation by Frame's contrast check.
Usable, but stronger separation may scan more reliably, especially in print or dim light.
Darken the code or lighten the background, then test again.
These cut-offs are Frame's own heuristic, not an official QR requirement. In practice:
QR codes need a blank margin around them, called the quiet zone. It's generally about four modules wide on every side, and scanners use it to find where the code begins.
Frame's edge clearance check measures something narrower: the distance from the detected code to the nearest edge of the image, in estimated modules. It's geometry only. Frame doesn't look inside that space to see whether it's blank.
Both images get the same edge-clearance result, but only the first has a usable quiet zone. So read the result in two steps:
When a code is placed on a poster or packaging, the margin often fills up with design. The QR code quiet zone guide explains how much space to leave and how to protect it in a layout.
The Size & resolution result combines three different numbers that are easy to mix up:
How many pixels wide the detected code is in your original image. Frame's heuristic treats 600 px or more as enough for print, 250–599 px as fine on screen but tight for print, and anything smaller as too small.
The estimated number of squares across the code. Longer content means more modules. A short link can be 25 modules, while long URLs or detailed contact cards can pass 100.
The pixel size converted to centimetres at 300 dots per inch. A 600 px code covers about 5.1 cm. It describes the file, not the size you should print.
Density is why one print size doesn't fit every code. A simple 25-module code and a dense 100-module code shouldn't be printed at the same tiny size. At 2 cm wide, each module of the dense code is only 0.2 mm, a quarter of the simple code's, and many phones won't resolve it. Shorten the content where you can, or print dense codes larger. The QR code size guide covers minimum print sizes and scanning distance.
The module count is an estimate. On clean exports it's usually exact or very close. On logo codes, resized images, compressed JPEGs and screenshots it can be off by a few modules.
A logo in the middle of a QR code covers modules. QR codes carry error correction, which is redundant data that lets a decoder rebuild some missing parts, so a code can tolerate limited obstruction. How much depends on the error-correction level and on the logo's size and placement. A logo over one of the corner squares breaks a code much sooner than one in the centre.
Frame's generator switches to high (H) error correction automatically whenever you add a logo. The checker then lets you confirm the finished image still decodes and review its diagnostics, although it can't report which error-correction level a code uses. A decode is good evidence, not a guarantee, because a logo code that reads here can still fail on an older phone or at a small print size. The QR code logo size guide explains how to size a logo safely.
Coloured QR codes work well as long as the dark modules stay clearly darker than the background. Dark navy, deep green or burgundy on white usually give strong separation.
Gradients need more care, because the weakest point is the lightest part of the gradient. A code that fades from a mid blue to a pale cyan can become unreadable, even though its dark end looks fine. Some gradients decode easily and others don't decode at all.
Rather than trusting a palette, test the finished design: upload the exported image, check that it decodes, and look at the contrast result. The contrast is averaged across the whole code, so a Strong result doesn't prove that the gradient's lightest corner is readable. Scan a printed proof as well.
A screen is backlit and sharp, and paper isn't. Frame analyses your uploaded image, not the printing environment, so these print-side problems are outside what it can measure:
The fix is always the same: print one proof at final size on the final material, and scan it where it'll be used.
When someone says a QR code "doesn't work", it can mean two very different failures. Separate them first.
The phone doesn't recognise a code, or can't read it.
The code scans, but what opens is wrong or doesn't load.
Frame's checker helps with decoding problems and with spotting wrong content. It never opens the destination, so check the decoded link yourself for destination problems. The QR code not working guide goes through each cause in detail.
The original export is the best file to test and to print. It has the full resolution and clean module edges your generator produced.
Screenshots can change the image through resizing, compression, blur from scaling, extra background around the code and lower effective resolution. That can nudge the module estimate and the size result, and a very small screenshot may not decode at all.
A screenshot is still worth testing when it's the image someone actually intends to use, such as a code pasted into a slide, a social post or a document. Test the file that will really be shown or printed.
The Batch QR Code Generator creates a ZIP of individual PNG files, one per row of your data. The checker tests one image at a time, and there's no automatic ZIP-wide check.
Spot-checking builds confidence, but it doesn't validate every code in the set.
That makes the checker suitable for codes that contain internal links or client details. This covers checking only. If you open a decoded link afterwards, that website's own privacy practices apply.
Each case is tagged with where the problem usually lies: the image, the print, the content inside the code, or the destination.
Frame's decoder couldn't read a code. Possible causes are no QR in the image, blur, low contrast, cropping, heavy distortion, too few pixels or a difficult design. Try the original export, a sharper photo or a version with more margin. Nothing was decoded, so there's no destination to judge yet.
Phones refocus and try many camera frames, while Frame reads one still image. Upload a sharper, larger or original version. If only a live camera can read it, the code is marginal and worth improving before print.
Some cameras and scanner apps are less forgiving. Fix any contrast, edge-clearance or size warnings, try a larger print, and make sure the phone's camera has QR scanning turned on.
The image is fine, but the data inside it isn't. No design fix changes the content, so regenerate the code with the correct link or details.
Darken the code colour or lighten the background, avoiding mid-greys and pale brand colours. Re-export and check again. A warning isn't a failure, but print usually lowers contrast further.
The code sits close to the image edge. Re-export it with a margin, or add blank space around it in your layout, aiming for about 4 modules on every side.
A pass only measures the distance to the image edge. Frame doesn't look for text or artwork in that space, so move those elements out until the quiet zone is blank.
Re-export at a higher resolution rather than upscaling, because upscaling adds no detail. For a dense code, shorten the content or plan a larger print.
Make the logo smaller, keep it centred and away from the corner squares, and use high error correction, which Frame's generator applies automatically with a logo. Then re-test the image and a proof.
The checker can't see the print. Check the printed size, glare, ink spread, folds, lighting and scanning distance, then print another proof.
The label only means the hostname matches that service. Real platforms host content from anyone, and Frame performs no safety check, so judge the account and content yourself.
The QR worked because the phone received the link. The problem is at the destination: the page is offline, the file moved, sharing permissions changed, a login is required, or the link expired. Open the decoded link in a private window to check. If the file stays at the same address, you don't need a new code. If the address changes, a static code needs regenerating (see static vs dynamic QR codes).
Upload the image to the checker at the top of this page. If Frame decodes it, confirm the decoded content is exactly right and review the contrast, edge clearance and size results. Then print a proof at final size and scan it with a few different phones.
Yes. The checker runs in your web browser with nothing to install, and the image is processed on your device rather than uploaded to a server.
Yes. Drop an image onto the checker or click to choose one. Frame decodes the QR code from the image and shows what it contains. You can also Tab to the upload area and press Enter.
The checker is built and tested for PNG, JPG/JPEG and WebP images. Files that aren't images are rejected with a message asking for one of those formats.
No. The checker only reads image files you choose. It isn't a live camera scanner, so to scan a code in front of you, use your phone's camera app.
It tests whether the code decodes, what it contains and what type of content it is. It also reports contrast, edge clearance, pixel size, an estimated module count and the approximate size at 300 DPI, summarised in a 0–100 diagnostic score.
Yes. It shows the decoded content exactly as stored, shortened on screen after 320 characters, with a type label such as Website URL, WiFi network, vCard contact, Email or Plain text.
Yes, by hostname. Links on facebook.com and its subdomains, fb.com, fb.me, wa.me, api.whatsapp.com, t.me, telegram.me, instagram.com, youtube.com, youtu.be, open.spotify.com and spotify.link get a service label. Lookalike domains are labelled Website URL.
No. It only means the web address belongs to that service's domain. It says nothing about the account, the content, a payment or whether the destination is safe.
Yes. It measures the dark/light contrast ratio of the code area in your image and rates it strong, borderline or low using Frame's own heuristic, which isn't an official QR standard.
Not fully. It measures the distance between the code and the image edge, reported as edge clearance, but it doesn't check whether that space is blank. You still need to check that no text or artwork sits in the margin.
It's the estimated distance from the detected QR code to the nearest edge of the image, measured in QR modules. About 4 modules or more passes. Less than that gets a warning or an issue.
It flags images whose code has too few pixels for print and shows the approximate size at 300 DPI. It can't know your final print size or scanning distance, so use the size guide and a printed proof for that.
Yes. Upload the finished image to confirm it still decodes and to review its diagnostics. A decode is strong evidence, but not a guarantee for every phone or print size.
Yes. Many gradient codes decode well, but a light end of a gradient can make a code hard or impossible to read. The contrast result is averaged across the whole code, so still scan a printed proof.
Yes, as long as the code is complete and reasonably sharp in the screenshot. Resizing and compression can affect the results, so test the original export when you have it.
Cameras, scanner apps and focus differ between phones. Marginal codes with low contrast, a thin margin, high density or a small print fail first on less capable phones. Fix any warnings and test several devices.
No. Frame doesn't check for phishing or malware, URL reputation, website ownership or payment recipients. Only open decoded links you recognise and trust.
No. The decoded content is shown as text. Frame never visits or fetches the destination, so it can't tell you whether the page is online.
No. The image is read and decoded in your browser with a QR decoder hosted on Frame's own site. It isn't sent to Frame or to an external scanning service during checking.
No. Results exist only on the page, and they're gone when you reload it.
Indirectly. Take a sharp, straight-on photo of the print and upload it, and Frame will try to decode it. Scanning the print itself with several phones is still the real test.
No. The checker works on one image at a time. Extract the ZIP and test individual PNGs, either every critical code or a representative sample for large sets.