2012-01-06 11 views
17

Desidero essere in grado di convertire da Byte [] a Immagine e viceversa.Come confrontare due immagini utilizzando i matrici di byte

ho questo due metodi da here:

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 questo metodo o alcune funzioni diverse per raggiungere il mio obiettivo?

Grazie!

+0

stesso problema qui: http://stackoverflow.com/questions/8763630/c-sharp-gif-image-to-memorystream-and-back-lose-animation tranne la roba == uso fig. equals (imageToByteArray (byteArrayToImage (pic)); –

+0

@OliverBernhardt prova questo codice 'new byte [] {1} .Equals (new byte [] {1})' –

risposta

15

L'utilizzo di == consente di confrontare i riferimenti oggetto se non sovrascritti.

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

È necessario confrontare gli oggetti byte[] elemento per elemento al fine di confermare che sono identici. In questo caso è possibile utilizzare SequenceEquals.

+0

Inoltre, l'OP dovrebbe leggere qualcosa come http: // stackoverflow .com/questions/649444/testing-ugality-of-arrays-in-c-sharp per avere un'idea di come confrontarli correttamente –

+0

Che stupido! – Diego

+2

@ChrisShain - La domanda riguarda l'avere gli stessi elementi in array diversi: l'ordine non è importante lì. È molto importante qui. – Oded

2

== significa che si ha un riferimento allo stesso oggetto in memoria.

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

+0

allora perché questo restituisce falso? 'new byte [] {1} .Equals (new byte [] {1})' –

+0

@ L.B: molto vero. Perdonami; per gli array, questo non funziona. Vedi [here] (http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net) per come confrontare correttamente gli array di byte. Aggiornare la mia risposta di conseguenza. –

1

Quando si ricodifica 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) è possibile ottenere le differenze.

EDIT
Quando si legge un byte [] (contenente un'immagine codificata GIF) in un BitMap, quei byte sono 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 colori 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.

+0

Perché dovrebbe essere ?? C'è un modo per evitarlo? – Diego

+0

@Diego - vedi modifica –

2

Recentemente ho avuto bisogno di scrivere un cropper di immagine che aveva bisogno di salvare il 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 oggetto Image dai byte del file.

Problemi correlati