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;
}