Откуда взялись двумерные коды

Обычный штрихкод знаком каждому по упаковкам товаров в магазине. Он состоит из чередующихся чёрных и белых полос разной толщины. Такой код называют одномерным, потому что сканер считывает его только в одном направлении — по горизонтали. Полоски кодируют ограниченный объём информации, обычно от 10 до 30 символов. Этого хватает для идентификатора товара, но записать длинную интернет-ссылку или подробный текст в такие рамки невозможно.

В начале 1990-х годов на заводах японской компании Denso Wave, поставлявшей автозапчасти для Toyota, возникла серьёзная проблема. Рабочим приходилось сканировать до десяти разных штрихкодов на одной коробке с деталями, чтобы зафиксировать сборку. Очереди на конвейере росли, сканеры периодически ошибались, а на бланках не оставалось свободного места.

В 1994 году инженер Масахиро Хара придумал решение. Во время обеденного перерыва он наблюдал за игрой в го, где игроки расставляют чёрные и белые камни по клеткам сетки. Хара понял, что данные можно размещать одновременно по горизонтали и по вертикали. Название новой разработки составили из первых букв английских слов Quick Response — быстрый отклик, подчеркивая способность датчика мгновенно распознавать узор.

Анатомия чёрно-белого квадрата

Каждый отдельный квадратик в коде называется модулем. Если смотреть на рисунок целиком, он кажется хаотичным шумом, но в нём заложена строгая геометрия.

  • Большие квадраты в трёх углах служат шаблонами поиска и помогают камере обнаружить код в кадре под любым углом поворота.
  • Линии из чередующихся чёрных и белых точек между угловыми метками образуют шкалу синхронизации, задающую размер модулей и координатную сетку для считывателя.
  • Одиночные маленькие квадраты ближе к четвёртому углу работают шаблонами выравнивания, помогая алгоритму компенсировать искажения при печати на изогнутых или помятых поверхностях.
  • Рядом с большими угловыми метками располагаются служебные модули информации о формате, сообщающие сканеру уровень коррекции ошибок и используемую маску рисунка.
  • Всё оставшееся пространство занято полезной нагрузкой, где байты данных перемешаны с контрольными кодами восстановления.

Угловые квадраты имеют строгую пропорцию ширины линий 1:1:3:1:1. Это означает, что чёрная рамка, белая полоса, центральный чёрный квадрат, вторая белая полоса и вторая чёрная рамка соотносятся по толщине именно в такой пропорции. Масахиро Хара проанализировал тысячи печатных страниц, газет и упаковок, чтобы выяснить, какое сочетание контрастных линий реже всего встречается в реальном мире. Оказалось, что соотношение 1:1:3:1:1 почти уникально, поэтому камера телефона находит код за доли секунды и не путает его с окружающим текстом.

Как работает алгоритм защиты от повреждений

Устойчивость к царапинам, краске и пыли обеспечивает алгоритм Рида — Соломона. Эту математическую модель изобрели учёные Ирвинг Рид и Гюстав Соломон ещё в 1960 году. Изначально метод создавали для передачи данных через помехи в дальнем космосе, а позже применили в компакт-дисках, чтобы музыка играла без заиканий даже на поцарапанном пластике.

Суть алгоритма заключается в добавлении избыточных данных по строгим алгебраическим законам. Перед генерацией картинки исходный текст превращается в последовательность чисел. Алгоритм строит по этим числам сложный математический многочлен и вычисляет дополнительные проверочные значения. При сканировании телефон решает систему уравнений. Если часть точек запачкана или оторвана, программа находит неизвестные переменные по сохранившимся уравнениям и полностью восстанавливает исходную строку.

Четыре уровня живучести

Человек или программа, создающая код, может самостоятельно выбрать уровень коррекции ошибок в зависимости от того, в каких условиях будет висеть наклейка.

  • Уровень L допускает восстановление около 7% повреждённых данных и используется на чистых экранах мониторов.
  • Уровень M восстанавливает до 15% утерянной информации и считается универсальным стандартом для магазинных чеков и билетов.
  • Уровень Q справляется с потерей до 25% площади и подходит для наружной рекламы, подверженной дождю и пыли.
  • Уровень H выдерживает уничтожение до 30% модулей и применяется в суровых промышленных условиях.

Чем выше выбран уровень надёжности, тем больше проверочных модулей приходится рисовать. При одинаковом объёме текста код с уровнем H выглядит заметно плотнее и состоит из гораздо более мелких точек, чем код с уровнем L.

Почему пиксели распределены равномерно

Если бы данные записывались подряд, на изображении могли появиться сплошные белые поля или большие чёрные кляксы. Оптические датчики плохо фокусируются на однородных заливках, а линии синхронизации сбиваются. Чтобы избежать контрастных пятен, создатели внедрили механизм маскирования.

Перед финальной отрисовкой на биты данных накладывается специальная математическая сетка — маска. Всего существует 8 стандартных шаблонов масок, меняющих цвет модулей по шахматному или полосатому правилу. Алгоритм тестирует все 8 вариантов, начисляет штрафные баллы за скопления одинаковых цветов и выбирает маску, которая даёт максимально ровный шумовой узор. Номер выбранной маски записывается в служебную область возле угловых меток, чтобы сканер при чтении выполнил обратную операцию.

Частые вопросы

Сколько текста максимально помещается в один QR-код?

В самой крупной версии из 177 на 177 модулей помещается до 7089 цифр или до 4296 букв латинского алфавита с цифрами. Если кодировать русский текст или двоичные файлы, объём составляет около 3 килобайт.

Нужен ли интернет для сканирования QR-кода?

Интернет не требуется для самого процесса считывания. Код содержит готовый текст, координаты или телефонный номер. Подключение к сети понадобится только в том случае, если внутри зашита ссылка на сайт, которую пользователь решит открыть в браузере.

Почему в коде три угловых квадрата, а не четыре?

Четвёртый угол намеренно оставлен пустым, чтобы камера мгновенно определяла ориентацию изображения в пространстве. По положению трёх точек программа вычисляет верх, низ и угол наклона картинки.

Может ли QR-код устареть или испортиться со временем?

Сам графический узор срока годности не имеет и будет считываться всегда, пока сохраняется контраст между линиями. Устареть может только ссылка на интернет-страницу, если владелец сайта удалит нужный адрес.