Spore позволяет создавать существа, созданные игроком, путем экспорта .png
файла. Это .png
фотография существа, но если она импортирована в игру, информация о существе (например, текстуры, размер и форма) также приходит с ним.
Как я могу реализовать такую функцию?
file-format
savegame
png
ibrabeicker
источник
источник
Ответы:
Если вам действительно нужен файл PNG, скорее всего, они просто добавят информацию в файл. Это на самом деле практика стеганографии . В большинстве случаев это используется для сокрытия полезных нагрузок или секретных сообщений в вещах, которые кажутся общедоступными. Однако вполне вероятно, что в этом случае этот метод является тем, что использовалось. Типичная стегонография будет скрывать содержимое, но нет причины, по которой нельзя просто добавить данные из изображения в конец файла и извлечь его.
Несколько инструментов кодируют эти данные для вас, поиск Google выявляет, по крайней мере, это и это .
PNG имеет байтовую подпись
$89
в начале, поэтому возможно, что информация была вставлена после самой структуры PNG и просто проанализирована игрой SPORE.Однако дальнейшие исследования, проведенные другими ответами и поиском в Google, показывают, что Spore фактически использовала только версию Stegongraphy, чтобы скрыть информацию в альфа-битах. Имея это в виду, мы можем исключить возможность добавления данных или метаданных.
Следует отметить, что метаданные все еще являются очень жизнеспособным выбором, если данные анализируются локально. Если эта информация может быть передана через Интернет или перекодирована, экспорт не гарантирует сохранение всей вашей информации. Когда используются пиксельные данные, они могут без потерь переживать преобразования без потерь.
источник
Формат PNG поддерживает более или менее произвольные метаданные. Стандарт PNG определяет файл PNG, по существу, последовательность фрагментов, некоторые из которых являются обязательными (и содержат данные изображения). Другие, однако, не являются обязательными. Например, есть блок для хранения гамма-информации или данных гистограммы.
В частности, есть
tEXt
блок, который можно использовать для хранения произвольных пар ключ / значение. Это может быть использовано для отправки произвольных данных любого типа, которые вы хотите, при условии, что вы можете представить эти данные в виде текста (что весьма вероятно).Вам понадобится библиотека PNG, которая позволит вам получать доступ к этим дополнительным фрагментам (например, справочная библиотека ) и манипулировать ими , или вам нужно будет написать ее самостоятельно. Тогда нужно просто выбрать способ кодирования данных в виде пар ключ / значение. Я бы предложил следующее:
В интересах более полного ответа я также укажу, что существует другой подход (ранее задокументированный в ответах @Vaughn и @ Alexis): кодировать дополнительные данные, которые вы хотите, непосредственно в пикселях изображения, распределяя их по младшие биты цветовых каналов. Этот подход не требует использования дополнительных метаданных, что означает, что вы можете реализовать их полностью, не полагаясь на них или не беспокоясь о том, что внешние программы неправильно обрабатывают эти метаданные. Он также имеет очень высокий «крутой» коэффициент, и поскольку вы используете только младшие биты, изображение все равно будет выглядеть правильно для человеческого глаза. Однако это означает, что размер вашего изображения является основным определяющим фактором для объема данных, которые вы можете хранить; если вам нужно больше памяти, вам нужно выделить больше пикселей для изображения.
Как уже отмечали другие, этот процесс известен как стеганография .
источник
Разработчик Монако действительно сделал отличную статью о том, как они и Spore достигли этого.
Основная сводка того, что они делают, довольно проста:
Просто сделайте это в обратном порядке, чтобы получить ваши данные.
Основная идея этого процесса заключается в том, что в изображении много пикселей, а биты младшего разряда каждого цветового канала не имеют большого значения. значения. Кроме того, около половины написанных вами битов будут такими же, какими были биты в изображении. То, что вы получите, по сути, правильное изображение, но со странными артефактами. Он тратит время, чтобы заметить, что эти артефакты действительно заметны, только если вы действительно проверяете контрастность / насыщенность и увеличение. Однако у него есть исходные изображения с большим количеством начальных шумов.
Из статьи:
Зачем предпочитать эту технику, а не просто хранить ее в метаданных?
Дополнительный кредит: чтобы уменьшить заметность шума, вы можете использовать PRNG с фиксированным начальным числом для выбора пикселей для модификации. Вы также можете изменить некоторые цветовые каналы только аналогичным образом.
источник
Я скачал и исследовал несколько существ Spore из Sporepedia. От тех, кого я узнал, что:
Стоит отметить, что это именно то, что делает Spore, это метод, который ставит простоту перед большинством других проблем.
Выбор использования стенографии, а не дополнительного блока данных означает, что данные выживут, если изображение перекодируется, например, веб-сайтом, хотя оно не выдержит масштабирования или сжатия Jpeg.
Я думаю, что наиболее выдающейся альтернативой на самом деле является только кодирование идентификатора на изображении и сохранение фактических данных на центральном сервере, где этот идентификатор можно обменять на точные данные о существе. Такой идентификатор будет достаточно коротким, чтобы его можно было закодировать в формате стенографии, устойчивом к масштабированию и сжатию.
Возможные простые улучшения формата Spore включают в себя:
источник