快速确定两个位图是一样的吗?

时间:2011-08-27 16:16:45

标签: c# bitmap

我如何(尽可能快)确定两个位图是否相同,按值,而不是通过引用?有没有快速的方法呢?

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

4 个答案:

答案 0 :(得分:6)

您可以先检查尺寸 - 如果它们不同则中止比较。

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

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

答案 1 :(得分:2)

您可以使用像MD5这样的简单哈希来确定它们的内容是否散列到相同的值。

答案 2 :(得分:2)

您需要一个非常精确的“不太精确”的定义。

所有已发布的Checksum或Hash方法仅适用于精确(像素和位)匹配。

如果你想要一个对应于“他们看起来(有点)相似”的答案,你将需要更复杂的东西。

  • 根据宽高比进行一些预处理。 600x400的图片可以像300x300一样吗?
  • 使用图形算法将它们缩小到100x100。
  • 还减少颜色。
  • 然后逐个像素地比较结果(并设置错误阈值)。

答案 3 :(得分:1)

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

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