Почему QR-код может считываться, даже если он обрезан или испачкан
Три квадрата по углам сканер ищет раньше, чем восстанавливает модули по проверочным словам. Прогон на декодере показывает, какой срез и какое пятно код еще переживает.
QR-код хранит данные с запасом. Кроме самих данных в нем записаны проверочные слова, и по ним сканер восстанавливает модули, то есть квадратики кода, которых не видно, когда код испачкан или обрезан. Размер запаса задает уровень коррекции ошибок, от 7% слов на уровне L до 30% на уровне H. Но сначала сканер ищет три больших квадрата по углам кода, и без них он код не найдет. С пятном в середине или срезанным углом без квадрата код читается, со срезанным краем у квадрата нет.
Запас мы проверили прогоном. Код на ссылку и код на визитку пропустили через декодер библиотеки, которой собран наш генератор, и по очереди белили середину, резали края и углы, сыпали точки.
Сначала сканер ищет три квадрата по углам
Сканер не читает код целиком сразу. Он ищет три одинаковых квадрата со стороной в 7 модулей: в левом верхнем, правом верхнем и левом нижнем углах. По ним сканер понимает, где код, какого он размера и как повернут. Четвертый угол, правый нижний, остается без квадрата, и срез этого угла не мешает сканеру найти код.
Если квадратов нашлось меньше трех, сканер останавливается, и до проверочных слов дело не доходит. У нас срез правого края всего на 1 модуль задел правый верхний квадрат, и код не прочитался ни на уровне L, ни на H. Срез нижнего края задел левый нижний квадрат с тем же итогом.
Если срез не задел квадраты, сканер находит код, и дальше все решает запас проверочных слов. Код со ссылкой на уровне L читался со щербиной глубиной 2 модуля на правом краю ниже верхнего квадрата, на уровне H со щербиной в 5 модулей. Код со срезанным правым нижним углом на L читался при катете 6 модулей. На H он читался и при катете 14.
Вокруг кода нужно светлое поле в 4 модуля, тихая зона. Без нее сканер может не найти квадраты, потому что ищет их по чистому контуру вокруг кода. Сколько это в миллиметрах у кодов разного размера, есть в статье про тихую зону вокруг QR-кода.
Откуда у кода берется запас
Данные записаны в код словами по 8 модулей, одно слово это один байт. К ним генератор дописывает проверочные слова, которые считает код Рида-Соломона. Из каждых двух проверочных слов сканер восстанавливает одно испорченное, и ему все равно, под какое слово попало пятно. Ссылка на наш сайт из 17 знаков на уровне L занимает 44 слова, из них 34 с данными и 10 проверочных. Такой код выдерживает 5 испорченных слов.
У штрих-кода EAN-13 защита это одна контрольная цифра, и она только замечает ошибку чтения. Проверочные слова QR-кода ошибку исправляют, и сканер показывает ссылку вместо отказа.
Длинное содержимое генератор делит на блоки, у каждого свои проверочные слова, а слова блоков кладет в код по очереди, и пятно задевает понемногу каждый блок, а не один целиком. У визитки vCard из 145 байт на уровне L два блока, и в каждом исправимы 10 испорченных слов. Дважды, у двух разных квадратов, в код записано, какой уровень коррекции в нем стоит. Мы стерли одну запись, и код прочитался по второй.
Четыре уровня коррекции
Долю проверочных слов задает уровень коррекции ошибок.
- Уровень L (Low, низкий) восстанавливает около 7% слов. Он стоит на всех кодах без логотипа, которые собирает наш генератор.
- Уровни M (Medium, средний) и Q (Quartile, квартиль) восстанавливают около 15% и 25% слов. Генератор их не использует.
- Уровень H (High, высокий) восстанавливает около 30% слов. Генератор ставит его сам, когда вы загружаете логотип в центр кода.
Проценты считаются от слов, площадь картинки тут ни при чем. Одно грязное пятнышко на одном модуле портит все слово из 8 модулей. У нашей короткой ссылки на уровне L запас это 5 слов из 44. В модулях это 40 из 625, и то если грязь ляжет ровно по словам. Чем выше уровень, тем больше модулей в коде, и при той же стороне каждый модуль мельче. Сколько модулей дает каждый уровень и на какой стороне код с логотипом еще печатается на офисном принтере, мы посчитали в статье про уровни коррекции QR-кода с таблицей модулей.
Что код переживает в нашем прогоне
Ссылку из 17 знаков мы собрали на уровне L (25 модулей в ряду) и на уровне H (29 модулей). Каждое повреждение наносили на целый код и отдавали декодеру.
| Повреждение | Уровень L, 25 модулей | Уровень H, 29 модулей |
|---|---|---|
| Белое пятно в центре | 3 на 3 читается, 5 на 5 нет | 11 на 11 читается, 13 на 13 нет |
| Срезан правый нижний угол, без квадрата | Катет 6 читается, 8 нет | Катет 14 читается, глубже не резали |
| Щербина на правом краю ниже квадрата | 2 модуля читается, 3 нет | 5 модулей читается, глубже не резали |
| Срезан край с квадратом | Срез на 1 модуль не читается | Срез на 1 модуль не читается |
| Полоса через весь код | Полоса в 1 модуль не читается | 3 модуля читается, шире не пробовали |
| Точки россыпью, 1% модулей | 6 точек, читается в 3 прогонах из 5 | 8 точек, читается в 5 из 5 |
| Стерт один квадрат в углу | Не читается | Не читается |
Код с белым пятном 3 на 3 на уровне L читается, а с 6 точками россыпью прочитался в 3 прогонах из 5. Пятно из 9 модулей задевает несколько слов, а каждая из 6 точек портит свое. Грязь точками по всему коду опаснее одной кляксы.
Сгиб или царапина через весь код портят модули в ряд, как россыпь точек. С полосой в 1 модуль код на уровне L не прочитался ни поперек, ни вдоль, а на уровне H он прочитался и с полосой в 3 модуля. У визитки на уровне L, где 196 слов и два блока, полоса в 1 модуль прошла, поперечная в 2 модуля уже нет.
Код с логотипом в середине читается по той же причине, по которой он выдерживает пятно. На уровне H код со ссылкой прочитался с белым пятном 11 на 11 модулей, это 14% площади. От стертого квадрата в углу не спасает ни один уровень: без него сканер не находит код, и проверочные слова ему не помогут.
Что из этого следует при печати
Не клейте ценники, скотч и наклейки на три квадрата, не режьте лист вплотную к ним и оставляйте тихую зону со всех четырех сторон. Генератор ставит логотип в середину кода и при его загрузке сам переходит на уровень H, настройки уровня в форме нет. Соберите лист кодов с логотипом и проверьте код с экрана до печати.
Уровень в форме не поднять, без логотипа генератор всегда ставит L. Если код будут пачкать и царапать, увеличьте сторону кода: чем крупнее модуль, тем меньше слов попадает под ту же соринку. Лист заламинируйте до резки.
Если напечатанный код уже не читается, перепечатайте его в генераторе QR-кодов листом A4. Когда код цел и чист, а сканер его все равно не видит, виновато другое. Размер, контраст, блик и еще две причины разобраны в статье про пять причин, по которым код не читается с бумаги. Остальные статьи о печати кодов собраны в базе знаний.
FAQ
Почему QR-код может считываться, даже если он обрезан?
Потому что в коде записаны проверочные слова, и сканер восстанавливает по ним срезанные модули. Условий три: срез уложился в запас уровня коррекции, три квадрата по углам целы, и вокруг кода осталось светлое поле. Код со срезанным правым нижним углом или со щербиной на краю в стороне от квадратов читается, код со срезанным краем у квадрата нет.
Почему QR-код читается, если он испачкан?
Пятно закрывает несколько слов из 8 модулей, и сканер восстанавливает их по проверочным словам. Квадрат по углам, залитый или стертый целиком, он не восстановит: такой код не находится вовсе, его придется отмыть или перепечатать.
Можно ли залить чернилами четверть кода на уровне H, раз он восстанавливает 30%?
Гарантии нет. 30% это доля слов, которую сканер восстановит, если все три квадрата по углам целы и чернила не легли по ним. У нас код на уровне H с пятном в середине на 14% площади читался, с пятном на 20% уже нет.
Читается ли QR-код со срезанным углом?
Да, если срезан правый нижний угол, единственный без квадрата. Код со ссылкой и таким срезом на уровне L читался при катете 6 модулей, а на уровне H он читался и при катете 14. В трех других углах стоят квадраты, и после среза любого из них сканер код не найдет.
Может ли сканер прочитать поврежденный код неправильно?
В нашем прогоне ни разу. Когда испорченных слов больше запаса, декодер отказывается читать, а не выдает другую ссылку, и часть ссылки он тоже не показывает. Код читается целиком или не читается.
Следующий шаг
Наведите камеру на поврежденный код как есть. Если он прочитался, запаса хватило. Если нет, посмотрите на три квадрата по углам. Задетый квадрат не восстановить. Если квадраты целы и вокруг кода осталось светлое поле, испорчено больше слов, чем восстанавливает уровень. В обоих случаях код перепечатайте.
Соберите лист QR-кодов на A4 с нужной стороной кода. Список до 1500 строк, сторону кода вы задаете сами.
Соберите свой лист с QR-кодами
Вставьте список ссылок или загрузите файл, а мы разложим коды с подписями по листам A4 и отдадим PDF, SVG или PNG.
Открыть генератор