Дополнительные данные в изображении (PPM/PAM/PNM)
Можно ли хранить дополнительные данные в пикселях двоичного файла PNM таким образом, чтобы их можно было считывать как изображение (надеюсь, любым декодером, но конкретно - ffmpeg)?
У меня есть симуляция, которая в настоящее время сохраняет свои данные в формате PPM, и я хотел бы записать в файл более трех значений на пиксель, и при этом все же иметь возможность использовать его в качестве изображения (очевидно, только первые три / четыре значения будет фактически влиять на изображение).
В частице я думаю, что TUPLTYPE PAM должен позволить мне сделать это, но я не знаю, как сделать из этого нечто, что также является читабельным изображением.
2 ответа
Есть два трюка, которые вместе могут получить до 5 дополнительных байтов на пиксель в файле PAM.
Первый трюк:
Вы можете попытаться сохранить дополнительный байт информации в альфа-канале, а затем проигнорировать эту информацию в декодере. Включение альфа-канала в PAM осуществляется путем добавления _APLHA
в TUPLTYPE
аргумент, поэтому вместо TUPLTYPE RGB
у тебя есть TUPLTYPE RGB_ALPHA
,
Второй трюк:
Вы можете установить MAXVAL
в PAM (или эквивалентное поле в PPM и других) для 65535
вместо 255
Это означает, что каждый пиксель будет описываться тремя 16-битными значениями вместо трех 8-битных. Теперь для этих 16-битных значений можно использовать 8 младших значащих битов для хранения информации, поскольку они не влияют на визуальные свойства изображения при отображении на типичном экране компьютера.
Первый + второй трюк:
Это дает вам дополнительные 3 x 8 = 24 бита для плоскостей RGB и 16 бит в альфа-канале. Что означает: 5 байтов.
Я не использовал формат файла PNM, но я проделал этот трюк с файлом.bmp.
Перехватите наименее значимый бит данных изображения и наполните его любыми двоичными данными, которые вы хотите. Никто не увидит разницу между значением пикселя 0 или 1 (00000000 или 00000001) или разницу между 254 или 255 (1111110 или 11111111). На каждые 8 байтов данных изображения может быть вставлен байт дополнительных данных (6 байтов, если вы используете ограниченный набор символов). Программное обеспечение для просмотра файлов не будет знать никакой разницы. Любое программное обеспечение, которое может открыть файл до кодирования, сможет прочитать его после.
Если вы хотите, чтобы данные были более скрытыми / скрытыми, биты могут быть вставлены в данные изображения с помощью процедуры случайного воспроизведения, где первый бит может быть местоположением 50, второй в 123, третий в 32... и после местоположений 0-255 (первые 256 байтов, если данные изображения) (первые 32 байта дополнительных данных), снова начните перемешивание.