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");
}
}
如果单击该按钮,它将比较这 2 个图像。
这是用于对图像进行哈希处理的代码。
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 种方法:
- byte[].SequenceEqual(byte[])
- 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 的评论。
关于c# - 如何使用哈希字节比较 2 张图像是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21396745/