Из чего состоит QR-код
Поверхность QR-кода разбита на маленькие квадратики, модули, каждый из которых закрашен чёрным или оставлен белым. Именно эта сетка модулей и хранит саму информацию — примерно как последовательность нулей и единиц в памяти компьютера, только в виде видимого узора. Размер сетки называют версией кода: версия 1 — это 21 на 21 модуль для совсем коротких сообщений вроде номера телефона, а версия 40 — гигантская матрица 177 на 177 модулей, способная вместить несколько тысяч символов текста.
Поисковые узоры в трёх углах
Три одинаковых крупных квадрата в верхнем левом, верхнем правом и нижнем левом углах — поисковые узоры, они же finder pattern. Их особая структура из вложенных чёрных и белых квадратов с соотношением сторон один к одному к трём к одному к одному встречается на печатных документах крайне редко, поэтому камера сканера безошибочно отличает именно эти три метки от остального рисунка вокруг. По расположению трёх узоров сканер сразу определяет, где у кода верх, низ, левый и правый край, и умеет считать код даже перевёрнутым или сфотографированным под углом.
Маска, которая делает узор читаемым для камеры
Сырые данные сами по себе иногда складываются в длинные однотонные полосы одного цвета или случайно повторяют форму поискового узора в другом месте кода, а такие участки камере сложнее правильно распознать. Чтобы этого избежать, поверх данных накладывают маску — фиксированный шаблон, который переключает часть модулей на противоположный цвет по строгой математической формуле. Стандарт описывает восемь готовых масок, и генератор перебирает все восемь, выбирая ту, что даёт самое ровное и предсказуемое соотношение чёрных и белых модулей по всему полю кода.
Коррекция ошибок по алгоритму Рида-Соломона
Рядом с закодированными данными QR-код хранит дополнительные проверочные символы, рассчитанные по алгоритму Рида-Соломона. Эти символы избыточны в буквальном смысле: они не несут новой информации, зато позволяют математически восстановить утраченные или искажённые части кода, если сканер прочитал не все модули правильно. Стандарт задаёт четыре уровня такой защиты, L, M, Q и H, и чем выше уровень, тем больше модулей код способен потерять без потери читаемости, хотя за это приходится платить местом: чем выше уровень коррекции, тем больше проверочных модулей нужно добавить рядом с той же порцией данных.
- Уровень L восстанавливает код при потере примерно 7% модулей
- Уровень M восстанавливает код при потере примерно 15% модулей
- Уровень Q восстанавливает код при потере примерно 25% модулей
- Уровень H восстанавливает код при потере примерно 30% модулей
Почему часть кода можно закрыть логотипом
Высокий уровень коррекции H прямо рассчитан на то, что часть узора будет закрыта или испорчена, и логотип по центру — самый частый практический случай такого перекрытия. Пока закрытая область укладывается в тот процент, который способен восстановить выбранный уровень защиты, сканер всё равно правильно прочитает весь код по формулам Рида-Соломона, даже не заметив пропажи исходных модулей под картинкой. Перебор с размером логотипа быстро ломает эту математику: стоит закрыть заметно больше допустимой доли, и восстановить оригинальные данные уже не получится никаким уровнем защиты.
Как сделать свой QR-код
Практическая часть проще самой теории. Бесплатный генератор в интернете просит ввести ссылку, текст, номер телефона или другие данные, а на выходе отдаёт готовое изображение узора. Стоит сразу выбирать уровень коррекции ошибок H, если планируется добавить логотип по центру, и проверять контраст — тёмный узор на светлом фоне читается заметно надёжнее, чем цветные сочетания с низкой разницей яркости. После скачивания готовый код полезно распечатать и отсканировать камерой телефона в тех условиях, где им реально будут пользоваться: издалека, при плохом освещении, под углом.
- Соберите точный текст или ссылку, которую должен открывать код
- Выберите генератор и уровень коррекции ошибок, обычно Q или H, если планируется логотип
- Добавьте логотип по центру компактного размера, не закрывая поисковые узоры по углам
- Проверьте контраст между тёмными и светлыми модулями перед сохранением
- Отсканируйте готовый код на нескольких телефонах и в разных условиях освещения
Немного истории
QR-код придумала в 1994 году японская компания Denso Wave, подразделение производителя автокомпонентов Denso, который входит в группу компаний Toyota, для отслеживания автомобильных деталей на конвейере. Обычный штрихкод хранил мало символов и читался только в одном направлении, а новому коду требовалось вмещать значительно больше данных и быстро считываться камерой под любым углом — отсюда и название Quick Response, быстрый отклик. Через несколько лет компания сознательно открыла патент для свободного использования, и код быстро вышел далеко за пределы заводских складов.
Частые вопросы
Что произойдёт, если сфотографировать QR-код под углом
Три поисковых узора по углам позволяют сканеру математически пересчитать перспективу и выровнять изображение перед чтением данных, поэтому умеренный угол съёмки почти не мешает распознаванию. Совсем острый угол или сильное искажение всё же способно помешать камере найти узоры в принципе.
Почему одни QR-коды выглядят гуще других при одинаковом размере
Плотность узора зависит от объёма закодированных данных и выбранного уровня коррекции ошибок. Короткая ссылка с базовым уровнем защиты укладывается в небольшую версию с крупными модулями, а длинный текст с высоким уровнем коррекции требует более крупной версии с мелкими плотными модулями.
Можно ли закодировать в QR-коде что угодно, кроме ссылки
Да, формат поддерживает обычный текст, номер телефона, данные для подключения к Wi-Fi, визитную карточку и многое другое. Для сканера важен объём данных, а не их смысл — главное, чтобы содержимое укладывалось в допустимый предел выбранной версии и уровня коррекции.
Почему некоторые QR-коды не сканируются при печати
Чаще всего дело в слишком маленьком размере печати относительно расстояния сканирования, низком контрасте между цветами или в логотипе, который закрыл больше данных, чем позволяет выбранный уровень коррекции. Проверка тестовым сканированием перед массовой печатью решает практически все подобные случаи заранее.