Чтение BMP в память с использованием правильных структур - PullRequest
0 голосов
/ 26 марта 2011

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

Также - я впервые использую динамическое выделение памяти и ввод / вывод двоичных файлов.

Вот мой код для скрытия текстового файла в изображении BMP: Ссылка на код

Также обратите внимание, что я не использую LSB для хранения сообщения в этом коде, а скорее заменяю альфа-байт, предполагая, что это изображение размером 32 бита на пиксель (bbp). Это еще одна причина, по которой это не будет очень гибким, если на изображении 1, 4, 8, 16, 24 bpp. Например, если бы это было 24 bbp, альфа-канал будет 6 бит, а не 1 байт.

Мой вопрос: каков наилучший способ считывания всего BMP в память с использованием структур?

Вот как я это вижу:

  • Читать BITMAPFILEHEADER
  • Читать BITMAPINFOHEADER
  • Считать таблицу цветов (если она есть)
  • Чтение PixelArray

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

Кроме того, после PixelArray, Википедия говорит, что может быть цветовой профиль ICC, откуда мне знать, что он существует? Ссылка на формат файла BMP (Википедия)

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

Извините за все вопросы в одном, но сейчас я действительно не уверен, что делать.

1 Ответ

3 голосов
/ 26 марта 2011

Размер таблицы цветов определяется по bV5ClrUsed.

Цветовой профиль ICC присутствует в файле, только если bV5CSType == PROFILE_EMBEDDED.

Документация здесь предоставляет всю эту информацию.

Тогда 24-битный цвет означает 8 красных, 8 зеленых, 8 синих, 0 альфа. Вам нужно преобразовать это в 32-битный RGBA, чтобы вообще иметь какой-либо альфа-канал.

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

...