Если коротко: QR-код — это не картинка, а таблица из чёрных и белых клеток, в которой записаны данные и специальный запас для их восстановления. Три больших квадрата по углам подсказывают камере, где код и как он повёрнут, а математика коррекции ошибок позволяет собрать сообщение, даже если часть клеток порвана, залита или закрыта логотипом. Предел зависит от выбранного уровня: от примерно 7% до примерно 30% повреждённых «кодовых слов».
Это канал «Всё про ИИ и Роботов». Мы разбираем бытовые вещи до механизма, и QR-код — отличный пример: вы наводите телефон на мятый, залитый кофе квадратик на упаковке, а он всё равно открывает нужную страницу. Магии нет, зато есть красивая инженерная идея 1994 года, которая до сих пор работает без изменений.
Откуда взялся QR-код: штрихкоду стало тесно
История началась не со смартфонов, а с магазинов и заводов. Обычный штрихкод хранит около 20 буквенно-цифровых символов и «читается» только в одном направлении, поперёк полос. Заказчики из автопрома просили Denso Wave (тогда подразделение корпорации Denso) придумать код, в который можно записать больше, включая японские иероглифы.
Разработкой занялась крошечная команда: по рассказу самой компании, Масахиро Хара и ещё один сотрудник. Главной задачей Хара считал не объём, а скорость чтения: код должен находиться в кадре мгновенно. Через полтора года получился код, вмещающий около 7000 цифр и читающийся, по данным Denso Wave, более чем в 10 раз быстрее конкурентов. В 1994 году его представили, а название QR расшифровывается как quick response — «быстрый отклик».
Отдельная причина, по которой QR-код оказался у каждого в кармане, — открытость. Denso Wave отказалась от патентных прав на стандартизованные коды: спецификацию принял ISO в 2000 году как ISO/IEC 18004, и пользоваться кодом можно бесплатно. Массово он вышел к людям, когда в Японии в 2002 году появились телефоны со встроенным сканером.
Три квадрата и «секретная пропорция» 1:1:3:1:1
Самая узнаваемая деталь QR-кода — три больших квадрата в углах. Это не украшение, а «искатели положения». Хара столкнулся с проблемой: камера должна найти код среди текста, рамок и картинок на упаковке. Команда несколько дней подряд разбирала печатные материалы — листовки, журналы, коробки — сводя их к чёрно-белым пятнам, и искала сочетание чёрных и белых полос, которое встречается в печати реже всего. Нашлось соотношение 1:1:3:1:1: чёрная, белая, три чёрных, белая, чёрная.
Вот почему QR-код читается под любым углом. Если провести линию через центр такого квадрата в любом направлении, вы пересечёте полосы в той же пропорции (по диагонали лишь растянутой). Программе не нужно «узнавать картинку»: достаточно сканировать строки кадра и искать этот ритм. Нашла в трёх местах — значит, перед ней QR. Расстояния между тремя точками дают размер и наклон, а положение «пустого» четвёртого угла — поворот на 90, 180 или 270 градусов.
В кодах побольше появляются и мелкие квадратики-выравниватели, которые помогают исправить перспективу, если код снят с наклоном или напечатан на выпуклой бутылке. А пунктирные линии между искателями — так называемые полосы синхронизации — задают сетку: по ним программа понимает, где кончается один модуль и начинается другой.

Модули, версии и маска: как данные превращаются в узор
Каждая клетка QR-кода называется модулем. Самая маленькая версия — 21 × 21 модуль, а каждая следующая добавляет по 4 модуля с каждой стороны, пока не дойдёт до версии 40 размером 177 × 177. Она вмещает до 7089 цифр, 4296 букв и цифр или 2953 байта произвольных данных. Больше данных — больше версия, больше клеток; поэтому визитка с короткой ссылкой выглядит «редким» кодом, а код с длинным текстом — густой мозаикой.
Но есть тонкость, о которой редко говорят. Если просто выложить биты клетками, можно получить большие чёрные или белые пятна, а то и случайный узор, похожий на искатель положения. Для камеры это беда: она может принять кусок данных за часть углового квадрата. Поэтому в QR-коде есть маска. Генератор накладывает на данные один из восьми заранее известных узоров, затем оценивает результат по четырём правилам штрафов: наказывает длинные однотонные полосы, одноцветные блоки 2 × 2, участки, похожие на искатель (та самая пропорция 1:1:3:1:1), и перекос баланса чёрного и белого. Выбирается маска с наименьшим штрафом, а её номер записывается в служебную область. Реализации вроде ZXing делают именно это.
То есть генератор сам проверяет: «не обманет ли этот узор сканер?» — и подбирает такой вариант, в котором данные не похожи на служебные элементы. Это ещё одно проявление главной идеи QR-кода: он спроектирован так, чтобы быть прочитанным быстро и надёжно, а не чтобы выглядеть красиво.
«Ага!»: почему порванный код читается — запас внутри
Теперь главное. Представьте, что вы отправляете сообщение по рации в шторм и боитесь, что часть слов пропадёт. Можно повторить каждое слово дважды — но если пропадут оба экземпляра, всё потеряно. А можно добавить к сообщению специально рассчитанные «контрольные» слова, по которым по любому набору уцелевших слов получится восстановить пропавшие. Это и есть код Рида — Соломона.
Его описали американские математики Ирвин Рид и Густав Соломон в 1960 году. По описанию Denso Wave, это математический метод, изначально придуманный против шумов связи со спутниками и космическими зондами, и тот же метод применяют в музыкальных CD. Он работает на уровне байтов и хорошо справляется со «сгустками» ошибок, то есть с пятном или разрывом, а не только с единичной ошибкой.
В QR-коде данные делятся на кодовые слова по 8 бит, и к ним дописываются слова коррекции. Правило простое: чтобы исправить N слов, нужно добавить 2N слов коррекции. Пример из самой Denso Wave: данных 100 слов, нужно уметь исправлять 50 — значит, добавляем 100 слов Рида — Соломона. Всего 200 слов, исправляется 50, то есть 25% от общего числа. Это и есть уровень Q.
Разные уровни — это просто разный размер «страховки»:
Уровень → Сколько слов восстанавливается → Когда выбирают
L → около 7% → чистая среда, много данных
M → около 15% → вариант «по умолчанию», чаще всего
Q → около 25% → цеха, улица, ожидаемый износ
H → около 30% → грязь, дизайн с логотипом
Эти цифры — из описания спецификации на сайте Denso Wave. Платой за надёжность служит размер: при тех же данных код уровня H больше и плотнее, чем уровня L. Есть и ещё одна хитрость: в больших версиях данные делятся на несколько блоков, и слова разных блоков перемешиваются по всей площади, поэтому одно пятно задевает понемногу каждый блок, а не уничтожает один целиком.

Логотип посередине и цветные коды: что можно, а что опасно
Раз код терпит потерю до 30% слов, логично закрыть центр логотипом — так и делают. Но здесь работают три ограничения, которые часто забывают. Во-первых, потери считаются в кодовых словах, а не «в процентах картинки»: логотип по центру задевает данные, а искатели, служебная информация и синхронизирующие линии должны остаться нетронутыми. Во-вторых, запас тратится: если на код уже налип слой грязи, на логотип остаётся меньше. В-третьих, камеры разные, и «на границе» код может читаться на одном телефоне и не читаться на другом.
Сама Denso Wave предупреждает, что накладывать рисунок или дизайн на код нужно осторожно: если код деформирован, сканирование может замедлиться или стать невозможным. Для таких случаев компания предложила отдельную версию — FrameQR с областью-«холстом» в центре, которая заранее учтена в расчёте.
Практический вывод: хотите красивый код — ставьте уровень Q или H, сохраняйте контраст (тёмные модули на светлом фоне, а не наоборот или «чёрное на тёмно-синем»), не трогайте угловые квадраты и свободное белое поле вокруг кода. И всегда проверяйте результат на двух-трёх разных телефонах.
Миф: «порванный код читается всегда»
Нет. Если порван угловой искатель, код нечем найти — запас Рида — Соломона не поможет, потому что камера даже не поймёт, что перед ней QR. Нельзя и сильно превысить лимит: при уровне L речь идёт примерно о 7%, а широкая полоса через весь код способна уничтожить больше. Запас — это гарантия при ограниченном повреждении, а не волшебство.
Почему камера читает под углом, при плохом свете и «вверх ногами»
Все три ответа лежат в устройстве кода. Угол — потому что пропорция полос в искателе не зависит от направления сканирования. «Вверх ногами» — потому что искателей три, а не четыре: по их взаимному расположению видно, какой угол пуст, значит, понятен и поворот. Плохой свет и шум — потому что камере нужно определить для каждого модуля лишь «тёмный или светлый», а ошибки в нескольких модулях исправит Рид — Соломон.
Наклон и бугристая поверхность — отдельная история: сначала программа находит искатели, при необходимости выравнивает перспективу по маленькому квадратику-выравнивателю и только потом читает клетки. Всё это делается за доли секунды, поэтому сканирование кажется мгновенным. Кстати, примерно так же устроено и распознавание образов, о котором мы писали в разборе про камеры, читающие номера автомобилей: сначала найти объект в кадре, потом уточнить геометрию, и только потом читать символы.
Безопасность: что такое «квишинг» и как не попасться
Сам по себе QR-код безопасен: это просто способ записать текст — чаще всего ссылку. Опасность создаёт то, что вы не видите ссылку, пока не отсканируете. Мошенники пользуются именно этим: клеят свою наклейку поверх настоящего кода на парковке, в кафе, на плакате или присылают код в письме и мессенджере. Такой приём называют квишингом (QR + фишинг).
ФБР в своём предупреждении IC3 описывает ровно такие схемы: подмену кода на оплату и письма о «неудавшемся платеже» с кодом внутри. Рекомендации ведомства укладываются в несколько правил, и каждое из них следует из механизма:
Смотрите на адрес после сканирования. Камера показывает ссылку до перехода — прочитайте домен, подделки часто отличаются буквой или лишним словом.
Проверяйте физический код. Если он выглядит наклейкой поверх другой, не сканируйте. Ведь QR печатается за секунды, а подклеить его может кто угодно.
Не вводите пароли и данные карты по ссылке из кода. Лучше открыть сайт вручную или через приложение.
Не ставьте приложения «сканеры» и не скачивайте программы по QR. ФБР советует пользоваться встроенным сканером камеры и устанавливать приложения только из магазина.
Если код пришёл от знакомого — уточните отдельным сообщением. Аккаунт мог быть взломан.
Заметьте: ничто из этого не требует техподготовки. Достаточно помнить, что QR-код — это «ссылка без подписи», а значит, к ней применимы те же правила осторожности, что и к любой ссылке из чата. Если интересно, как выглядят современные схемы обмана в целом, у нас есть отдельный разбор:
Что дальше: QR как пример «избыточности» во всём
Принцип «добавим вычислительный запас, чтобы пережить потери» — один из самых универсальных в технике. Тот же Рид — Соломон стоит в CD и DVD, а изначально метод создавался для связи с космическими аппаратами. Нейросети, кстати, тоже иногда ошибаются, и тоже лечатся проверкой и избыточностью — об этом мы писали в материале про то, как проверять ответы ИИ.
Коротко
QR-код — это данные плюс математическая страховка. Три квадрата-искателя с пропорцией 1:1:3:1:1 позволяют найти код под любым углом; маска подбирается так, чтобы данные не путались со служебными элементами; код Рида — Соломона восстанавливает от 7% до 30% кодовых слов в зависимости от уровня L, M, Q или H. Поэтому код читается порванным и с логотипом, но не бессмертен: искатели и запас нельзя портить. А в безопасности помните главное: код — это ссылка без подписи, проверяйте адрес перед тем, как что-то вводить.


Пока нет комментариев