what length c# image hash byte hashcode

c# - length - ¿Cómo comparo si 2 imágenes son iguales utilizando bytes Hash?



sha1 max length (1)

Sé 3 formas de comparar la matriz de bytes:

  • byte []. SequenceEqual (byte [])
  • System.Text.Encoding.UTF8.GetString (byte []) ==
  • Convert.ToBase64String (byte []) ==

Para su código, puede intentar esto fácilmente:

Console.WriteLine("SEQUENCE EQUAL: " + (HashImage(im1).SequenceEqual(HashImage(im2)) ? "TRUE" : "FALSE") + " (easiest way)"); Console.WriteLine("UTF8 STRING: " + (System.Text.Encoding.UTF8.GetString(HashImage(im1)) == System.Text.Encoding.UTF8.GetString(HashImage(im2)) ? "TRUE" : "FALSE") + " (conversion to utf string - not good for display or hash, good only for data from UTF8 range)"); Console.WriteLine("HASH STRING: " + (Convert.ToBase64String(HashImage(im1)) == Convert.ToBase64String(HashImage(im2)) ? "TRUE" : "FALSE") + " (best to display)"); Console.WriteLine("1: " + Convert.ToBase64String(HashImage(im1))); Console.WriteLine("2: " + Convert.ToBase64String(HashImage(im2)));

Agregue esto a su código justo después de la inicialización de Bitmap im2, y mire los resultados en la ventana de salida. Puede usar algo de esto para comparar y evaluar si la matriz es la misma.

Nota : System.Text.Encoding.UTF8.GetString no es adecuado para su uso en este caso (datos hash de la imagen). Ver el comentario de @CodesInChaos a continuación.

private void button1_Click(object sender, EventArgs e) { Bitmap im1 = new Bitmap(@"C:/Users/user/Downloads/CaptchaCollection/1.png"); Bitmap im2 = new Bitmap(@"C:/Users/user/Downloads/CaptchaCollection/2.png"); if (HashImage(im1) == HashImage(im2)) { MessageBox.Show("Same Image"); } else { MessageBox.Show("Different Image"); } }

Si se hace clic en el botón, se compararán estas 2 imágenes.

Aquí está el código que se utiliza para hash una imagen.

public byte[] HashImage(Bitmap image) { var sha256 = SHA256.Create(); var rect = new Rectangle(0, 0, image.Width, image.Height); var data = image.LockBits(rect, ImageLockMode.ReadOnly, image.PixelFormat); var dataPtr = data.Scan0; var totalBytes = (int)Math.Abs(data.Stride) * data.Height; var rawData = new byte[totalBytes]; System.Runtime.InteropServices.Marshal.Copy(dataPtr, rawData, 0, totalBytes); image.UnlockBits(data); return sha256.ComputeHash(rawData); }

Entonces, ¿cómo uso el método HashImage() para comparar ambas imágenes si son las mismas visualmente o no?

Traté de comparar 2 imágenes que son claramente las mismas pero no están funcionando para compararlas correctamente. En cambio, me aparece como si fuera una imagen diferente.

Incluso probé esto, pero tampoco funciona.

if (HashImage(im1).Equals(HashImage(im2)))

ACTUALIZACIÓN: lo he intentado pero tampoco funciona.

if (ReferenceEquals(HashImage(im1),HashImage(im2)))