Come confrontare due immagini usando matrici di byte

Voglio essere in grado di convertire da Byte [] a Immagine e viceversa.

Ho questo due metodi da qui :

public byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); return ms.ToArray(); } public Image byteArrayToImage(byte[] byteArrayIn) { MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } 

Sembrano funzionare, ma se lo faccio:

 byte[] pic = GetImageFromDb(); bool result = pic == imageToByteArray(byteArrayToImage(pic)); 

Ottengo result = false !

Un modo per correggere questi metodi o alcune funzioni diverse per raggiungere il mio objective?

Grazie!

L’utilizzo di == confronta i riferimenti agli oggetti se non sovrascritto.

Poiché si tratta di due oggetti byte[] diversi , i riferimenti sono diversi.

È necessario confrontare gli oggetti byte[] object per articolo per confermare che sono identici. In questo caso è ansible utilizzare SequenceEquals .

== significa che hai un riferimento allo stesso object in memoria.

Questo mostra come confrontare gli array di byte in diversi modi.

Recentemente ho avuto bisogno di scrivere un cropper immagine che doveva salvare i fileBytes come immagine. ecco quello che ho fatto. Spero che questo ti possa aiutare.

 public Image byteArrayToImage(byte[] fileBytes) { using (MemoryStream fileStream = new MemoryStream(fileBytes)) { return Image.FromStream( fileStream ); } } 

ovviamente il mio codice per il ritaglio / il salvataggio si espande su questo. Ma sono stato in grado di restituire un object Image dai byte del file.

Quando ricodifichi un’immagine, il file risultante (o array di byte) può essere (leggermente?) Diverso dalla versione originale. Soprattutto se ciò che recuperi dal database era un file jpeg!

Quindi, anche se si confrontano i byte negli array (anziché i riferimenti) è ansible ottenere differenze.

MODIFICARE
Quando leggi un byte [] (che contiene un’immagine codificata GIF) in una BitMap , quei byte vengono decompressi in 4 (ARGB) byte per pixel. Quando salvi quella BitMap in un (nuovo) file gif (o byte []), il file appena codificato potrebbe essere diverso (ad esempio, l’ordine in cui i colors sono memorizzati). Quindi non vi è alcuna garanzia che il nuovo file (o byte []) sia identico a quello vecchio, sebbene l’immagine stessa non sia cambiata.