Вам не нужно использовать другой подход, когда секрет - это строка, изображение или что-то еще. Просто прочитайте файл в виде байтового массива (или преобразуйте строку в единицу), а затем работайте с этим.
Если подумать, стеганография скрывает биты в другие биты. Откуда берутся эти биты, не имеет значения. Таким образом, вы все равно можете скрыть текстовый файл, zip-файл, файл изображения и т. Д. c.
Еще одна причина, по которой вам следует читать поток данных файла, состоит в том, что jpeg, png и другие сжатые файлы форматы занимают меньше места. Если вы загрузите пиксельный массив файла JPEG, а затем скроете эти пиксели, это будет все равно, что скрыть размер несжатого BMP-файла. И вы бы добавили ненужную сложность в вашу программу только для того, чтобы сделать все это.
Я бы сделал это так:
- Спросите имена файлов носителя и секрет скрыть (я бы потребовал, чтобы пользователь записал текст, если он этого хочет, в файл для согласованности).
- Считывание секретного файла в виде байтового массива.
- Необязательно : добавьте любые другие метаданные, например, размер секрета, чтобы экстрактор знал, сколько байтов нужно прочитать, имя секретного файла, чтобы после его извлечения его можно было сохранить в нем, и т. д. c.
- Вставить ...
- Извлечь ...
Совет. Не конвертируйте биты в строки. Я подозреваю, что вы делаете это только для визуализации 1 и 0, но это крайне неэффективно. Вам лучше работать с побитовыми операциями напрямую. Например, чтобы вставить бит в пиксель, обнулите lsb с помощью AND, а затем добавьте бит с помощью OR.
// embed
pixel = pixel & 0b11111110 | secretBit
// extract
secretBit = pixel & 0b00000001