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

by KoloQR TeamResearch

White cards holding QR codes in eight different colours - navy, purple, oxblood, wine, grey, orange, green and yellow - laid out on a bright green background, with a black pill label across the middle reading "50 QR Code Colour Pairs".

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.

PairHexRatioSafe for
Black on White#000000 on #FFFFFF21.00:1Print
Near-black on White#111111 on #FFFFFF18.88:1Print
Navy on White#0B1F3A on #FFFFFF16.52:1Print
Deep purple on White#581C87 on #FFFFFF10.88:1Print
Oxblood on White#7F1D1D on #FFFFFF10.02:1Print
Wine on White#9D174D on #FFFFFF7.88:1Print
Deep green on White#065F46 on #FFFFFF7.68:1Print
Warm grey on White#57534E on #FFFFFF7.63:1Print
Burnt orange on White#9A3412 on #FFFFFF7.31:1Print
Forest green on White#166534 on #FFFFFF7.13:1Print
Burnt orange at 7.31:1 is the useful entry here: it is the only colour in the list a brand would describe as orange, and it is several steps darker than the orange most brands own.

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.

PairHexRatioSafe for
Purple 700 on White#7E22CE on #FFFFFF6.98:1Screen only
Royal blue on White#1D4ED8 on #FFFFFF6.70:1Screen only
Red 700 on White#B91C1C on #FFFFFF6.47:1Screen only
Teal 700 on White#0F766E on #FFFFFF5.47:1Screen only
Cyan 700 on White#0E7490 on #FFFFFF5.36:1Screen only
Blue 600 on White#2563EB on #FFFFFF5.17:1Screen only
Green 700 on White#15803D on #FFFFFF5.02:1Screen only
Amber 700 on White#B45309 on #FFFFFF5.02:1Screen only
Red 600 on White#DC2626 on #FFFFFF4.83:1Screen only
Stone 500 on White#78716C on #FFFFFF4.80:1Screen only
Pink 600 on White#DB2777 on #FFFFFF4.60:1Screen only
Purple 700 misses the print threshold by 0.02. Treating 7:1 as a cliff would be silly - but so would treating a pair this close to the line as settled without a proof.

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.

PairHexRatioSafe for
Purple 500 on White#A855F7 on #FFFFFF3.96:1Neither
Red 500 on White#EF4444 on #FFFFFF3.76:1Neither
Blue 500 on White#3B82F6 on #FFFFFF3.68:1Neither
Orange 600 on White#EA580C on #FFFFFF3.56:1Neither
Pink 500 on White#EC4899 on #FFFFFF3.53:1Neither
Amber 600 on White#D97706 on #FFFFFF3.19:1Neither
Gold on White#CA8A04 on #FFFFFF2.94:1Neither
Orange 500 on White#F97316 on #FFFFFF2.80:1Neither
Cyan 500 on White#06B6D4 on #FFFFFF2.43:1Neither
Green 500 on White#22C55E on #FFFFFF2.28:1Neither
Yellow 500 on White#EAB308 on #FFFFFF1.92:1Neither
Lime on White#78D650 on #FFFFFF1.82:1Neither
Yellow 400 on White#FACC15 on #FFFFFF1.53:1Neither
Yellow on white reaches 1.53:1, which is close to the point where a decoder stops seeing a pattern at all rather than seeing a faint one.

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.

PairHexRatioSafe for
Black on Cream#000000 on #FDF6E319.47:1Print
Black on Beige#000000 on #F5F5DC18.98:1Print
Charcoal on Off-white#1A1A1A on #F7F7F516.23:1Print
Oxford blue on Near-white#14213D on #FCFCFC15.57:1Print
Navy on Pale blue#0B1F3A on #EFF6FF15.18:1Print
Oxford blue on Pale amber#14213D on #FEF3C714.35:1Print
Charcoal on Mid grey#1A1A1A on #D4D4D811.78:1Print
Oxblood on Pale red#7F1D1D on #FEF2F29.16:1Print
Forest green on Pale green#166534 on #F0FDF46.81:1Screen only
Dark grey on Grey 400#333333 on #9CA3AF4.98:1Screen only
A pale tint costs less than it looks. Black on cream loses 1.53 against black on white, which is nothing. What costs is the code colour lightening, not the paper darkening.

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.

PairHexRatioSafe for
White on Black#FFFFFF on #00000021.00:1Test it
Off-white on Near-black#F5F5F5 on #11111117.32:1Test it
White on Navy#FFFFFF on #0B1F3A16.52:1Test it
Yellow 400 on Near-black#FACC15 on #11111112.33:1Test it
Lime on Near-black#78D650 on #11111010.38:1Test it
Blue 400 on Navy#60A5FA on #0B1F3A6.50:1Test it
Yellow reaches 12.33:1 inverted and 1.53:1 the right way up. Same colour, same formula, opposite outcomes - which is a good illustration of why the ratio alone decides nothing.

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 Code

Questions? 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.

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
Generate QR Code
A plain black QR code beside the same code restyled as a circle with brand colors