# QR code inverted and unreadable

> ISO/IEC 18004 defines a QR code as dark modules on a light background. Some decoders run a second inverted pass and read light-on-dark codes anyway; many camera apps do not, so inverted codes scan inconsistently for no design benefit. Swap the foreground and background colours and regenerate, or place the code on a light backing panel.

Source: https://useqr.app/docs/troubleshooting/qr-code-inverted-and-unreadable · Last reviewed 2026-08-21 · UseQR is free forever, no signup.

---

## What "inverted" means

An inverted QR code has **light modules on a dark background**: white pattern on black, cream on navy, any polarity flip. [ISO/IEC 18004](/glossary/iso-18004) defines the symbol the other way: dark modules on a light background, and decoders binarise the image expecting exactly that. The full mechanics of polarity are at [colour inversion and polarity](/docs/spec/qr-code-color-inversion-and-polarity).

## Why it half-works, and why that is worse

Some decoders, after failing a normal pass, retry with the image inverted; many camera apps do not bother. Support also shifts between OS versions and manufacturers, and you control none of it. The result is the worst kind of failure: the code scans on the designer's phone, ships, and silently fails for an unknowable fraction of the audience. There is no compensating upside: an inverted code carries no more data, scans no faster and prints no cheaper. It is pure downside taken for styling, which is why [light-on-dark codes fail](/docs/design/why-light-on-dark-qr-codes-fail) has its own page.

## Confirm this is your fault class

- Look at the artwork: are the modules **lighter** than their background? That is inversion, regardless of the specific colours.
- The symptom signature is inconsistency: some phones scan it (iPhones cope with inversion more often than many Android camera apps), others show nothing at all.
- Run it through our [validator](/validate): if the artwork only decodes inverted, you have your answer before borrowing a second phone.

Note the neighbouring fault: dark-ish modules on a dark background is a **contrast** failure, not a polarity one. That path is [colours not scanning](/docs/troubleshooting/qr-code-colors-not-scanning).

## The one-minute fix

1. **Swap foreground and background and regenerate.** In UseQR every style option is a URL parameter, so exchanging the two colour values in the [generator](/url-qr-code) takes seconds and changes nothing else about the code.
2. **Dark layout you cannot change?** Keep the page dark and place the code on a **light panel**: the panel becomes the background, and it must extend at least **4 modules** beyond the pattern on every side so it doubles as the quiet zone.
3. Genuinely committed to the aesthetic? Read [inverted QR codes](/docs/design/inverted-qr-codes) first. It covers the rare cases where inversion is survivable and the design alternatives that get the same look without the risk.

## FAQ

### Can a white QR code on a black background be scanned?
Sometimes: some decoders retry with inverted polarity and read it, many camera apps never do. Because support is inconsistent across phones and OS versions, an inverted code silently fails for part of any real audience.

### Why does my inverted QR code work on iPhone but not Android?
iOS's decoder attempts inverted reads more reliably than many Android manufacturers' camera apps, which vary widely. That platform split is the classic signature of a polarity problem rather than a damaged code.

### How do I fix an inverted QR code?
Swap the foreground and background colours and regenerate, a few seconds' work. If the surrounding design must stay dark, put the code on a light panel extending at least four modules beyond the pattern on every side.

### Is there any advantage to an inverted QR code?
No. It holds no more data and scans no better on any device. It only narrows the set of phones that can read it. The same visual effect is safer achieved with a dark layout around a standard dark-on-light code.

## Try it

- https://useqr.app/validate
- https://useqr.app/scan
