7 мин чтенияТуториалы

Уровни коррекции ошибок QR-кода: объяснение L, M, Q, H

Уровни коррекции ошибок QR-кода L, M, Q и H восстанавливают 7, 15, 25 и 30% повреждённого кода. Число модулей на каждом уровне и случаи, когда каждый из них оправдан.

Marius Voß
DevRel · edge infra
Уровни коррекции ошибок QR-кода L, M, Q и H в виде столбцов восстановления на 7, 15, 25 и 30 процентов рядом с реальным QR-кодом

Уровни коррекции ошибок QR-кода - это объём избыточных данных, которые несёт код, чтобы сканер мог восстановить то, что смазано, поцарапано или закрыто логотипом. Их четыре: L, M, Q и H, они восстанавливают примерно 7%, 15%, 25% и 30% кода. Выбирайте M для большинства экранов и коротких ссылок, а H - когда логотип или грубое обращение съедят часть кода. Цена каждого шага вверх - плотность: больше модулей, мельче квадраты при той же напечатанной ширине.

Именно этот компромисс лежит в основе большинства историй вида «мой QR-код не сканируется», и поэтому в этом руководстве мы разбираем реальные числа модулей, а не машем руками. Если вы ещё не создали код, начните со статьи как создать QR-код; эта же статья - о выборе уровня, когда код уже есть.

Что на самом деле делает коррекция ошибок в QR-коде

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

Выбранный уровень определяет, сколько дополнительных кодовых слов будет. Denso Wave, изобретатель формата, описывает функцию коррекции ошибок как четыре уровня и отмечает, что повышение уровня улучшает восстановление, но увеличивает объём данных, а значит и размер символа. Приведённые ниже цифры восстановления указаны в ISO/IEC 18004 и повторены в статье Википедии о QR-коде.

  • Уровень L (низкий): восстанавливается около 7% кодовых слов.
  • Уровень M (средний): около 15%.
  • Уровень Q (квартиль): около 25%.
  • Уровень H (высокий): около 30%.

Обратите внимание на слово «около». Процент считает кодовые слова, а не пятно краски. Думайте об этом как о бюджете на ремонт, а не как о гарантии устойчивости к повреждению.

Четыре уровня коррекции ошибок QR-кода L, M, Q и H с приблизительным восстановлением 7, 15, 25 и 30 процентов и типичным применением каждого

Компромисс плотности: почему выше не всегда безопаснее

Избыточность должна где-то жить. Более высокий уровень загоняет ваши данные в больший символ. QR-коды бывают версий от 1 до 40, а длина стороны - 17 + 4 x версия модулей: версия 1 - это 21 x 21, а версия 40 - 177 x 177, согласно таблице версий и ёмкости Denso Wave. Кодировщик выбирает наименьшую версию, ёмкость которой на выбранном уровне вмещает ваши данные.

Для URL эти данные - текст в байтовом режиме. Версия 2 вмещает 32 байта на L, 26 на M, 20 на Q и 14 на H. Версия 8 вмещает 192, 152, 108 и 84. Версия 11 вмещает 321, 251, 177 и 137.

Цена заметна на версии 8: 192 байта на L, 84 на H. Та же сетка, меньше чем вдвое места для вашего URL, потому что остальное - чётность.

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

Телефон должен различить каждый модуль. Напечатайте код шириной 3 см, и сетка 33 модуля даёт модули примерно по 0,9 мм, а сетка 61 модуль - примерно по 0,5 мм. Та же камера, тот же свет, та же дрожащая рука. Вдвое меньше запаса. Правила размеров в статье каким должен быть размер QR-кода исходят из разумного размера модуля, а плотность - то, что тихо нарушает это допущение.

Разобранный пример: один URL на каждом уровне

Вот эксперимент, который я провожу всякий раз, когда мне говорят «просто поставь H». Я взял отслеживаемый URL кампании длиной 126 символов: домен, путь и параметры utm_source, utm_medium, utm_campaign и utm_content. Затем взял короткую ссылку из 25 символов, https://s.elido.me/qr7kP2, как иллюстративный пример. Оба - в байтовом режиме. Я закодировал каждый на всех четырёх уровнях стандартным кодировщиком, и таблица ёмкости выше предсказывает результат.

УровеньВосстановлениеURL из 126 символовКороткая ссылка из 25 символов
L~7%V6, 41 x 41V2, 25 x 25
M~15%V8, 49 x 49V2, 25 x 25
Q~25%V9, 53 x 53V3, 29 x 29
H~30%V11, 61 x 61V4, 33 x 33

Бросаются в глаза две вещи. Во-первых, длинный URL растёт с 41 до 61 модуля по стороне при переходе от L к H, то есть с 1681 до 3721 модуля, примерно в 2,2 раза по площади. Во-вторых, и об этом никто не упоминает: короткая ссылка на сильнейшем уровне H (33 x 33) всё равно меньше длинного URL на слабейшем уровне L (41 x 41).

Два реальных QR-кода уровня H рядом: URL отслеживания из 126 символов размером 61 на 61 модуль и короткая ссылка из 25 символов размером 33 на 33 модуля, с таблицей числа модулей для всех четырёх уровней

Полезная нагрузка важнее уровня. Вы можете купить максимальный бюджет на ремонт в 30% для короткой ссылки и получить более разреженный и крупный код, чем «эффективный» код уровня L для длинного URL.

Когда выбирать H, а когда лучше L или M

Подбирайте уровень под то, что на самом деле случится с кодом. Общая осторожность - не спецификация.

Выбирайте H (или Q), когда

  • Логотип или фирменный знак расположен посередине. Он скрывает модули, которые сканер должен восстановить.
  • Код напечатан на упаковке, листовке в кармане, наклейке, столе, который протирают, или на чём-либо на улице.
  • Поверхность шершавая или изогнутая, и вы не можете контролировать отделку.
  • Повторное сканирование невозможно, например код на уже отправленном товаре.

Справочная статья Elido о QR-кодах говорит то же самое: держите логотип меньше 20% площади кода и переходите на H, когда выходите за этот предел или печатаете с логотипом.

Выбирайте L или M, когда

  • Код появляется на экране: слайд, веб-страница, подтверждение оплаты.
  • URL короткий, и ничто не закроет и не поцарапает его.
  • Места мало, а код должен остаться маленьким, поэтому важен каждый модуль.

M - практичное значение по умолчанию. Denso Wave говорит, что это самый часто выбираемый уровень, а наша статья QR-код не сканируется делает ту же мысль со стороны службы поддержки: H - неверное значение по умолчанию для обычного кода, потому что добавляемая им плотность вызывает больше неудачных сканирований, чем повреждений, от которых он защищает.

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

Короткие ссылки сохраняют код разреженным (и динамические QR-коды их используют)

Разобранный пример даёт правило, которое можно применить уже сегодня: уменьшайте полезную нагрузку, прежде чем повышать уровень. Динамический QR-код делает именно это. Вместо кодирования полного места назначения он кодирует короткую ссылку, а короткая ссылка перенаправляет туда, куда вы её направите.

Кодирование короткой ссылки даёт три эффекта для надёжности:

  1. Сетка остаётся на низкой версии, поэтому модули остаются крупными при любом размере печати.
  2. Вы можете позволить себе уровень Q или H для логотипа или износа при печати, не раздувая код.
  3. Параметры отслеживания живут на месте назначения, а не в рисунке, так что изменение метки кампании никогда не заставит делать новый, более плотный код.

Есть и четвёртая польза, не связанная с плотностью: поскольку код указывает на короткую ссылку, вы можете перенаправить его позже без повторной печати и бесплатно получаете счётчики сканирований. В статическом коде место назначения вшито в рисунок, поэтому единственный способ исправить опечатку - напечатать заново.

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

Короткий чек-лист перед печатью

Выполняйте по порядку.

  1. Сначала сократите URL; параметры отслеживания держите на месте назначения.
  2. Выберите уровень по таблице: M для экранов и обычной печати, Q или H для логотипов и износа.
  3. Проверьте версию, которую выбрал ваш генератор. Если для URL она выше примерно 10, спросите себя, почему нагрузка так длинна.
  4. Сохраняйте свободную зону: не менее четырёх модулей пустого поля с каждой стороны.
  5. Напечатайте в окончательном размере и отсканируйте двумя разными телефонами при обычном освещении.

Шаг 5 ловит то, что не предскажет никакая таблица. Логотип, казавшийся маленьким на экране, может закрыть больше модулей, чем вы думаете.

Читайте серию опорных статей

Эта статья входит в кластер руководств, а её опорная статья - как создать QR-код. О правилах размера и расстояния, определяющих, достаточно ли велик ваш модуль, читайте в статье каким должен быть размер QR-кода.

Читайте также в блоге

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

Какой уровень коррекции ошибок лучше всего подходит для QR-кода?

Разумное значение по умолчанию - уровень M: он восстанавливает около 15% кода и сохраняет небольшую сетку. Denso Wave, изобретатель формата, говорит, что M - уровень, выбираемый чаще всего. Переходите на Q или H, когда в коде есть логотип или он будет напечатан на том, что потрётся, согнётся или останется на улице.

Что значит 30% коррекции ошибок в QR-коде?

Это значит, что код уровня H всё ещё можно расшифровать, когда до примерно 30% его кодовых слов данных нечитаемы или скрыты. Код хранит дополнительные данные чётности Рида - Соломона, и сканер использует их, чтобы восстановить недостающее. Это потолок восстановимого повреждения, а не обещание, что можно потерять любые 30% поверхности.

Усложняет ли более высокий уровень коррекции ошибок сканирование QR-кода?

Косвенно - да. Более высокие уровни добавляют данные чётности, поэтому тому же URL нужна более высокая версия с большим числом более мелких модулей. При той же напечатанной ширине более мелкие модули камере телефона труднее различить. Решение - более короткая полезная нагрузка, а не более низкий уровень на коде, которому нужна защита.

Нужен ли уровень H, чтобы поместить логотип на QR-код?

Используйте H или хотя бы Q для любого кода с логотипом посередине. Логотип скрывает модули, и сканер считает их повреждением, которое нужно восстановить. Держите логотип заметно меньше четверти площади кода и вдали от трёх угловых квадратов, чтобы износ при печати всё ещё имел запас.

Можно ли отсканировать повреждённый QR-код?

Часто да, в пределах лимита уровня. Поцарапанный, смазанный или частично закрытый код расшифровывается, если потерянная площадь остаётся в пределах того, что может восстановить его уровень, а угловые квадраты целы. Код уровня L переносит около 7% повреждений, код уровня H - около 30%.

Какой уровень коррекции ошибок QR-кода используется по умолчанию?

В стандарте единого значения по умолчанию нет; каждый генератор выбирает своё, а M - самый распространённый выбор. Площадка QR в Elido начинает с M, а L, Q и H доступны в том же элементе управления.

Попробуйте Elido

Вставьте URL - получите короткую ссылку

Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.

Бесплатно, без регистрации · 2 в день

Попробуйте Elido

URL-сокращатель с хостингом в ЕС: собственные домены, глубокая аналитика, открытый API. Бесплатный тариф - без банковской карты.

Теги
qr code error correction levels
qr code error correction
qr code level h
qr code version
reed-solomon qr code
qr code density

Читать дальше