Преобразование байтового массива в Image в c # после изменения массива - PullRequest
2 голосов
/ 15 декабря 2010

Я пытаюсь преобразовать байт [] в изображение в C #. Я знаю, что этот вопрос задавался на разных форумах. Но ни один из ответов на них не помог мне. Чтобы дать некоторый контекст = Я открываю изображение, конвертирую его в байт []. Я шифрую байт []. В конце концов, у меня все еще есть байт [], но он был модифицирован ofc. Теперь я хочу показать это снова. Сам байт [] состоит из 6559 байтов. Я пытаюсь преобразовать его, выполнив:

 public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }

и я получаю эту ошибку: параметр недействителен.

Массив байтов создается с использованием .toArray () в Списке

List<byte> encryptedText = new List<byte>();    
pbEncrypted.Image = iConverter.byteArrayToImage(encryptedText.ToArray())

;

Кто-нибудь может мне помочь? Я забыл какой-то формат или что-то?

Байт, который необходимо преобразовать в изображение: alt text

 private void executeAlgoritm(byte[] plainText)
    {

        // Empty list of bytes
        List<byte> encryptedText = new List<byte>();

        // loop over all the bytes in the original byte array gotten from the image
        foreach (byte value in plainText)
        {
            // convert it to a bitarray
            BitArray myBits = new BitArray(8); //define the size

            for (byte x = 0; x < myBits.Count; x++)
            {
                myBits[x] = (((value >> x) & 0x01) == 0x01) ? true : false;
            }

            // encrypt the bitarray and return a byte
            byte bcipher = ConvertToByte( sdes.IPInvers(sdes.FK(sdes.Shift(sdes.FK(sdes.IP(myBits),keygen.P8(keygen.shift(keygen.P10(txtKey.Text))))),keygen.P8(keygen.shift(keygen.shift(keygen.shift(keygen.P10(txtKey.Text))))))));

            // add the byte to the list
            encryptedText.Add(bcipher);

        }
        // show the image by converting the list to an array and the array to an image
        pbEncrypted.Image = iConverter.byteArrayToImage(encryptedText.ToArray());
    }

Ответы [ 4 ]

9 голосов
/ 15 декабря 2010

Попробуйте что-нибудь подобное.При работе с изображениями и потоками памяти не забудьте обернуть все в операторы, чтобы убедиться, что ваши объекты расположены правильно.

4 голосов
/ 15 декабря 2010

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

Убедитесь, что вы не меняете байты заголовка.

Вы можете узнать о форматах заголовкав гугле / википедии.

3 голосов
/ 15 декабря 2010

Вы должны пропустить заголовок и только зашифровать изображение. Вы можете сделать это, скопировав первые 54 байта вашего байтового массива в новый байтовый массив, в котором будет зашифрованное изображение. Затем вы перебираете все остальные байты в изображении и шифруете их. Примерно так:

        for (int i = 0; i < img.Length; i++)
        {
            if (i < 54)
            {
                //copy the first 54 bytes from the header
                _cyph[i] = img[i];
            }else{
                //encrypt all the other bytes
                _cyph[i] = encrypt(img[i]);
            }
        }

В конце вы используете код, который вы использовали для преобразования байтового массива в изображение.

Я надеюсь, что это работает для вас!

1 голос
/ 15 декабря 2010

Чтобы добавить к ответу @ Boo, вы можете получить необработанные данные изображения - без заголовка - используя метод Bitmap.LockBits. Вот пример манипуляции изображением на странице MSDN в классе BitmapData .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...