Как хранить метаданные в файле .png?

Spore позволяет созданным существам создавать общие файлы, экспортируя файл .png. Этот .png - это фотография существа, но если он импортирован в игру, информация о существо (например, текстуры, размер и форма) также поставляется вместе с ней.

Как я могу реализовать такую ​​функцию?

198 голосов | спросил ibrabeicker 1 AMpTue, 01 Apr 2014 04:37:11 +040037Tuesday 2014, 04:37:11

4 ответа


53

Если вам действительно нужен был файл PNG, скорее всего, они просто добавили информацию в файл. Это на самом деле практика Стеганография . В большинстве случаев это используется, чтобы скрыть полезную нагрузку или секретные сообщения в вещах, которые кажутся публичными. Однако, вероятно, в этом случае этот метод используется. Типичная Stegongraphy будет скрываться, чтобы скрыть содержимое, но нет причин, по которым невозможно было просто добавить данные из изображения в конце файла и получить его.

Несколько инструментов кодируют эти данные для вас, поиск в Google вызывает не менее этого и this .

В начале PNG имеет байтовую подпись $89, поэтому возможно, что информация была вставлена ​​после самой структуры PNG и просто проанализирована игрой SPORE.

Однако дальнейшие исследования, полученные другими ответами и поиск в google, показывают, что Spore фактически использовал только версию Stegongraphy, чтобы скрыть информацию в альфа-битах. Имея это в виду, мы можем исключить возможность добавления данных или метаданных.

Следует отметить, что метаданные все еще очень жизнеспособный выбор, если данные анализируются локально. Если эта информация может быть передана в Интернете или перекодирована, экспорт не гарантирует сохранение всей вашей информации. Когда используются пиксельные данные, он может выжить без потерь без каких-либо проблем.

ответил Vaughan Hilts 1 AMpTue, 01 Apr 2014 04:44:39 +040044Tuesday 2014, 04:44:39
151

формат PNG поддерживает более или менее произвольные метаданные. Стандарт PNG определяет PNG-файл, по существу ряд фрагментов, некоторые из которых необходимы (и содержат данные изображения ). Другие, однако, не являются обязательными. Например, есть кусок для хранения гамма-информации или данных гистограммы.

В частности, существует tEXt chunk , который можно использовать для хранить произвольные пары ключей /значений. Это можно использовать для отправки любых произвольных данных, если вы хотите представить эти данные в виде текста (что довольно вероятно).

Вам понадобится библиотека PNG, которая позволит вам получить доступ и управлять этими дополнительными фрагментами (например, справочной библиотекой ), или вам нужно будет написать их самостоятельно. Тогда просто вопрос о том, как кодировать нужные вам данные в виде пар ключ /значение. Я бы предложил следующее:

  • выберите имена ключей, которые имеют префикс имени или кодового имени вашего проекта, как способ создания грубой системы «пространства имен» и избегать возможных конфликтов с использованием данных других приложений.
  • не пытайтесь хранить текстуры фактические таким образом, храните ссылки на те текстуры, которые указываются в собственной базе данных вашего актива.
  • данные, такие как размер существа или объекта, вес и т. д. - простые скаляры, в основном - могут храниться тривиально

В интересах получения более полного ответа я также укажу, что существует другой подход (ранее документированный ответами @Vaughn и @ Alexis): кодируйте дополнительные данные, которые вы хотите прямо в пикселях изображения, распространяя ваши данные по младшим битам цветных каналов. Этот подход не требует использования дополнительных метаданных, что означает, что вы можете полностью реализовать его, не полагаясь на него, или беспокоиться о том, что внешние программы неправильно обрабатывают эти метаданные. У этого также очень высокий «классный» фактор, и поскольку вы используете только младшие биты, изображение все равно будет выглядеть правильно для человеческого глаза. Однако это означает, что ваш размер изображения является первичным фактором управления объемом данных, которые вы можете хранить; если вам нужно больше памяти, вам нужно будет выделить больше пикселей для изображения.

Как отмечали другие, этот процесс известен как steganography .

ответил Josh Petrie 1 AMpTue, 01 Apr 2014 04:51:51 +040051Tuesday 2014, 04:51:51
50

Разработчик Monaco фактически сделал отличную статью о том, как они и Spore достигли этого.

Основное резюме того, что они делают, довольно просто:

  • Преобразование данных в двоичный
  • Преобразование целевого изображения в растровое изображение
  • Пройдите по пикселям изображения в некотором предсказуемом шаблоне (они просто слева направо в верхнем левом углу).
  • Напишите один бит в бит нижнего порядка каждого цветного канала для каждого пикселя
  • Экспортировать измененное растровое изображение в png снова

Просто сделайте это в обратном порядке, чтобы получить данные.

Основная идея процесса заключается в том, что в изображении есть много пикселей, а бит младшего порядка каждого цветного канала не делает большой разница. Кроме того, примерно половина битов, которые вы пишете, будет только тем, что бит в изображении уже был. То, что вы получаете, по сути, является правильным образом, но с необычными артефактами. Он требует времени, чтобы заметить, что эти артефакты действительно заметны, если вы действительно справляетесь с контрастностью /насыщенностью и увеличением. Однако у него есть исходные изображения с большим количеством начального шума.

Из статьи:

  

Обратите внимание на последнее изображение, как в шуме есть едва различимая горизонтальная линия. Это конец данных уровня. Это означает, что я могу фактически поместить все данные уровня в изображение с разрешением 265x120 пикселей, используя только младший бит.

     

ДОБАВЛЕНИЕ TRICKY:

     

Что-то, что я мог сделать, и я считаю, что люди Spore также сделали, на самом деле используют ВСЕ цветовые биты в пикселях, которые на 100% прозрачны. Поскольку эти пиксели прозрачны, не имеет значения, к какому цвету вы их устанавливаете.

     

Я не могу этого сделать, поскольку я использую все изображение, а это значит, что у меня нет прозрачных пикселей для работы.

Зачем использовать эту технику только для ее хранения в метаданных?

  • Это здорово! :)
  • Службы могут манипулировать метаданными (возможно, как функция конфиденциальности /безопасности), но не должны искажать пиксели png, если у них нет агрессивных требований к хостингу (смотря на вас, facebook). Но если они полностью реэкспортируют ваш образ, вы ничего не можете сделать .

Дополнительный кредит: чтобы уменьшить заметность шума, вы можете использовать PRNG с фиксированным семенем, чтобы выбрать пиксели для изменения. Вы также можете модифицировать некоторые цветовые каналы аналогичным образом.

ответил Alexis Beingessner 1 PMpTue, 01 Apr 2014 16:37:44 +040037Tuesday 2014, 16:37:44
7

Я скачал и исследовал несколько существ Spore из Sporepedia. От этого я узнал, что:

  • Изображения не содержат информации в дополнение к данным стандартного изображения.
  • Стенографические данные сохраняются без учета изображения, можно представить, что прозрачные части использовались исключительно, но они не являются.
  • Использование хранилища зависит от объема информации, которая должна быть сохранена, некоторые из изображений использовали только младший бит для хранения данных, некоторые использовали два младших значащих бита, некоторые могли бы использовать больше.
  • Формат Spore позволяет избежать использования только части изображения, наименее значимый бит изменяется по всему изображению, если используется второй младший бит, он используется для всего изображения. Предположительно, это делается с использованием случайного заполнения. Это позволяет избежать изменения качества, которое может быть более тревожным для зрителя, чем сам шум.
  • Все четыре канала используются одинаково, канал непрозрачности не имеет специальной обработки, поэтому некоторые из прозрачных пикселей слегка непрозрачны, а некоторые непрозрачные пиксели немного прозрачны.

Стоит отметить, что это именно то, что делает Spore, это метод, который упрощает перед большинством других проблем.

Выбор использования стенографии, а не дополнительного блока данных означает, что данные выживут, если изображение будет заново закодировано, например, веб-сайтом, хотя оно не сохранится при масштабировании или сжатии Jpeg.

Я думаю, что наиболее видной альтернативой является на самом деле только кодирование идентификатора в изображении, и пусть фактические данные будут храниться на центральном сервере, где этот идентификатор можно обменять на точные данные существа. Такой идентификатор был бы достаточно коротким, чтобы его можно было кодировать в формате масштабирования и толерантности к сжатию.

Возможные простые улучшения формата Spore включают:

  • Используйте только или предпочитаете использовать значения цвета прозрачных пикселей, они не делают визуального различия.
  • Используйте синий канал больше, а зеленый - меньше, синий цвет оказывает меньшее влияние на изображение.
  • Сохраняя яркость каждого пикселя близко к неизменному и кодируя данные в цветности, небольшой шум в этом параметре практически не поддается обнаружению людям.
ответил aaaaaaaaaaaa 5 AMpSat, 05 Apr 2014 02:53:04 +040053Saturday 2014, 02:53:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132