Преобразовать массив байтов в Image в С# после изменения массива

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

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

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

Байт-массив строится с использованием .toArray() в List

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());
    }

Ответ 1

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

        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]);
            }
        }

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

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

Ответ 2

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

public static Image CreateImage(byte[] imageData)
{
    Image image;
    using (MemoryStream inStream = new MemoryStream())
    {
        inStream.Write(imageData, 0, imageData.Length);

        image = Bitmap.FromStream(inStream);
    }

    return image;
}

Ответ 3

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

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

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

Ответ 4

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