
Дизеринг QR-кодів: як сховати фото всередині робочого коду
Розробник Ендрю Тейлор пояснив, як дифузія помилок і двопрохідний трюк дозволяють QR-коду нести однобітний портрет і при цьому скануватися.
QR-код може скануватися навіть із прихованою всередині фотографією — якщо знати, як обійти правила. Розробник Ендрю Тейлор, автор генератора дизеризованих QR-кодів, опублікував розбір техніки, на якій працює його інструмент: він перетворює звичайні коди на однобітні портрети, а сирцевий код доступний на Codeberg.
Анатомія QR-коду
QR-код — це сітка квадратів, що поділяється на дві частини: функціональні шаблони, помітні фігури, які допомагають сканеру знайти код і визначити його орієнтацію, та модулі даних, де зберігається саме повідомлення і службові байти. Оскільки модулі даних зчитуються лише після того, як сканер зачепився за функціональні шаблони, їх можна змінювати — саме тому бренди друкують оригінальні QR-коди, — хоча кожна зміна зменшує надійність зчитування.
Фото всередині шуму
Один зі шляхів, показаний Дейвом Річесоном у дописі, на який посилається Тейлор, — зменшити кожен модуль: поділити піксель на сітку 3×3, зберегти закодований біт у центральній клітинці, а решту вісім віддати зображенню. Результат — однобітне фото низької роздільності, вкрите шумом «солі та перцю», адже один піксель із дев'яти все одно несе дані.
Дизеринг і дифузія помилок
Півтони зазвичай створюють дизерингом — наприклад, шаблоном Баєра, що імітує проміжні тони шаховим візерунком із чорного й білого. Дифузія помилок іде далі: коли піксель проходить поріг, похибка розподіляється на сусідні, ще не визначені пікселі, тож кожна ділянка в середньому ближча до справжньої яскравості, ніж за регулярного дизерингу, а менш регулярна текстура не так втомлює око. Приклад Тейлора — однобітне зображення «Давида» Мікеланджело розміром 147×147, оброблене алгоритмом Флойда — Стейнберга.
Щоб модулі даних не виблискували, він виконує дифузію двічі. Перший прохід надає модулям обов'язкові кольори й розподіляє отриману похибку на вісім сусідніх пікселів — вона може сягати 95%, коли піксель у темній зоні мусить бути чисто білим, — а другий прохід працює звичайно. Саме маскування першої похибки, пише він, робить зображення читабельним.
Ціна — здатність скануватися
Між виглядом і надійністю є компроміс. Код, який зчитується з екрана ноутбука вашим телефоном, може не зчитатися на чужому телефоні з роздруківки за поганого освітлення. Генератор також видає крихітні зображення без полів, а сканерам потрібна «тиха зона»; браузери розмивають збільшені зображення, якщо в CSS не задано image-rendering. Колір полів має відповідати фону пошукових шаблонів — зазвичай білому, хоча інвертованим QR-кодам потрібен чорний.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.