如何使用哈希字节比较2个图像是否相同?

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

如果单击该按钮,它将比较这两个图像。

以下是用于散列图像的代码。

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

那么如何使用HashImage()方法来比较这些图像,如果它们在视觉上是否相同?

我尝试比较两个明显相同的图像,但它们无法正确比较。 相反,我觉得这是一个不同的形象。

我甚至试过这个,但它也没有用。

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

更新:我试过这个,但它也没有用。

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

我知道比较字节数组的3种方法:

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

对于您的代码,您可以轻松尝试:

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

在初始化Bitmap im2之后立即将其添加到您的代码中,并查看输出窗口中的结果。 您可以使用其中任何一个进行比较,并评估数组是否相同。

注意System.Text.Encoding.UTF8.GetString不适合在这种情况下使用(图片中的哈希数据)。 请参阅下面@CodesInChaos的评论。