Почему QR-код читается, даже если он обрезан
QR-код можно прочитать, даже если часть его обрезана, стёрта, испачкана или закрыта логотипом. Причина — коррекция ошибок: кроме самих данных в код записывается дополнительная информация для их восстановления. Если часть точек потеряна, телефон пересчитывает их по оставшимся. Сколько можно потерять, зависит от уровня коррекции: от 7% до 30% кода.
Объяснение максимально просто
Представьте, что вы диктуете по телефону номер карты, а связь плохая. Чтобы собеседник ничего не перепутал, вы повторяете номер несколько раз и добавляете «сумма цифр — 47». Если одна цифра потерялась, её можно восстановить по повтору и по сумме.
QR-код делает то же самое, только хитрее. Данные записываются в код вместе с «контрольными» байтами, которые посчитаны из этих данных по специальным формулам (они называются кодом Рида — Соломона, тем же способом защищены данные на CD и DVD). Когда часть кода не читается, телефон решает обратную задачу: подбирает такие недостающие байты, при которых всё снова сходится.
Поэтому обрезанный или повреждённый QR-код читается, пока потеряно не больше, чем рассчитан уровень коррекции, и пока целы служебные части кода (о них ниже).

Уровни коррекции ошибок QR-кода
Международный стандарт QR-кодов ISO/IEC 18004 задаёт четыре уровня коррекции:
- L (Low, низкий) — восстанавливает около 7% кода;
- M (Medium, средний) — около 15%;
- Q (Quartile, «четверть») — около 25%;
- H (High, высокий) — около 30%.

Чем выше уровень, тем больше места в коде уходит на запасные байты. При том же объёме данных код с уровнем H получается крупнее и с более мелкими точками, чем с уровнем L. Поэтому уровень выбирают под задачу:
- L — для кодов на экране, где их ничто не повредит и важно, чтобы точки были крупнее.
- M — обычный выбор для большинства кодов.
- Q и H — для печати на улице, на упаковке, на вещах, которые трутся и пачкаются, и для кодов с логотипом в центре.
Что можно обрезать, а что нельзя
Коррекция восстанавливает данные, но не всё в коде — данные.
- Три больших квадрата в углах (поисковые узоры). По ним камера находит код и понимает, как он повёрнут. Если обрезан хотя бы один, код обычно не читается вообще, даже при уровне H.
- Информация о формате — полоски точек рядом с угловыми квадратами. В них записано, какой уровень коррекции и маска использованы. Она продублирована в двух местах, поэтому выдерживает повреждение одной копии.
- Белая рамка вокруг кода. Стандарт требует пустое поле шириной в четыре точки. Если код вплотную обрезан по краю или стоит на пёстром фоне, камере сложнее отделить его от фона.
- Середина и края с данными — то, что как раз и можно потерять в пределах уровня коррекции.

Почему работает QR-код с логотипом
Логотип в центре — это и есть «повреждение», только запланированное: он закрывает часть точек с данными. Если уровень коррекции высокий, телефон восстанавливает спрятанные под логотипом точки и читает код.

В генераторе QRBest уровень подбирается сам: если вы добавляете логотип, код строится с уровнем H, а размер логотипа ограничен, чтобы под ним не пропало больше, чем код может восстановить. Для коротких ссылок без логотипа генератор тоже берёт высокий уровень, для длинных — средний, чтобы точки не стали слишком мелкими.
Как проверить свой код
Перед печатью отсканируйте код с разных телефонов и с расстояния, с которого его будут читать. Если код с логотипом читается с трудом, уменьшите логотип или сделайте сам код крупнее. Проверить код можно и без телефона: скачайте картинку и загрузите её в онлайн-сканер.