QRkoder

Маска QR-кода

Маска QR-кода — математическое преобразование модулей данных, обеспечивающее равномерное распределение чёрных и белых элементов для надёжного сканирования.

Определение маски QR-кода

Маска QR-кода (Data Masking) — математическое преобразование, применяемое к модулям данных QR-кода для обеспечения равномерного распределения чёрных и белых элементов по площади кода. Стандарт ISO/IEC 18004 определяет 8 стандартных масок, пронумерованных от 0 до 7. При генерации кода каждый модуль данных XOR-ится с соответствующим битом маски, что меняет цвет примерно половины модулей. Выбранная маска записывается в область Format Information и считывается сканером для обратного преобразования.

Цель маскирования — предотвратить нежелательные шаблоны в поле данных, которые могли бы помешать сканированию. Например, длинные полосы одного цвета, квадраты, похожие на Finder Pattern, или шахматные структуры — всё это может сбить алгоритм распознавания. Маска «перемешивает» модули так, чтобы код выглядел визуально случайным и равномерным, что гарантирует надёжное сканирование вне зависимости от содержимого.

Восемь стандартных масок

НомерФормула (инвертировать модуль, если...)
0(i + j) mod 2 == 0
1i mod 2 == 0
2j mod 3 == 0
3(i + j) mod 3 == 0
4(floor(i/2) + floor(j/3)) mod 2 == 0
5(i·j) mod 2 + (i·j) mod 3 == 0
6((i·j) mod 2 + (i·j) mod 3) mod 2 == 0
7((i+j) mod 2 + (i·j) mod 3) mod 2 == 0

Переменные i и j — это координаты модуля (строка и столбец). Каждая маска инвертирует цвет модуля, если формула возвращает истину. Важно: маска применяется только к модулям данных и области коррекции ошибок, но не к служебным областям (Finder Pattern, Alignment Pattern, Timing Pattern, Format Information, Version Information).

Как выбирается маска

Стандарт ISO/IEC 18004 описывает процедуру выбора оптимальной маски. Генератор применяет поочерёдно все 8 масок к коду и для каждой вычисляет штраф (penalty) по четырём правилам:

  1. N1 — штраф за длинные линии одного цвета (5+ модулей подряд): 3 + количество_дополнительных_модулей
  2. N2 — штраф за квадраты 2×2 одного цвета: 3 балла за каждый квадрат
  3. N3 — штраф за паттерны 1:1:3:1:1 (похожие на Finder Pattern): 40 баллов за каждое обнаружение
  4. N4 — штраф за неравномерность распределения: 10 × |50% − доля_чёрных| / 5

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

Где хранится номер маски

Выбранная маска кодируется в области Format Information QR-кода — специальной служебной зоне из 15 модулей, дублированной в двух местах для надёжности. В Format Information записываются:

  • 5 бит: уровень коррекции ошибок (2 бита) + номер маски (3 бита)
  • 10 бит: коррекция BCH(15, 5) для надёжного считывания этих данных

Сканер первым делом читает Format Information, узнаёт уровень ECC и номер маски, после чего применяет обратное XOR-преобразование к модулям данных и получает исходные байты. Только потом применяется декодирование Reed-Solomon для коррекции ошибок и извлечения полезных данных.

Пример применения маски

Представим, что после кодирования данных и Reed-Solomon в QR-коде образовался нежелательный паттерн: несколько строк подряд чёрных модулей и большой чёрный квадрат 4×4. Это создаст высокие штрафы N1 и N2. Генератор применит маску №5 (например), которая инвертирует модули по формуле (i·j) mod 2 + (i·j) mod 3 == 0, и превратит часть чёрных в белые, разбивая длинные линии и квадраты. Штрафы снизятся, и выбранная маска обеспечит равномерный рисунок.

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

Связанные концепции

  • Reed-Solomon — коррекция ошибок после демаскирования.
  • Finder Pattern — паттерны, которых маска избегает воспроизводить.
  • Версия QR — влияет на размер и содержание маскируемой области.

Частые вопросы

Зачем нужна маска в QR-коде?

Маска обеспечивает равномерное распределение чёрных и белых модулей по площади кода, предотвращая нежелательные шаблоны (длинные линии одного цвета, квадраты, ложные Finder Pattern). Без маски некоторые сочетания данных могли бы создать визуальные структуры, похожие на служебные области, что сбивало бы алгоритм сканирования. Маска «перемешивает» модули по простой математической формуле, делая код визуально случайным и гарантируя надёжное распознавание любым сканером.

Сколько стандартных масок в QR-коде?

Стандарт ISO/IEC 18004 определяет ровно 8 стандартных масок, пронумерованных от 0 до 7. Каждая маска задаётся простой математической формулой на основе координат модуля (i, j). Для любого конкретного кода генератор применяет все 8 масок по очереди, вычисляет штрафы по четырём правилам и выбирает маску с минимальным штрафом. Выбранный номер записывается в область Format Information кода для последующего использования сканером при декодировании.

Можно ли выбрать маску вручную?

В большинстве онлайн-генераторов QR, включая QRkoder, маска выбирается автоматически по штрафным правилам — это даёт оптимальный результат. Некоторые профессиональные библиотеки (ZXing, qrcode-js) позволяют задать маску вручную, но это редко нужно. Ручной выбор маски имеет смысл только при художественной стилизации кода, когда одна из масок создаёт визуально более привлекательный паттерн. При этом автоматически выбранная маска почти всегда будет надёжнее для сканирования.

Применяется ли маска к Finder Pattern?

Нет, маска применяется исключительно к модулям данных и области Reed-Solomon коррекции. Все служебные области — три Finder Pattern, Alignment Pattern, Timing Pattern, Format Information, Version Information — остаются неизменными, поскольку их структура критична для первичного распознавания и калибровки кода. Если бы маска изменяла Finder Pattern, сканер не смог бы найти код в кадре. Стандарт ISO/IEC 18004 чётко определяет «функциональные модули», которые исключены из маскирования.

Видна ли маска пользователю?

Пользователь видит только итоговый QR-код с уже применённой маской — номер маски никак не отображается визуально. Два разных QR-кода с одинаковыми данными, но разными масками, будут выглядеть по-разному: паттерны модулей будут отличаться. Однако оба корректно сканируются и дают одинаковый результат, потому что сканер читает номер маски из Format Information и выполняет обратное преобразование. Для конечного пользователя маска — полностью прозрачный технический механизм.

Создавайте QR-коды бесплатно

Динамические QR-коды с аналитикой, дизайном и без ограничений по сканированиям.

Начать бесплатно