Как самостоятельно создать QR код

Содержание:

Quick Response (QR) дословно переводится как «быстрый ответ». Необходимость в кодах появилась в 80-х годах прошлого столетия. В то время были только штрихкоды, но они перестали соответствовать требованиям японской промышленности для маркировки автомобилей. С 1994 года компания Denso Wave внедрила двумерный штрих-код. Попытки популяризировать его вплоть до 2011 года не приносили особых результатов: мобильные устройства не имели постоянного выхода в глобальную сеть, а камеры не отличались сверхвозможностями.

В первую очередь QR-коды нужны для хранения большого объема информации. Теперь это привычные видоизмененные штрих-коды с зашифрованными полезными данными.

В мире программирования QR — это оптическая монохромная метка, в которой содержится информация о привязанном к ней объекте. Изначально коды быстрого отклика разрабатывались для автопромышленности, однако сегодня они уже могут считывать такие сведения как ссылка, текстовая фраза, номер телефона или визитка.

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

Кодирование данных

QR-код позволяет разместить информацию на прямоугольной области. Режим кодирования выбирается зависимо от данных, которые необходимо внести в код. Он может включать цифры, латинские буквы и некоторые специальные знаки. Также используются иероглифы, а последним стандартом кодирования стали байты. Но какими бы не был выбор, генерация кодов происходит за счет следующих этапов:

  • Шифрование.
  • Работа со служебными данными.
  • Разбивка на модули.
  • Создание и объединение байтов коррекции.
  • Размещение данных.

Шифрование

Для первого этапа кодирования нужны 10 bit на три символа. Последние нужно сгруппировать по три цифры и преобразовать в десятибитное бинарное число. Если длина цепочки знаков не делится на три, то при наличии только двух символов, последний модуль кодируется на семь битов, а если остается один символ – на четыре бита. Например, для строки «98765432» разбивка на подгруппы будет выглядеть так: 987, 654 и 32. Затем каждое число модуля нужно перевести в бинарный формат: 1111011011, 1010001110 и 0100000, и объединить в поток: 111101101110100011100100000.

Буквенно-цифровой формат шифрования

Для этого способа одна группа может иметь по два элемента, которые нужно перевести в 11-битное слово с применением таблицы кодировки. Находится соответствующее значение для первого символа и умножается на 45. После этого необходимо к полученному произведению добавить значение второго символа и перевести результат в бинарное 11-битное число. В случае, когда в крайней группе остается только один символ, нужно закодировать его шестибитным числом.

К примеру, кодирование строки «HELLO» производится так:

  • слово разбивается на подгруппы: HE, LL, O;
  • в каждой находится значение символа: (17, 14), (21, 21), (24);
  • производится умножение подгруппы на 45: 17х45+14=779, 21х45+21=966, 24=24;
  • полученные данные переводятся в бинарный формат: 779=01100001011, 96 =01111000110, 24=011000;
  • все символы объединяются в последовательную цепочку бит: 0110000101101111000110011000.

Байтовый формат шифрования

Этот способ подходит для кодирования практически всех символов. Входные данные при помощи таблицы кодировки (например, ASCII) переводятся в поток двоичных, которые потом будут размещены на QR коде.

Например, для строки «Хабр» с типом кодирования UTF-8, код будет иметь такой вид байтов: 11010000, 10100101, 11010000, 10110000, 11010000, 10110001, 11010001 и 10000000. Они объединяются в следующий поток бит: 1101000010100101110100001011000011010000101100011101000110000000.

Работа со служебными данными

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

Например, если необходимо поместить в центр кода рисунок или логотип, нужна максимальная коррекция ошибок.

https://pastenow.ru/7ec6af08555a7d7c83771aeb440da818

Чтоб определить способ кодирования необходимо определить специальные поля коррекции разным максимальным уровнем повреждений:

  • L – 7%,
  • M –15%,
  • Q – 25%
  • H – 30%.

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

Служебные поля

После того как необходимый уровень выбран и определен формат версии шифрования, необходимо добавить вводные о таких полях как количество данных и способ кодирования.

«Количество данных» — это объем символов (байтов), представленных в виде бинарных чисел определённой длины.

https://pastenow.ru/ba4484f1a45890743288ebd459d477d8

«Способ кодирования» может быть в виде 4 бит и со своим значением для разных форматов кодирования:

  • цифровое — 0001,
  • буквенно-цифровое — 0010,
  • побайтовое — 0100.

Заполнение

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

Разделение на модули

Вся система построения бит разбивается на модули. В случае, когда получается только один блок, этот шаг можно пропустить.

https://pastenow.ru/d56ebae96090d50583ed815ffadca87e

Чтобы определить, сколько данных есть в конкретном модуле, нужно разделить общее их количество на число блоков.

Заполнение модулей и создание коррекционных байтов

Проводится коррекция для всех блоков данных. Размер каждого можно определить, исходя из формата code и степени коррекции ошибок.

https://pastenow.ru/9c2cac9b5831997f520e9b49f9cfc5e1

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

https://pastenow.ru/c6b95ca3c29d3ab08e86ba0513133d27

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

Объединение блоков

Итак, мы имеем несколько модулей данных и корректирующих байтовых блоков, которые нужно объединить в один поток. Для этого из каждого модуля данных последовательно берется один байт информации. Эту процедуру нужно повторять, пока в каждом блоке не закончатся байты. Если в очередной группе байтов не имеется, его можно пропустить (это случается, когда обычные модули уже пусты, а в дополненных остался только один байт). То же самое нужно проделать с модулями корректирующих байтов.

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

<1-й байт 1- го модуля данных><1-й байт 2-го блока данных>

https://pastenow.ru/fadeb4871da53ca223aad3b2c3ed92d4

Информация для размещения

Коды быстрого отклика обрамлены белой рамкой и содержат служебные поля для таких задач:

  • детектирование,
  • выравнивание кода,
  • синхронизация,
  • определение используемой маски,
  • коррекция code,
  • версии кода.

Также QR-code содержит поисковые узоры – это три концентрических квадрата в углах изображения.

Как самостоятельно создать QR код

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

Заполнение проводится в пределах столбца справа-налево и снизу-вверх. При достижении верха столбца, надо продолжить движение от верхнего угла справа вниз. Если данных недостаточно, то поля остаются пустыми (модули белого цвета), а на каждый их них накладывается маска (то что мы видим в общем на изображении кода).

Итог

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

Присоединяйся к DevEducation — стань востребованным специалистом и построй карьеру в IT!