SWAPQR← Руководство

Полутоновые QR-коды против QR-кодов с дизерингом

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

Создать QR-код в браузере →Напечатайте квадрат один раз. Куда он ведёт — решите потом.

Полутоновый метод

Классический полутоновый генератор QR, ходящий по сети примерно с 2013 года, утраивает размер кода. Каждый модуль становится блоком 3×3 из субпикселей. Центральный субпиксель закрепляется за нужным модулю цветом, остальные восемь свободны и принимают то, что говорит уже пороговая картинка. Сканер снимает значения в центрах модулей — значит, верными должны быть именно центры, и они верны. Метод работает и даёт узнаваемый вид: правильная решётка точек, лежащая поверх картинки, потому что каждый третий пиксель в обоих направлениях закреплён и все закреплённые пиксели выстроены идеально. Глаз человека крайне хорош в поиске регулярной решётки. Увидев её однажды, развидеть уже нельзя. Подход прост в реализации и лёгок для рассуждений, поэтому его использует столько генераторов, и для кода, который будут смотреть только на экране в его родном размере, он вполне пригоден. Его ограничения проявляются в печати, где ничто не рассматривается в родном размере, а единственному закреплённому пикселю на модуль приходится в одиночку переживать принтер, бумагу, освещение и пересэмплирование камерой.

Метод с дизерингом

Подход с дизерингом меняет одну вещь, и она меняет всё. Вместо того чтобы сначала бинаризовать картинку, а потом переписывать пиксели, он проводит картинку через рассеивание ошибки и считает принудительный пиксель частью этого процесса: поставь значение, измерь вызванную этим ошибку и протолкни её в соседние пиксели так же, как Флойд—Стейнберг проталкивает любую другую. В результате принудительные пиксели оказываются скомпенсированы. Пиксели вокруг них сдвигаются, удерживая локальное среднее правильным, поэтому принудительные точки садятся в тот же нерегулярный крап, что и остальное изображение. Решётки, за которую глаз мог бы зацепиться, нет, и картинка читается как картинка, а не как картинка за сеткой. Принудительная область при этом не обязана быть одним пикселем: это может быть блок в центре каждого модуля, размер которого является настройкой, — тем самым и управляет баланс «Фото ↔ Код» в SWAPQR. Остальная часть модуля, а с ней и картинка в нём, — это то, что оставляет рассеивание ошибки, и по построению средний тон здесь правильный для того модуля, которому эта часть принадлежит.

Бок о бок

В полутоновом методе картинка бинаризуется до размещения кода; в методе с дизерингом обе вещи происходят вместе, за один проход. Полутон закрепляет один субпиксель на модуль по идеальной сетке; дизеринг закрепляет центральный блок настраиваемого размера, спрятанный в крапе. Визуальная подпись полутона — регулярная точечная решётка поверх изображения; дизеринга — фотографическое зерно. Полутон почти не даёт настройки: один пиксель из девяти зафиксирован, и на этом всё, тогда как дизеринг даёт непрерывный выбор того, какая доля модуля ставится принудительно. А по устойчивости вблизи полутон слаб, потому что один пиксель на модуль не переживает никакого пересэмплирования, тогда как результат дизеринга настраиваем и, как показывает статья этого руководства о близком сканировании, измерим: ниже примерно половины принудительной доли модуля старые читатели с блочным порогом спотыкаются вплотную, выше — нет. Эти два метода не вариации одной темы; они отвечают на вопрос «куда девать картинку» в разном порядке, и именно порядок глаз и видит.

Где дизеринг выигрывает с большим отрывом

Поскольку величина принуждения здесь регулятор, а не жёсткое «один из девяти», генератор с дизерингом может осознанно менять картинку на надёжность. Это не косметическая разница: при одном принудительном пикселе на модуль код зависит от того, переживёт ли единственный пиксель каждое пересэмплирование между принтером и матрицей, а он часто не переживает. Струйный принтер его растечёт, лазерный округлит, ламинация размоет, камера под углом размажет его по двум пикселям матрицы, а собственное уменьшение декодера усреднит его с соседями. Принуждать блок — и позволять рассеиванию ошибки за него платить — это и есть то, что позволяет технике держаться в печати. Это же означает, что один и тот же генератор способен выдать почти обычный код для наклейки, к которой телефон приложат вплотную, и почти чистую фотографию для афиши, сканируемой с метра, из той же картинки и той же ссылки, движением одного регулятора. У полутона такого регулятора нет: его надёжность и его вид заданы самим методом, и единственный способ сделать его устойчивее — отказаться от него в пользу большей закреплённой области, но в этот момент он уже стал методом с дизерингом, только с худшей компенсацией.

Где не выигрывает ни один

Ни один подход не сделает плохую фотографию хорошей, и ни один не переживёт длинную полезную нагрузку. Обоим нужен высший уровень коррекции ошибок, который сам по себе делает код плотнее. Плоское малоконтрастное изображение проваливается в обоих по одной причине: оно даёт ровную текстуру, конкурирующую с модулями. Длинная ссылка проваливается в обоих, потому что модули становятся слишком мелкими, чтобы удержать хоть какую-то картинку. И оба в итоге являются осознанным обменом: вы тратите надёжность, чтобы купить изображение. Тратьте там, где изображение чего-то стоит, и проверяйте отпечаток. Стоит назвать и третье семейство: генераторы, которые кладут нетронутую картинку за обычный код и просто осветляют модули, либо вырезают логотип посередине. Они не кодируют картинку вовсе — они полагаются на то, что коррекция ошибок поглотит повреждение. Вполне допустимо, куда менее интересно и куда сильнее ограничено по количеству изображения, потому что вся цена платится из бюджета коррекции ошибок и ничем не компенсируется.

АспектПолутон (3×3)Дизеринг (рассеивание ошибки)
Когда бинаризуется картинкаДо размещения кодаВместе с кодом
Принудительные пикселиОдин на модуль, по идеальной сеткеЦентральный блок, спрятанный в крапе
Визуальная подписьРегулярная точечная решётка поверх изображенияФотографическое зерно
Доступная настройкаПочти нет — 1 пиксель из 9 зафиксированНепрерывная — выбираете принудительную долю модуля
Устойчивость вблизиСлабая — один пиксель на модуль не переживает пересэмплированияНастраиваемая и измеримая

Часто задаваемые вопросы

Какой метод использует SWAPQR?

Метод с дизерингом. Картинка сводится рассеиванием ошибки Флойда—Стейнберга, нужные коду пиксели ставятся принудительно, а их ошибка рассеивается по соседям; размер принудительного блока и есть баланс «Фото ↔ Код».

Почему полутоновый код выглядит так, будто на нём решётка?

Потому что ровно один субпиксель в каждом блоке 3×3 закреплён, и эти закреплённые пиксели идеально выстроены в обоих направлениях. Глаз находит регулярную решётку мгновенно.

Вырезанный посередине логотип — это то же самое?

Нет. Там расчёт на то, что коррекция ошибок поглотит повреждённую область, и ничто это повреждение не компенсирует. Приём допустим, но изображения он позволяет заметно меньше, чем полутон или дизеринг.

Обоим нужна высшая коррекция ошибок?

Да. Оба тратят часть восстановительного бюджета кода на картинку, поэтому оба генерируются на высшем уровне, что делает код плотнее и является ещё одной причиной держать ссылку короткой.

Напечатайте квадрат один раз. Куда он ведёт — решите потом. SWAPQR создаёт статические QR-коды бесплатно, со всеми вариантами оформления, без аккаунта и без водяного знака. Платный план делает код динамическим: напечатанный квадрат остаётся прежним, а вы меняете его адрес назначения и видите, как часто его сканировали, по дням и по устройствам.

Создать QR-код в браузере
Язык: TR EN DE ES FR IT PT AR RU JA KO