QR-коды привычно используются для хранения данных, но чаще всего выглядят как скучный набор чёрно-белых модулей. Однако их можно превратить в произведение искусства, и речь не о простом добавлении картинки поверх. Дело в том, что внутри кода зашиты специальные корректирующие данные (коды Рида-Соломона), которые помогают сканеру распознать изображение, даже если оно повреждено. Если переусердствовать с искажениями, код просто перестанет считываться. Значит, самое грамотное решение — изменять картинку так, чтобы эти важные биты оставались нетронутыми.
Первопроходцем тут был Russ Cox, придумавший проект QArt. Его идея заключалась в том, чтобы добавлять в конец URL-адреса специальные символы (цифры). Браузер на них никак не реагирует и просто игнорирует, а вот QR-генератор использует их для создания узора, напоминающего заданное изображение. Этот трюк работает, потому что вычисление битов коррекции ошибок — обратимый процесс. Зная желаемый результат, математически можно подобрать исходные данные, решив систему линейных уравнений.
Но у такого подхода есть серьёзный минус — разрешение кода слишком маленькое, чтобы передать мельчайшие детали фотографии или сложного рисунка. Низкое разрешение требует особого подхода: недостаточно просто «ужать» картинку до размера сетки QR. Нужно думать о том, как человек воспринимает изображение, чтобы не перепутать его с похожими объектами. Именно поэтому спрайты в старых играх и шрифты для маленьких экранов всегда рисовали вручную, попиксельно, а не просто оцифровывали большие рисунки.
Развивая эту идею, разработчики сервиса QArtText (сайт qarttext.pages.dev) пошли дальше: вместо попыток повторить картинку они генерируют QR с текстовым сообщением сразу внутри. Специальный шрифт, оптимизированный для низких разрешений, рисует буквы прямо в теле кода. Данные размещаются в байтах после терминатора, которые обычные декодеры игнорируют. Этот метод универсален: можно кодировать не только ссылки, но и номера телефонов, пароли от Wi-Fi и прочее. Получившийся результат легко дорабатывать вручную — сдвигать надпись, при этом блоки исправления ошибок пересчитаются автоматически, или даже переключать отдельные пиксели для точной настройки вида, отслеживая при этом количество повреждённых слов.
Готовый QR при необходимости экспортируется в форматах PNG, SVG или DXF. Сервис работает как полноценное приложение в офлайн-режиме и не отправляет данные в интернет. Исходный код доступен на GitHub, так что любой желающий может поэкспериментировать с созданием собственных читаемых и красивых QR-кодов.
