Curved, glossy, outdoors: where printed QR codes meet the real world
A bottle bends the code away from the camera, a laminate throws the light back at it, and a summer in a shop window takes the black out of it. Each has a cause you can reason about before printing.
WHAT THIS ARTICLE DOES AND DOES NOT TELL YOU✓On a cylinder, modules near the edge are foreshortened by the cosine of the surface angle — geometry you can compute for any bottle.✓Gloss causes a bright reflection that hides modules at some angles; a matte finish removes the cause.✓Sunlight fades pigments, and a faded code is a low-contrast code.✓No scan rates are given. They need a field study, and ours has not run.
Wrapping a code round a bottle
A camera sees a flat projection of a curved surface. Where the bottle turns away, the modules are foreshortened: a module on a part of the surface tilted at angle θ appears cos θ as wide as it really is. At the centre of the code nothing is lost; at the edges, a lot can be.
The angle at the edge is half the code’s width divided by the bottle’s radius, in radians. A 30 mm code on a 66 mm can (radius 33 mm) reaches about 26° at its edges, where modules appear 90% as wide. The same code on a 33 mm vial reaches about 52°, and the edge modules appear 61% as wide — narrower than the decoder expects from the centre of the same symbol.
Edge angle = (width ÷ 2) ÷ radius, in radians. Appearance = cos(edge angle). Geometry, not measurement.
Reduce the wrap, not the code
The fix that follows from the geometry is to make the code narrower relative to the curve — place it on the flattest part of the pack, run it along the bottle’s height rather than round it, or use a payload short enough that a smaller code still has generous modules. Making the whole code smaller to keep it on a flat strip is fine if the module width stays sensible; the print size calculator shows it.
Gloss hides modules at the angle people hold phones
A glossy laminate reflects light the way a mirror does. When a light source, the code and the camera line up, part of the code turns white in the camera’s image, and the modules under the reflection are gone. People tend to hold a phone square to a code, under ceiling lights — which is exactly the arrangement that produces the reflection.
A matte or satin finish scatters the light instead, so there is no single angle where the code disappears. If the surface has to be glossy, a matte patch under the code solves it.
A reflection is not damage the code can correct — it is a hole the camera cannot see past.
Sunlight takes the contrast out
Pigments fade under ultraviolet light, and they do not fade evenly: coloured inks usually go first. A code printed in a brand colour that passed a contrast check on the day it was printed can fail the same check after months in a window. Black carbon-based inks hold up best, and a UV-resistant laminate slows the rest.
For anything outdoors, check contrast against the faded state you expect rather than the fresh one, and replace codes on a schedule rather than when someone notices.
What this article is not
The foreshortening table is geometry for a perfect cylinder and a camera far away; a close camera adds perspective on top.
No scan rates, fade times or reflection angles are measured here.
Ink and laminate behaviour varies by supplier; ask yours for their light-fastness rating.
Check contrast before it fades
The scanability report computes the contrast of a code’s two colours, so you can see how much margin there is to lose.
We’d like to count visits with Google Analytics and see where pages confuse people with Microsoft Clarity. Both set cookies, and nothing loads until you choose. Anything you type stays hidden from recordings.
Change it any time from “Cookie settings” at the foot of every page. Cookie policy