Почему штрихкод перестал считываться
Сканер смотрит не на картинку, а на ширины штрихов и промежутков: значение он восстанавливает по их соотношению, поэтому ему важно точное положение границы чёрного и белого. JPEG в первую очередь выбрасывает высокие частоты, а резкая граница из них и состоит — вдоль каждого штриха появляется светлый ореол, и край уезжает на доли пикселя. Плюс арифметика: полоса 0,33 мм при 95 DPI занимает 1,2 пикселя.
Коротко о цифрах
- Что измеряет сканер
- ширины штрихов и промежутков, то есть положение границ
- Полоса 0,33 мм при 95 DPI
- 1,2 пикселя — край попадает внутрь пикселя
- Она же при 254 DPI
- 3,3 пикселя
- Модуль QR 0,5 мм при 186 DPI
- 3,7 пикселя
- Что выбрасывает JPEG
- высокие частоты, а резкая граница состоит именно из них
Что именно ломается
Декодер линейного кода не «узнаёт картинку», а измеряет последовательность ширин: узкий штрих, широкий промежуток, снова узкий. Пока соотношения выдержаны, код читается даже перекошенным и грязным. Как только границы смещаются неравномерно, измерение перестаёт сходиться, и устройство просто молчит — без объяснения причины.
Растеризация вносит первую ошибку. При 95 DPI полоса в треть миллиметра занимает чуть больше пикселя, и её край почти всегда приходится на середину пикселя, который закрашивается серым. При 254 DPI на ту же полосу приходится 3,3 пикселя, и край ложится точнее. Вторую ошибку добавляет JPEG, размывая то, что осталось.
Арифметика ширины штриха
- Полоса 0,33 мм при 95 DPI — 1,2 пикселя.
- Она же при 186 DPI — 2,4 пикселя.
- Она же при 254 DPI — 3,3 пикселя.
- Модуль QR-кода 0,5 мм при 95 DPI — 1,9 пикселя, при 186 DPI — 3,7 пикселя.
Как вернуть читаемость
- Возьмите исходный файл: из размытого кода резкий не восстановить, повторное сжатие только добавит второй слой ореолов.
- Поставьте качество 80–100 % — это 254–300 DPI, при которых край штриха ложится в отдельный пиксель.
- Если вес всё равно не сходится, не растеризуйте документ вовсе: оптимизация уменьшает файл, не трогая изображение кода.
- Страницу с кодом можно выгрузить в PNG — формат без потерь, ореолов не появляется вообще.
- Проверьте результат до отправки: наведите камеру телефона на код в масштабе 100 % или распечатайте страницу и просканируйте.
Как убедиться, что дело в сжатии
- Исходный файл считывается, а результат нет — значит, причина появилась по дороге, а не в самом коде.
- В масштабе 100 % вдоль штрихов виден светлый ореол, которого нет в исходнике.
- Края штрихов стали серыми и мягкими, хотя середина осталась чёрной.
- QR-код теряет углы-искатели: три квадрата по краям расплываются раньше остального рисунка.
Частые вопросы
На экране код выглядит нормально, а сканер его не берёт. Почему?
Глаз достраивает размытый край и не замечает подмены, а декодер измеряет ширины в долях миллиметра. Сдвиг границы на треть штриха для человека невидим, а для измерения фатален.
Поможет ли увеличить контраст изображения?
Нет. Ореол вокруг штриха симметричен, и усиление контраста вытянет его вместе с самим штрихом, сделав границу ещё более рваной. Данных о точном положении края в файле уже не осталось.
Какое качество ставить, если на листе есть штрихкод?
Не ниже восьмидесяти процентов, а лучше вовсе обойтись без растеризации. Штрихкод — единственный элемент документа, который читает машина, и запас по разрешению здесь дешевле, чем повторная отправка.
Можно ли проверить код, не печатая документ?
Да. Откройте страницу в масштабе 100 % и наведите на экран камеру телефона: приложение-сканер прочитает код прямо с монитора, если границы штрихов сохранились достаточно резкими.