Convertir un tableau d’octets en image en c # après avoir modifié le tableau

J’essaie de convertir un octet [] en une image en C #. Je sais que cette question a été posée sur différents forums. Mais aucune des réponses données sur eux ne m’a aidé. Pour donner du contexte = j’ouvre une image, convertissez-la en octet []. Je crypte l’octet []. Finalement, j’ai toujours l’octet [] mais il a été modifié ofc. Maintenant, je veux afficher ceci à nouveau. L’octet [] lui-même est constitué de 6559 octets. J’essaie de le convertir en faisant:

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

et j’obtiens cette erreur: Parameter is not valid.

Le tableau d’octets est construit à l’aide de .toArray () sur une liste

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

;

Quelqu’un peut-il m’aider? Est-ce que j’oublie un format ou quelque chose?

L’octet qui doit être converti en une image: texte alternatif

  private void executeAlgoritm(byte[] plainText) { // Empty list of bytes List encryptedText = new List(); // 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 > 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()); } 

Vous devez ignorer l’en-tête et ne chiffrer que l’image. Vous pouvez le faire en copiant les 54 premiers octets de votre partition dans la nouvelle partition dans laquelle l’image cryptée sera. Ensuite, vous passez en boucle sur tous les autres octets de l’image et vous les chiffrez. Quelque chose comme ça:

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

En fin de compte, vous utilisez le code que vous avez utilisé pour convertir un bytearray en une image.

J'espère que cela fonctionne pour vous!

Essayez quelque chose comme ça. Lorsque vous travaillez avec des images et des stream de mémoire, veillez à envelopper tout dans des instructions pour vous assurer que vos objects sont correctement disposés.

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

En fonction de la question et des commentaires, je suppose que vous modifiez les octets associés à l’en-tête de l’image. Vous ne pouvez pas modifier ces octets (avec une méthode de cryptage) et toujours être en mesure de charger l’image.

Assurez-vous de ne pas modifier les octets d’en-tête.

Vous pouvez en savoir plus sur les formats d’en-tête sur google / wikipedia.

Pour append à la réponse de @ Boo, vous pouvez obtenir les données d’image brutes – en-tête moins – à l’aide de la méthode Bitmap.LockBits . Il existe un exemple de manipulation d’une image de cette manière sur la page MSDN de la classe BitmapData .