C# 快速确定两个位图是否相同?

C# 快速确定两个位图是否相同?,c#,bitmap,C#,Bitmap,如何(尽可能快地)通过值而不是引用确定两个位图是否相同?有什么快速的方法吗 如果比较不需要非常精确怎么办?您可以使用简单的散列(如MD5)来确定它们的内容是否散列为相同的值 尝试比较两个文件的哈希值 using System; using System.IO; using System.Security.Cryptography; class FileComparer { static void Compare() { // Create the hashing

如何(尽可能快地)通过值而不是引用确定两个位图是否相同?有什么快速的方法吗


如果比较不需要非常精确怎么办?

您可以使用简单的散列(如MD5)来确定它们的内容是否散列为相同的值

尝试比较两个文件的哈希值

using System;
using System.IO;
using System.Security.Cryptography;

class FileComparer
{
    static void Compare()
    {
        // Create the hashing object.
        using (HashAlgorithm hashAlg = HashAlgorithm.Create())
        {
            using (FileStream fsA = new FileStream("c:\\test.txt", FileMode.Open),
                fsB = new FileStream("c:\\test1.txt", FileMode.Open)){
                // Calculate the hash for the files.
                byte[] hashBytesA = hashAlg.ComputeHash(fsA);
                byte[] hashBytesB = hashAlg.ComputeHash(fsB);

                // Compare the hashes.
                if (BitConverter.ToString(hashBytesA) == BitConverter.ToString(hashBytesB))
                {
                    Console.WriteLine("Files match.");
                } else {
                    Console.WriteLine("No match.");
                }
            }
        }
    }
}

您可以先检查尺寸,如果尺寸不同,则中止比较

对于比较本身,您可以使用多种方式:

  • CRC32
    很快,但可能错了。。。可以用作第一次检查,如果不同,则它们是不同的。。。否则需要进一步检查
  • MD5/SHA1/SHA512
    不是那么快,而是相当精确
  • 异或
    XOR图像内容。。。出现第一个差异时中止

    • 您需要对“不太精确”进行非常精确的定义

      所有已经发布的校验和或散列方法仅适用于精确(像素和位)匹配

      如果你想要一个与“他们看起来(有些)相似”相对应的答案,你需要更复杂的答案

      • 一些基于长宽比的预处理。600x400的图片能像300x300的一样吗
      • 使用图形算法将它们缩小到100x100
      • 还要减少颜色
      • 然后逐像素比较结果(并设置错误treshold)
      被标记为答案并投票通过,因为它实际上很快。所有其他建议包括哈希,这是一个非常缓慢和迟钝的过程,当性能很重要时。我使用了CRC32。CRC是(简单的)散列。创建任何类型的哈希都需要对所有字节进行计算。如果只有两个图像,则直接比较要快得多,即使图像相等。只有当您想将一个图像与多个其他图像进行比较时,哈希才有用。将5000X5000图像与此进行比较并不是我所说的快速。正如原始问题中所述,性能确实很重要。这完全取决于所需的准确度。你必须在某个地方付钱给吹笛者,无论是在准确性上还是在速度上。在检查文件是否相等时,MD5通常被认为是速度和准确性之间的一个很好的平衡