C# Преобразование цвета пикселя в двоичный - PullRequest
1 голос
/ 22 марта 2020

Для использования в программе стеганографии. Я пытаюсь получить двоичный эквивлант значения R пикселя из bmp, ie: если значение R равно 255, мне нужно 11111111. Я собираюсь выполнить l oop через двоичное значение буквы и заменить младший значащий бит в каждом цвете пикселя (R / G / B) битом из буквы, чтобы я мог получить его позже. У меня это работает со строкой: (Обратный это простой метод для обращения строки)

private string convToBits(string in_)
        {
            char letter = Convert.ToChar(in_);
            //convert letter to 32-bit int
            int value = Convert.ToInt32(letter);
            //converting 32-bit int to (string) bits
            BitArray ba = new BitArray(new int[] { value });
            string bits32 = "";
            for (int c = 0; c < ba.Length; c++)
            {
                if (c % 8 < 7) //get first 8 bits of the 32bit int
                {
                    //true = 1, false = 0
                    if (ba[c])
                    {
                        bits32 += 1;
                    }
                    else
                    {
                        bits32 += 0;
                    }
                }
            }
            //get only the first byte of the 32bit (4 bytes) int and reverse using the function below 
            string bitString = Reverse(bits32.Substring(0, 8));       //we now have the letter in binary. 
            return bitString;
        }

in_: 'a'

возвращает: '01100001'

Конечно, это не работает с пиксельным цветом, так как он имеет длину до 3 символов (0-255).

Каков наилучший способ сделать это со значением, которое может находиться в диапазоне 0-255?

1 Ответ

0 голосов
/ 23 марта 2020

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

Если подумать, стеганография скрывает биты в другие биты. Откуда берутся эти биты, не имеет значения. Таким образом, вы все равно можете скрыть текстовый файл, zip-файл, файл изображения и т. Д. c.

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

Я бы сделал это так:

  • Спросите имена файлов носителя и секрет скрыть (я бы потребовал, чтобы пользователь записал текст, если он этого хочет, в файл для согласованности).
  • Считывание секретного файла в виде байтового массива.
  • Необязательно : добавьте любые другие метаданные, например, размер секрета, чтобы экстрактор знал, сколько байтов нужно прочитать, имя секретного файла, чтобы после его извлечения его можно было сохранить в нем, и т. д. c.
  • Вставить ...
  • Извлечь ...

Совет. Не конвертируйте биты в строки. Я подозреваю, что вы делаете это только для визуализации 1 и 0, но это крайне неэффективно. Вам лучше работать с побитовыми операциями напрямую. Например, чтобы вставить бит в пиксель, обнулите lsb с помощью AND, а затем добавьте бит с помощью OR.

// embed
pixel = pixel & 0b11111110 | secretBit

// extract
secretBit = pixel & 0b00000001
...