Разработчик Монако действительно сделал отличную статью о том, как они и Spore достигли этого.
Основная сводка того, что они делают, довольно проста:
- Преобразуйте ваши данные в двоичный файл
- Преобразование целевого изображения в необработанное растровое изображение
- Пройдите по пикселям изображения в некотором предсказуемом порядке (они просто идут слева направо из верхнего левого угла).
- Запишите один бит в бит самого низкого порядка каждого цветового канала каждого пикселя
- Снова экспортируйте измененное растровое изображение в png
Просто сделайте это в обратном порядке, чтобы получить ваши данные.
Основная идея этого процесса заключается в том, что в изображении много пикселей, а биты младшего разряда каждого цветового канала не имеют большого значения. значения. Кроме того, около половины написанных вами битов будут такими же, какими были биты в изображении. То, что вы получите, по сути, правильное изображение, но со странными артефактами. Он тратит время, чтобы заметить, что эти артефакты действительно заметны, только если вы действительно проверяете контрастность / насыщенность и увеличение. Однако у него есть исходные изображения с большим количеством начальных шумов.
Из статьи:
Обратите внимание, что на последнем изображении едва заметна горизонтальная линия в шуме. Это конец данных уровня. Это означает, что я могу фактически вписать все данные уровня в изображение размером 265x120 пикселей, используя только младший бит.
ПОЛЕЗНОЕ ДОБАВЛЕНИЕ:
Что-то, что я мог сделать, и я полагаю, что люди Spore сделали то же самое, фактически используют ВСЕ цветовые биты в пикселях, которые на 100% прозрачны. Поскольку эти пиксели прозрачны, не имеет значения, какой цвет вы им зададите.
Однако я не могу этого сделать, поскольку я использую все изображение, а это означает, что у меня нет прозрачных пикселей для работы.
Зачем предпочитать эту технику, а не просто хранить ее в метаданных?
- Это веселее! :)
- Сервисы могут манипулировать метаданными (возможно, как функция конфиденциальности / безопасности), но не должны манипулировать пикселями вашего png, если у них нет агрессивных требований к размещению изображений (глядя на вас, facebook). Но если они полностью реэкспортируют ваше изображение, вы ничего не сможете с этим сделать.
Дополнительный кредит: чтобы уменьшить заметность шума, вы можете использовать PRNG с фиксированным начальным числом для выбора пикселей для модификации. Вы также можете изменить некоторые цветовые каналы только аналогичным образом.