QR-код придумали намного раньше ковида — в 1994 году в Японии, в компании Denso. Им нужно было помечать на складе запчасти для машин, а обычных в то время штрихкодов уже не хватало — они могли хранить только 13 цифр, а этого не хватало для всего ассортимента на складе. С тех пор QR-код стал стандартом сначала для маркировки товаров, а потом — для хранения любой информации. В современных QR-кодах можно хранить картинки и даже звуки.
Почему QR-код выглядит именно так
Главная задача, которую решали инженеры Denso, звучала так: «Как закодировать информацию таким образом, чтобы вместить туда гораздо больше данных, чем в простом штрихкоде?»
Обычный штрихкод — это последовательность узких и широких чёрных полос с белыми просветами между ними. Каждая комбинация полос и просветов кодирует какую-то цифру:
Высота штрихкода не влияет на объём данных — даже если его растянуть в высоту в несколько раз, всё равно в нём будет закодировано столько же цифр. Можно было бы увеличить длину кода, но тогда рисунок стал бы слишком длинным и не помещался на всех поверхностях.
Чтобы решить эту проблему, QR-код сделали не одномерным, как штрихкод, а двумерным — когда информация закодирована и по горизонтали, и по вертикали. Такой приём увеличил плотность информации, и теперь код может хранить 7089 цифр или 4296 символов.
Зачем нужны три квадрата по углам
Три квадрата помогают считывающему датчику правильно развернуть код для дальнейшей обработки. Теперь подробнее.
Обычный штрихкод считывается лазерным лучом, который пробегает по штрихам и составляет из них ноли и единицы. С QR-кодом так не сработает — лазеру нужно было бы пройти по каждому квадратику в коде, чтобы его считать. Поэтому QR-код сканируют более продвинутыми оптическими датчиками, похожими на сенсоры в цифровых камерах. Ну и цифровыми камерами тоже.
Прежде чем алгоритм начнёт распознавать то, что там закодировано, ему нужно внутри себя правильно развернуть код, чтобы считать всё в определённой последовательности. Для этого в QR-код добавили три квадрата по углам — они говорят камере, как именно считан код, и помогают алгоритмам виртуально развернуть его нужной стороной. Система распознавания находит эти квадраты и поворачивает код так, чтобы правый нижний угол был без такого квадрата. После этого алгоритм приступает к расшифровке.
Для надёжности в QR-код добавляют четвёртый квадрат, поменьше — он помогает камере быстрее повернуть код нужной стороной:
Как алгоритм понимает, какие данные там зашифрованы
В QR-коде могут храниться разные данные, которые закодированы тоже по-разному. Чтобы алгоритм понял, с чем именно ему предстоит работать, возле каждого большого квадрата есть область с информацией о том, что именно хранится в коде: текст, URL-адрес для браузера, картинка, звук или числа.
Алгоритм берёт данные из этой области, раскодирует их и понимает, какой метод нужно применить к остальным данным в коде.
Версии и работа с ошибками
Чтобы сделать код ещё более защищённым, разработчики предусмотрели в алгоритме автоматическое исправление ошибок — например, когда стёрлась часть квадратов или кто-то поверх него что-нибудь написал. В зависимости от версии алгоритма он способен восстановить данные, даже если повреждено 30% всех пикселей на картинке.
Для этого используется специальный код Рида — Соломона. Он берёт исходные данные, добавляет к ним несколько проверочных символов (их должно быть в два раза больше, чем возможных ошибок) и составляет сложные математические уравнения. В коэффициентах этих уравнений и будут закодированы наши данные вместе с дополнительными. Если мы добавим 10 дополнительных символов, то сможем исправить 10 / 2 = 5 ошибок.
Кстати, этот же код используется в компакт-дисках. Именно поэтому удаётся прочитать даже поцарапанный диск, когда часть фрагментов с данными физически испорчена.
Информация о том, какая версия алгоритма используется в QR-коде, находится тоже возле больших квадратов:
Микроформат
Если данных немного, используют маленькие QR-коды с ёмкостью до 35 цифр или 21 буквы. В них для выравнивания применяется всего один квадрат в левом верхнем углу, а формат кодируется пикселями возле сторон квадрата:
Как алгоритм дальше работает с данными
Сам алгоритм просто расшифровывает данные из QR-кода и возвращает их тому, кто их вызвал. Если это сканер в магазине, то вернётся название, цена и срок годности. Если это сертификат о прививках, то проверяющий получит ссылку на страницу Госуслуг, а если это служебный код на складе — номер стеллажа и яруса, на котором лежит нужная деталь.
Чаще всего QR-код используется для кодирования ссылок в обычном мире. Например, его используют в ресторанах, чтобы отправлять посетителей на страницу меню на сайте, или на чеке, чтобы можно было перейти на сайт налоговой и проверить его подлинность.
Что можно сделать с QR-кодом
Помимо веб-адресов в QR-коде можно зашифровать:
- настройку wi-fi для телефона — чтобы подключаться к домашнему интернету, не вводя пароль вручную;
- данные о человеке в виде виртуальной визитки;
- адрес электронной почты;
- SMS на какой-то номер с предварительно записанным текстом;
- запрос на отправку криптовалюты на ваш кошелёк (или не ваш);
- целый PDF-файл, MP3-файл или изображение;
- ссылку на магазин приложений;
- и с некоторыми техническими ухищрениями — даже несложную игру.
Как сделать QR-код
Для простых бытовых целей можно использовать любой генератор QR-кодов, который вы найдёте в поиске. Они работают плюс-минус одинаково, разница только в степени жадности создателей.
Но если хотите, можно написать собственный скрипт-генератор, используя готовые библиотеки. Например:
- QRCode.js для JavaScript;
- QRcode для Python;
- Zebra Crossing для Java;
- QR Code Generator — для C, Rust, Java и Python.
И ещё десятки других готовых библиотек. Все пригодные, вопрос лишь в возможностях. В одном из следующих выпусков попробуем это на практике.