Я не думаю, что это возможно с JPEG, потому что это сжатие с потерями, поэтому вы в конечном итоге повредите встроенный файл.Но PNG использует метод сжатия, аналогичный Deflate, который без потерь.
Я начал писать такую программу.Идея заключалась в том, чтобы скрыть байты данных, разбивая их на цветовые каналы наименее значимых бит пикселей.Позвольте мне сделать несколько примеров.
Изображение RGB-8 представляет пиксель с 3 байтами, один для красного, один для зеленого и один для синего.Я храню 3 бита в красном канале, два в зеленом (человеческий глаз более чувствителен к зеленому цвету) и 3 в синем.Поэтому я вставляю один байт на пиксель.Аналогично с изображением RGBA-8 я делаю 2-2-2-2.Это, конечно, включает в себя некоторые побитовые операции.
Все становится более интересным с изображениями RGB (A) -16, где на канал приходится два байта.Я использую весь младший байт каждого канала с минимальным искажением (наихудший случай 255/65535 = ~ 3,9%) и храню до 3 или 4 байта данных на пиксель.Неплохо!!Более того, в этом случае нет сложных побитовых операций, одно назначение выполняет свою работу.
В этом много улучшений.Я подумал попросить пользователя ввести пароль, хэшировать его и запустить безопасный генератор псевдослучайных чисел, затем больше не перемещать пиксель за пикселем, а вместо этого запрашивать у генератора новый случайный индекс.
Недостаток этого решения состоит в том, что чем больше данных уже внедрено, тем медленнее они становятся, потому что генератор будет давать все больше и больше занятых индексов.Но это намного более безопасно в этом смысле.Чтобы сделать его еще более безопасным, я подумал ввести шумовые данные в нетронутых пикселях, чтобы скрыть позиции истинных данных.
Как вы можете видеть, вы можете многое сделать с изображениями PNG!Если вам интересно, я могу дать код, который я написал до сих пор.