2012-01-06 26 views
17

Quiero poder convertir de Byte [] a Imagen y viceversa.Cómo comparar dos imágenes usando matrices de bytes

He estos dos métodos de 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; 
} 

que parecen funcionar, pero si lo hago:

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

me sale result = false!

¿Alguna manera de corregir este método o algunas funciones diferentes para lograr mi objetivo?

Gracias!

+0

mismo problema aquí: http://stackoverflow.com/questions/8763630/c-sharp-gif-image-to-memorystream-and-back-lose-animation excepto la materia == uso pic. equals (imageToByteArray (byteArrayToImage (pic)); –

+0

@OliverBernhardt pruebe este código 'new byte [] {1} .Equals (new byte [] {1})' –

Respuesta

15

El uso de == comparará las referencias del objeto si no se reemplaza.

Dado que estos son dos objetos diferentes byte[], las referencias son diferentes.

Necesita comparar los objetos byte[] artículo por artículo para confirmar que son idénticos. Puede usar SequenceEquals en este caso.

+0

Además, el OP debería leer algo como http: // stackoverflow .com/questions/649444/testing-equality-of-arrays-in-c-sharp para tener una idea de cómo compararlos correctamente. –

+0

¡Qué estúpido! ¡Lo extrañé por completo! – Diego

+2

@ChrisShain - La pregunta es acerca de tener los mismos elementos en diferentes matrices - el orden no es importante allí. Es muy muy importante aquí. – Oded

2

== significa que tiene una referencia al mismo objeto en la memoria.

This muestra cómo comparar matrices de bytes de diferentes formas.

+0

¿por qué esto devuelve falso? 'new byte [] {1} .Equals (new byte [] {1})' –

+0

@ L.B: muy cierto. Perdóname; para arreglos, esto no funciona. Consulte [aquí] (http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net) para saber cómo comparar las matrices de bytes correctamente. Actualizando mi respuesta en consecuencia. –

1

Cuando vuelve a codificar una imagen, el archivo resultante (o matriz de bytes) puede ser (¿un poco?) Diferente de la versión original. ¡Especialmente si lo que recuperas de la base de datos es un archivo jpeg!

Así que incluso si compara los bytes en las matrices (en lugar de referencias) puede obtener diferencias.

EDITAR
Cuando se lee un byte [] (que contiene una imagen codificada GIF) en un BitMap, estos bytes se descomprimen en 4 (ARGB) bytes por píxel. Cuando guarde ese BitMap en un (nuevo) archivo gif (o byte []), el archivo recién codificado podría ser diferente (por ejemplo, el orden en que se almacenan los colores). Por lo tanto, no hay garantía de que el nuevo archivo (o byte []) sea idéntico al anterior, aunque la imagen en sí no se modifique.

+0

¿Por qué sería eso? Hay alguna manera de evitarlo? – Diego

+0

@Diego - ver la edición –

2

Recientemente tuve que escribir un recortador de imágenes que necesitaba guardar el archivoBytes como una imagen. Aquí esta lo que hice. Espero que esto te ayude.

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

Obviamente, mi código para cortar/guardar se expande sobre esto. Pero pude devolver un objeto de imagen desde los bytes del archivo.

Cuestiones relacionadas