Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 截屏;转换为字节[](图像比较方法)_C#_Hash_Image Conversion_Image Comparison - Fatal编程技术网

C# 截屏;转换为字节[](图像比较方法)

C# 截屏;转换为字节[](图像比较方法),c#,hash,image-conversion,image-comparison,C#,Hash,Image Conversion,Image Comparison,我发了一些关于图像比较的帖子,我试图保存从屏幕上捕获的图像,然后将其存储在文件系统中 我使用转换方法将捕获的图像转换为字节[],以供以后使用 然后,当我想将其与第二个屏幕截图进行比较时,我加载(文件保存到字节[]),并以相同的方式将其与转换为字节[]的新截图进行比较 现在,在内存中,当有第一次捕获和第二次捕获时,几乎没有方法进行比较,我想首先与其他搜索相同答案的人分享这篇文章,让我知道: 哪个更快,我如何控制相似性的百分比 如果选择百分比(相等)是反对最快的计算方法。。。 我可以忽略它,尽管当性

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

我使用转换方法将捕获的图像转换为
字节[]
,以供以后使用

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

现在,在内存中,当有第一次捕获和第二次捕获时,几乎没有方法进行比较,我想首先与其他搜索相同答案的人分享这篇文章,让我知道:

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

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

这些是我知道的可用于执行此任务的代码

我想和你们核实一下,有没有更快的方法,有没有更好的方法,有没有平等百分比。多谢各位

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

公共枚举比较结果
{
ciCompareOk,
Cipixelmissmatch,
一致性匹配
};
CompareResult cr=CompareResult.ciCompareOk;
字节[]hash1=shaM.ComputeHash(btImage1);
字节[]hash2=shaM.ComputeHash(btImage2);
//比较散列值
对于(int i=0;i

后者使用的是
System.Security.Cryptography

比较图像和比较字节数组/文件内容是两项不同的任务,因为图像格式可能会引起注意。因此,假设您对字节比较感兴趣(即,如果用于捕获图像的代码相同,则结果应该相同)。否则,您需要搜索“比较图像”问题(如Jensen Somers建议的问题)

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

  • 检查尺寸是否相同
  • 检查数组/文件的哈希(缓存计算的哈希值,因为每次计算哈希不会比逐字节比较快)。SHAxxxx散列是好的,但是任何合理的散列函数,即使是几个随机抽取的字节数组,都可以。只要从数组中选取值,就可以完全避免缓存哈希
  • 比较固定大小的数组块(即在图像中间的某个地方),如果你期望文件不同于通常的不同。<李>

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

请评论您想要实现的目标:两个代码块做的事情完全不同(按位匹配与哈希匹配),因此无法比较哪一个对您的特定任务“更快”。哈希代码比较会更快(由于SHAXX哈希的大小不变),但不能保证相等。@AlexeiLevenkov无论如何,哈希与否,任务都是比较captured1和captured2(正在使用转换为字节[])对于初学者来说,通过比较问题可以更快地实现速度?我确实从第一次将图像保存到磁盘并将img转换为img开始,但剪贴板中的一个与存储过程中的一个不匹配ComputeHash是第一步(1个以上),不是吗(转换过程)更多时间,在这两个主题上多做1项工作,虽然哈希2哈希更快,但它需要从字节[]开始第一个到达,不评论函数,但有一次在比较图像时提出了一个问题,它收到了一个关于可以用来比较图像的API的不错的答案。然后它将告诉您图像之间的差异:
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;
}