0

我有一些关于图像比较的帖子,我尝试保存从屏幕捕获的图像,然后将其存储在文件系统中。

我使用转换方法将捕获的图像转换byte[]为以供以后使用。

然后,当我想将它与第二个屏幕截图进行比较时,我加载(保存到的文件byte[])并将其与byte[]以相同方式转换为的新截图进行比较。

现在,当同时进行第一次捕获和第二次捕获时,在内存中,进行比较的方法很少,我想首先与其他人分享这篇文章以寻找相同的答案并让我知道:

哪个更快,我如何控制相似度的百分比?

如果选择(相等的)百分比反对最快的计算方式......我可以忽略它,尽管当性能问题不存在时我可以在其他项目中使用它,并根据其需要

这些是我知道可用于完成任务的代码

我想与您核实更快的想法,以及是否有更好的方法,无论是否有平等百分比。谢谢你。

static bool ByteArrayCompare(byte[] a1, byte[] a2)
{     
  IStructuralEquatable eqa1 = a1;     
  return eqa1.Equals(a2, StructuralComparisons.StructuralEqualityComparer); 
} 

对比

public enum CompareResult
{
  ciCompareOk,
  ciPixelMismatch,
  ciSizeMismatch
};

CompareResult cr = CompareResult.ciCompareOk;

byte[] hash1 = shaM.ComputeHash(btImage1);
byte[] hash2 = shaM.ComputeHash(btImage2);

//Compare the hash values
for (int i = 0; i < hash1.Length && i < hash2.Length 
                  && cr == CompareResult.ciCompareOk; i++)
{
    if (hash1[i] != hash2[i])
        cr = CompareResult.ciPixelMismatch;
}

后者正在使用System.Security.Cryptography

4

1 回答 1

2

比较图像和比较字节数组/文件内容是两个不同的任务,因为图像格式可能会很谨慎。因此,假设您对字节比较感兴趣(即,如果用于捕获图像的相同代码结果应该相同)。否则,您需要搜索“比较图像”问题(例如Jensen Somers 建议的How to compare Image objects with C# .NET? )。

要比较字节数组/文件,您最终需要逐字节比较字节内容。对于字节数组/文件肯定不匹配的情况,您可以优化检查以不执行任何操作,并且仅在严格必要时才进行字节比较:

  • 检查尺寸是否相同
  • 检查数组/文件的哈希(缓存计算的哈希值,因为每次计算哈希不会比逐字节比较快)。SHAxxxx 散列很好,但任何合理的散列函数,即使是几个随机获取的数组字节也可以。只需从数组中选择值,您就可以完全避免缓存散列。
  • 如果您希望文件的不同之处多于相同,则比较固定大小的数组块(即图像的中间某处)。

如果上面说数组/文件可能与逐字节比较数组/文件相同(相同的长度/哈希/部分内容)。

于 2012-08-31T21:05:52.777 回答