Fifty QR Code Colour Pairs, and Which of Them Survive Print
by KoloQR TeamResearch

Of the fifty code-and-background pairs below, ten clear 7:1 and are safe to print, eleven land between 4:1 and 7:1 and belong on screens, and thirteen fall under 4:1 and should not carry a QR code at all. The pattern in the failures is consistent: mid-tone brand colours. Every yellow, every orange above Amber 700, and every green lighter than Forest green is in the bottom group.
Key points
- Ten of the fifty pairs clear 7:1, the working target for print. All ten are a very dark colour on white or on a near-white tint.
- Thirteen fall below 4:1. Every one of them is a mid-tone or light colour used as the code rather than as the background - yellows, oranges, mid greens, mid cyans.
- The failure is systematic, not random. A colour dark enough to print a readable QR code is usually darker than the colour a brand thinks of as its own.
- Contrast ratio is arithmetic over two hex values, so every figure in this table is reproducible rather than reported. No code was printed and scanned to produce it.
- The ratio tells you the pair, not the print. Ink spread, substrate colour, gloss and the camera's own exposure all sit between a passing ratio and a code that scans off paper.
- Inverting - light code on a dark ground - can produce a very high ratio and still fail, because some decoders assume dark-on-light and never try the other polarity.
What the Number in This Table Is, and What It Is Not
A contrast ratio is the relative luminance of the lighter of two colours divided by that of the darker, offset so the scale runs from 1:1 for two identical colours to 21:1 for black on white. It is the same figure WCAG uses for text legibility, and it is computed rather than observed: linearise each sRGB channel, weight them 0.2126 for red, 0.7152 for green and 0.0722 for blue, then divide.
That definition is worth stating precisely, because it is the reason every row below is checkable. Nobody has to trust this table. Two hex values and the formula produce the same number on any machine, which is a different kind of claim from "we tested this and it worked".
Which is also the limit of it. No QR code was printed and scanned to produce this table. The verdict column applies two design thresholds that this site already publishes - around 7:1 for print and around 4:1 for screen - to a computed ratio. It is a filter for deciding which pairs are worth testing, not a substitute for testing them.
The reason those thresholds sit so far above what a decoder needs is covered in the contrast scan test: the readable open-source decoder gives up somewhere near 1.2:1, and everything between there and 7:1 is margin for the things print does to a code after the file is correct.
The Ten Pairs That Clear Print
These reach 7:1 or better and have enough margin left for ink spread, paper reflectance and an awkward light source. Every one of them is a very dark colour on white.
| Pair | Hex | Ratio | Safe for |
|---|---|---|---|
| Black on White | #000000 on #FFFFFF | 21.00:1 | |
| Near-black on White | #111111 on #FFFFFF | 18.88:1 | |
| Navy on White | #0B1F3A on #FFFFFF | 16.52:1 | |
| Deep purple on White | #581C87 on #FFFFFF | 10.88:1 | |
| Oxblood on White | #7F1D1D on #FFFFFF | 10.02:1 | |
| Wine on White | #9D174D on #FFFFFF | 7.88:1 | |
| Deep green on White | #065F46 on #FFFFFF | 7.68:1 | |
| Warm grey on White | #57534E on #FFFFFF | 7.63:1 | |
| Burnt orange on White | #9A3412 on #FFFFFF | 7.31:1 | |
| Forest green on White | #166534 on #FFFFFF | 7.13:1 |
The practical reading of this group is that the printable palette is narrow and deep. Navy, oxblood, wine, deep green, deep purple - these are the colours that work, and a brand whose identity lives at that end of its own palette can print a coloured QR code without thinking about it.
The Eleven Pairs That Belong on a Screen
These land between 4:1 and 7:1. On a display, where contrast is perfect, light is even and edges are hard, they are fine. In print they have spent their margin before the ink is dry.
| Pair | Hex | Ratio | Safe for |
|---|---|---|---|
| Purple 700 on White | #7E22CE on #FFFFFF | 6.98:1 | Screen only |
| Royal blue on White | #1D4ED8 on #FFFFFF | 6.70:1 | Screen only |
| Red 700 on White | #B91C1C on #FFFFFF | 6.47:1 | Screen only |
| Teal 700 on White | #0F766E on #FFFFFF | 5.47:1 | Screen only |
| Cyan 700 on White | #0E7490 on #FFFFFF | 5.36:1 | Screen only |
| Blue 600 on White | #2563EB on #FFFFFF | 5.17:1 | Screen only |
| Green 700 on White | #15803D on #FFFFFF | 5.02:1 | Screen only |
| Amber 700 on White | #B45309 on #FFFFFF | 5.02:1 | Screen only |
| Red 600 on White | #DC2626 on #FFFFFF | 4.83:1 | Screen only |
| Stone 500 on White | #78716C on #FFFFFF | 4.80:1 | Screen only |
| Pink 600 on White | #DB2777 on #FFFFFF | 4.60:1 | Screen only |
This is the band where most brand colours actually sit, and it is the band that produces the specific failure of a code that scanned in the studio and did not scan on the shelf. The studio test was on a monitor.
The Thirteen Pairs That Should Not Carry a Code
Below 4:1, a QR code is relying on the decoder's tolerance rather than on being legible. These pairs will sometimes scan, on a good phone, in good light, at a generous size - which is worse than failing outright, because it passes the one test anybody runs.
| Pair | Hex | Ratio | Safe for |
|---|---|---|---|
| Purple 500 on White | #A855F7 on #FFFFFF | 3.96:1 | Neither |
| Red 500 on White | #EF4444 on #FFFFFF | 3.76:1 | Neither |
| Blue 500 on White | #3B82F6 on #FFFFFF | 3.68:1 | Neither |
| Orange 600 on White | #EA580C on #FFFFFF | 3.56:1 | Neither |
| Pink 500 on White | #EC4899 on #FFFFFF | 3.53:1 | Neither |
| Amber 600 on White | #D97706 on #FFFFFF | 3.19:1 | Neither |
| Gold on White | #CA8A04 on #FFFFFF | 2.94:1 | Neither |
| Orange 500 on White | #F97316 on #FFFFFF | 2.80:1 | Neither |
| Cyan 500 on White | #06B6D4 on #FFFFFF | 2.43:1 | Neither |
| Green 500 on White | #22C55E on #FFFFFF | 2.28:1 | Neither |
| Yellow 500 on White | #EAB308 on #FFFFFF | 1.92:1 | Neither |
| Lime on White | #78D650 on #FFFFFF | 1.82:1 | Neither |
| Yellow 400 on White | #FACC15 on #FFFFFF | 1.53:1 | Neither |
The pattern across this group is the finding worth taking away. It is not that some hues fail and others pass - it is that lightness is the variable and hue is not. Green appears in all three bands: Deep green passes at 7.68:1, Green 700 is screen-only at 5.02:1, Green 500 fails at 2.28:1. The colour is the same idea three times; only the luminance changed.
Dark Codes on Tinted Stock
Printing on anything other than white lowers the ratio, because the light modules of the code are the paper. Kraft, cream, recycled and coloured stock all start lower than the file suggests, and the file cannot tell you by how much.
| Pair | Hex | Ratio | Safe for |
|---|---|---|---|
| Black on Cream | #000000 on #FDF6E3 | 19.47:1 | |
| Black on Beige | #000000 on #F5F5DC | 18.98:1 | |
| Charcoal on Off-white | #1A1A1A on #F7F7F5 | 16.23:1 | |
| Oxford blue on Near-white | #14213D on #FCFCFC | 15.57:1 | |
| Navy on Pale blue | #0B1F3A on #EFF6FF | 15.18:1 | |
| Oxford blue on Pale amber | #14213D on #FEF3C7 | 14.35:1 | |
| Charcoal on Mid grey | #1A1A1A on #D4D4D8 | 11.78:1 | |
| Oxblood on Pale red | #7F1D1D on #FEF2F2 | 9.16:1 | |
| Forest green on Pale green | #166534 on #F0FDF4 | 6.81:1 | Screen only |
| Dark grey on Grey 400 | #333333 on #9CA3AF | 4.98:1 | Screen only |
The last two rows are the instructive ones. Forest green on white passed at 7.13:1; the same green on a pale green tint drops to 6.81:1 and no longer clears the print threshold. A tint that is barely visible has moved a passing pair into the marginal band.
Light Codes on Dark Grounds Are a Different Question
Inverting a QR code - light modules on a dark background - produces high ratios easily, and the ratio is not the problem with it. The problem is that the contrast ratio formula is symmetric and decoders are not.
| Pair | Hex | Ratio | Safe for |
|---|---|---|---|
| White on Black | #FFFFFF on #000000 | 21.00:1 | Test it |
| Off-white on Near-black | #F5F5F5 on #111111 | 17.32:1 | Test it |
| White on Navy | #FFFFFF on #0B1F3A | 16.52:1 | Test it |
| Yellow 400 on Near-black | #FACC15 on #111111 | 12.33:1 | Test it |
| Lime on Near-black | #78D650 on #111110 | 10.38:1 | Test it |
| Blue 400 on Navy | #60A5FA on #0B1F3A | 6.50:1 | Test it |
A QR code is specified as dark modules on a light background, and while many decoders will try the inverted polarity, not all of them do and none of them promise to. That is a scanner-population question rather than a colour question, and no ratio answers it. If a design calls for an inverted code, the verdict column says test it because testing is the only way to find out.
What the Ratio Does Not Tell You
Four things sit between a passing ratio and a code that scans off paper, and none of them is visible in the file.
- Ink spread. Every press grows dark areas slightly. On a QR code that means the light modules get narrower, which lowers effective contrast at exactly the scale a decoder samples at.
- Substrate. The ratio assumes the background is the colour in the file. On uncoated, recycled or coloured stock it is not, and the paper is doing half the job.
- Finish. A gloss laminate can put a specular highlight across part of the symbol regardless of how good the underlying pair is. A 21:1 code under a reflection is a 1:1 code in that patch.
- Camera exposure. A phone meters the whole scene. A small code on a large bright surface gets exposed for the surface, and the code arrives at the decoder flatter than it left the printer.
This is why the verdict column is worded as a threshold rather than a promise. Clearing 7:1 means the pair is not the reason the code fails; it does not mean the code will not fail.
How to Check a Pair That Is Not in This Table
Most brand palettes contain a colour that is not one of the fifty. The check takes seconds and is the same one used to build the table.
- Get the Ratio for the Two Hex Values. Put the code colour and the background into the QR contrast checker. It returns the same figure this table uses, for any pair.
- Compare It Against the Job, Not Against a Single Number. Around 7:1 for anything printed, around 4:1 for a code that will only ever be shown on a screen. Under 4:1, change the colour rather than the size.
- If It Fails, Darken Rather Than Re-Hue. The failures in this table are a lightness problem. A brand orange that fails at 2.80:1 usually has a darker sibling in the same palette that clears 7:1 and still reads as the brand.
- Measure the Exported File, Not the Swatch. The QR code validator reads the finished export and reports the contrast it actually contains, along with the quiet zone and module size. A gradient or a soft background changes the answer the swatches gave.
- Run the Ladder Before a Large Print Run. The contrast ladder in the contrast scan test produces a threshold for your own phones and your own stock, which is the only number that describes your job rather than the general case.
For the design side of the same decision - which parts of a code can take colour at all, and where an accent belongs - coloured QR codes covers the placement rather than the arithmetic.
Make Your QR Code
Free, with no account and no watermark. Choose a shape, add a logo, check the contrast, and export SVG, PDF, EPS or PNG - a static code with no subscription behind it.
Generate QR CodeQuestions? Answered
Design to about 7:1 for print and about 4:1 for screen. Decoders accept far less - the readable open-source one gives up near 1.2:1 - but everything between that and 7:1 is margin for ink spread, paper, glare and camera exposure. A pair below 4:1 is relying on tolerance rather than legibility.
Not as the code itself. Yellow 400 on white measures 1.53:1 and Yellow 500 measures 1.92:1, both far under any usable threshold. Yellow works as the background with a very dark code on it, and it works inverted on near-black at 12.33:1 - but a yellow code on a light ground does not.
Most brand colours land between 4:1 and 7:1, which is enough on a display and not enough on paper. A screen gives perfect contrast, even light and hard edges; print spends all three on ink spread, reflectance and glare. The monitor test was the easier one.
It measures 21:1, the same as black on white, and it still needs testing. The QR standard specifies dark modules on a light background. Many decoders try the inverted polarity and some do not, so an inverted code is a scanner-population question that no contrast figure answers.
Not by itself. Black on cream measures 19.47:1 and black on beige 18.98:1, both far above the print threshold. What breaks codes is the pattern colour lightening, not the paper darkening. A dark code on a mid-tone stock is the combination to avoid.
No, and the table does not claim it. Every ratio is computed from the two hex values with the standard relative-luminance formula, which makes each figure reproducible rather than reported. The verdict column applies published design thresholds to that number. Whether a specific pair survives a specific press is a proof, not a calculation.
Linearise each sRGB channel of both colours, weight them 0.2126 for red, 0.7152 for green and 0.0722 for blue to get relative luminance, then divide the lighter by the darker with 0.05 added to each. Any WCAG contrast calculator does the same arithmetic, including the one on this site.
Only up to a point, and it is the wrong lever. Size helps a decoder resolve modules; contrast is what lets it tell them apart. A code at 2:1 printed at 10 cm is a large, flat pattern. Change the colour first, then size it for the reading distance.
Keep Exploring
Pages that pick up where this one leaves off - the same setting, the same kind of code, or the next thing worth deciding.
Colored QR Codes
Put your palette on a QR code without breaking it: which color goes on the pattern, and which belongs on the frame.
Why a QR Code Is Not Scanning, and How to Tell Which Fault You Have
The three ways a QR code fails - never detected, read badly, or read perfectly into a broken destination - and how the symptom tells you which one you have before you measure anything.
Nine Things to Check Before a QR Code Goes to Print
The nine checks between a QR code file and a print run that works, each with the number it has to clear and the page that explains why.
Retail Stores
Product details, stock and review links on shelf labels, shop windows and checkout signs.
Event Agencies
Codes produced for someone else's event: client redirects, exhibitor spec sheets, badge runs and signage sized for the room.
ME-QR Is Free, and the Person Scanning Pays for It
ME-QR's free tier is real and unusually generous, and the price is paid by the person scanning your code. We read the pricing endpoint, the FAQ and the terms on 29 August 2026 and wrote down what free actually means.
Why KoloQR?
- Create QR codes for websites, menus, Wi-Fi, PDFs, and business cards
- Customize colors, logos, and unique shapes
- Download high-quality PNG and SVG files
- Built for both print and digital

