Timing Pattern
Timing Pattern — временная дорожка QR-кода из чередующихся чёрных и белых модулей, служащая для калибровки размера модулей при декодировании.
Определение Timing Pattern
Timing Pattern (временная дорожка) — служебная область QR-кода, состоящая из двух линий чередующихся чёрных и белых модулей. Первая линия — горизонтальная, проходит по 6-й строке кода между двумя верхними Finder Pattern. Вторая — вертикальная, проходит по 6-му столбцу между левым верхним и левым нижним Finder Pattern. Timing Pattern всегда начинается и заканчивается чёрным модулем, а длина зависит от версии QR-кода: от 5 модулей в версии 1 до 161 модуля в версии 40.
Основная функция Timing Pattern — калибровка размера модулей при декодировании. Когда сканер получает искажённое или размытое изображение QR-кода, точно определить границы каждого модуля по изображению сложно. Чередующиеся чёрные и белые модули Timing Pattern дают эталонную «линейку», по которой декодер восстанавливает точные размеры и позиции каждого модуля в сетке. Это повышает надёжность считывания при плохом освещении, нерезкой печати или наклоне.
Как работает Timing Pattern
После того как сканер нашёл Finder Pattern в трёх углах кода, он может приблизительно определить размер матрицы (количество модулей по стороне). Однако из-за перспективных искажений и неточностей построения точный размер каждого отдельного модуля может варьироваться. Timing Pattern решает эту задачу: чёрно-белые модули чередуются строго через один, и декодер легко считает их количество, проводя линию между центрами Finder Pattern.
По количеству модулей в Timing Pattern сканер вычисляет версию QR-кода и, как следствие, точный размер матрицы. Например, если между Finder Pattern насчитано 25 модулей по горизонтали, это версия 2 (25×25). После этого декодер знает точные координаты каждого модуля данных и может корректно их считать, применив маску и декодировать через Reed-Solomon.
Структура и расположение
| Параметр | Значение |
|---|---|
| Горизонтальная дорожка | Строка 6, между Finder Pattern |
| Вертикальная дорожка | Столбец 6, между Finder Pattern |
| Начальный модуль | Всегда чёрный |
| Конечный модуль | Всегда чёрный |
| Чередование | Чёрный, белый, чёрный, белый... |
| Длина в версии 1 | 5 модулей |
| Длина в версии 40 | 161 модуль |
Timing Pattern пересекает Alignment Pattern в больших версиях кода (начиная с 7), но это не создаёт конфликта — стандарт ISO/IEC 18004 определяет, что Alignment Pattern имеет приоритет, и в пересекаемой области рисуется именно он. Декодер при калибровке учитывает эту особенность и корректно интерпретирует составную структуру.
Почему именно 6-я строка и столбец
Выбор позиции 6 (начиная с нуля, седьмая строка и столбец) обусловлен геометрией Finder Pattern. Каждая поисковая метка занимает 7 модулей, плюс 1 модуль сепаратора — итого 8. Timing Pattern располагается прямо за сепаратором на 6-й строке (считая от 0) и начинается с 8-го модуля — сразу после правого сепаратора левой верхней Finder Pattern и продолжается до левого сепаратора правой верхней Finder Pattern.
Такое расположение оптимально: дорожки проходят между двумя соседними Finder Pattern, давая максимальную длину опорной линейки внутри кода. Это важно для точности калибровки: чем длиннее Timing Pattern, тем точнее можно определить размер модулей. В версии 40 временная дорожка достигает 161 модуля, что обеспечивает высокую точность даже при значительных искажениях.
Связанные концепции
- Finder Pattern — поисковые метки, ограничивающие Timing Pattern.
- Alignment Pattern — метки выравнивания, пересекающие Timing.
- Модуль QR — базовая единица кода, размер которой калибруется.
Частые вопросы
Зачем QR-коду нужен Timing Pattern?
Timing Pattern работает как эталонная линейка для калибровки размера модулей. Finder Pattern в углах дают общий каркас кода, но размер отдельных модулей внутри нужно уточнить, особенно при перспективных искажениях или размытой печати. Чередующиеся чёрные и белые модули Timing Pattern позволяют точно сосчитать количество модулей в сетке и определить версию QR-кода. Без Timing Pattern надёжно декодировать код было бы значительно сложнее, особенно в версиях 10+ с большим количеством модулей.
Где расположен Timing Pattern в QR-коде?
Timing Pattern состоит из двух линий. Горизонтальная — на 6-й строке QR-кода (считая от 0), между двумя верхними Finder Pattern. Вертикальная — на 6-м столбце, между левым верхним и левым нижним Finder Pattern. Позиция 6 выбрана, потому что каждая Finder Pattern занимает 7 модулей плюс 1 модуль сепаратора — итого 8. Timing Pattern начинается сразу за сепаратором и идёт до следующей Finder Pattern, формируя служебные линии внутри кода.
Что будет, если Timing Pattern повреждён?
Повреждение Timing Pattern — одна из самых серьёзных ошибок в QR-коде. Без точной калибровки размера модулей сканер не сможет правильно считать данные, даже если Finder Pattern целы. В больших версиях (10+) повреждение временной дорожки приведёт к сдвигу всей сетки модулей на доли модуля, что каскадно сломает декодирование. Поэтому при встраивании логотипа и элементов дизайна ни в коем случае нельзя перекрывать Timing Pattern — даже уровень коррекции H не спасёт от такой ошибки.
Timing Pattern всегда начинается с чёрного модуля?
Да, стандарт ISO/IEC 18004 требует, чтобы Timing Pattern начинался и заканчивался чёрным модулем. Чередование идёт по схеме: чёрный, белый, чёрный, белый... и так до последнего чёрного. Для любой версии QR-кода количество модулей в Timing Pattern нечётное, что гарантирует симметрию «чёрные на обоих концах». Это помогает декодеру легко определить границы дорожки и корректно её интерпретировать при декодировании версии кода.
Может ли Alignment Pattern пересекать Timing Pattern?
Да, в QR-кодах версии 7 и выше Alignment Pattern может пересекать Timing Pattern. В таких случаях стандарт ISO/IEC 18004 определяет приоритет Alignment Pattern: в пересечении рисуется метка выравнивания, а Timing Pattern прерывается на этой области. Декодер это учитывает и корректно интерпретирует обе структуры, используя известные правила их расположения. Это одна из причин, почему QR-код с версии 7 становится сложнее для генерации без специализированной библиотеки.