Cómo comparar dos imágenes usando matrices de bytes

Quiero poder convertir Byte [] a Image y viceversa.

Tengo estos dos métodos desde aquí :

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

Parecen funcionar, pero si lo hago:

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

¡Obtengo result = false !

¿Alguna forma de corregir estos métodos o algunas funciones diferentes para lograr mi objective?

¡Gracias!

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

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

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

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

Esto muestra cómo comparar matrices de bytes de diferentes maneras.

Recientemente necesité escribir un recortador de imágenes que necesitaba guardar los archivosBytes 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 el recorte / ahorro se expande sobre esto. Pero pude devolver un objeto de imagen desde los bytes del archivo.

Cuando vuelve a codificar una imagen, el archivo resultante (o la 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!

Entonces, incluso si compara los bytes en las matrices (en lugar de referencias) puede obtener diferencias.

EDITAR
Cuando lee un byte [] (que contiene una imagen codificada GIF) en un BitMap , esos bytes se descomprimen en 4 bytes (ARGB) 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.