QR-код придумали намного раньше ковида — в 1994 году в Японии, в компании Denso. Им нужно было помечать на складе запчасти для машин, а обычных в то время штрихкодов уже не хватало — они могли хранить только 13 цифр, а этого не хватало для всего ассортимента на складе. С тех пор QR-код стал стандартом сначала для маркировки товаров, а потом — для хранения любой информации. В современных QR-кодах можно хранить картинки и даже звуки.
Почему QR-код выглядит именно так
Главная задача, которую решали инженеры Denso, звучала так: «Как закодировать информацию таким образом, чтобы вместить туда гораздо больше данных, чем в простом штрихкоде?»
Обычный штрихкод — это последовательность узких и широких чёрных полос с белыми просветами между ними. Каждая комбинация полос и просветов кодирует какую-то цифру:
![Почему QR-код выглядит именно так Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image1-1.png)
Высота штрихкода не влияет на объём данных — даже если его растянуть в высоту в несколько раз, всё равно в нём будет закодировано столько же цифр. Можно было бы увеличить длину кода, но тогда рисунок стал бы слишком длинным и не помещался на всех поверхностях.
Чтобы решить эту проблему, QR-код сделали не одномерным, как штрихкод, а двумерным — когда информация закодирована и по горизонтали, и по вертикали. Такой приём увеличил плотность информации, и теперь код может хранить 7089 цифр или 4296 символов.
![Почему QR-код выглядит именно так Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image3-1.png)
Зачем нужны три квадрата по углам
Три квадрата помогают считывающему датчику правильно развернуть код для дальнейшей обработки. Теперь подробнее.
Обычный штрихкод считывается лазерным лучом, который пробегает по штрихам и составляет из них ноли и единицы. С QR-кодом так не сработает — лазеру нужно было бы пройти по каждому квадратику в коде, чтобы его считать. Поэтому QR-код сканируют более продвинутыми оптическими датчиками, похожими на сенсоры в цифровых камерах. Ну и цифровыми камерами тоже.
Прежде чем алгоритм начнёт распознавать то, что там закодировано, ему нужно внутри себя правильно развернуть код, чтобы считать всё в определённой последовательности. Для этого в QR-код добавили три квадрата по углам — они говорят камере, как именно считан код, и помогают алгоритмам виртуально развернуть его нужной стороной. Система распознавания находит эти квадраты и поворачивает код так, чтобы правый нижний угол был без такого квадрата. После этого алгоритм приступает к расшифровке.
Для надёжности в QR-код добавляют четвёртый квадрат, поменьше — он помогает камере быстрее повернуть код нужной стороной:
![Зачем нужны три квадрата по углам Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image4-1.png)
Как алгоритм понимает, какие данные там зашифрованы
В QR-коде могут храниться разные данные, которые закодированы тоже по-разному. Чтобы алгоритм понял, с чем именно ему предстоит работать, возле каждого большого квадрата есть область с информацией о том, что именно хранится в коде: текст, URL-адрес для браузера, картинка, звук или числа.
Алгоритм берёт данные из этой области, раскодирует их и понимает, какой метод нужно применить к остальным данным в коде.
![Как алгоритм понимает, какие данные там зашифрованы Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image6-e1649146081643.png)
Версии и работа с ошибками
Чтобы сделать код ещё более защищённым, разработчики предусмотрели в алгоритме автоматическое исправление ошибок — например, когда стёрлась часть квадратов или кто-то поверх него что-нибудь написал. В зависимости от версии алгоритма он способен восстановить данные, даже если повреждено 30% всех пикселей на картинке.
![Версии и работа с ошибками Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image5-e1649146161253.png)
Для этого используется специальный код Рида — Соломона. Он берёт исходные данные, добавляет к ним несколько проверочных символов (их должно быть в два раза больше, чем возможных ошибок) и составляет сложные математические уравнения. В коэффициентах этих уравнений и будут закодированы наши данные вместе с дополнительными. Если мы добавим 10 дополнительных символов, то сможем исправить 10 / 2 = 5 ошибок.
Кстати, этот же код используется в компакт-дисках. Именно поэтому удаётся прочитать даже поцарапанный диск, когда часть фрагментов с данными физически испорчена.
Информация о том, какая версия алгоритма используется в QR-коде, находится тоже возле больших квадратов:
![Версии и работа с ошибками Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image2-1.png)
Микроформат
Если данных немного, используют маленькие QR-коды с ёмкостью до 35 цифр или 21 буквы. В них для выравнивания применяется всего один квадрат в левом верхнем углу, а формат кодируется пикселями возле сторон квадрата:
![Что внутри любого QR-кода](https://thecode.media/wp-content/uploads/2022/04/image7.png)
Как алгоритм дальше работает с данными
Сам алгоритм просто расшифровывает данные из 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.
И ещё десятки других готовых библиотек. Все пригодные, вопрос лишь в возможностях. В одном из следующих выпусков попробуем это на практике.