C# base64编码图像的快速比较
我有一个逻辑,需要比较base64编码的图像JPEG和PNG,并检查它们是否相同 最基本的方法是比较整个字符串 由于图像往往很大,我想知道是否有更快和/或更节省内存的方法来比较它们。例如,仅比较前x个字符,而base64是逐字节进行的,只比较图片的前x个字节 我不熟悉jpeg和png格式的内部工作原理,也不熟悉第一个字节碰撞产生假阳性匹配的可能性,但是如果它相当低,比如1:10000,那是可以接受的 能否实现更好的比较? 能否在低假阳性匹配概率的情况下实现更好的比较? 并不是说基本的比较速度慢得令人痛苦,而且因为我需要将整个字符串读入内存进行其他操作,我可能最终会对它们使用一个简单的相等比较,我只是对其他可能性感兴趣 编辑:C# base64编码图像的快速比较,c#,comparison,png,base64,jpeg,C#,Comparison,Png,Base64,Jpeg,我有一个逻辑,需要比较base64编码的图像JPEG和PNG,并检查它们是否相同 最基本的方法是比较整个字符串 由于图像往往很大,我想知道是否有更快和/或更节省内存的方法来比较它们。例如,仅比较前x个字符,而base64是逐字节进行的,只比较图片的前x个字节 我不熟悉jpeg和png格式的内部工作原理,也不熟悉第一个字节碰撞产生假阳性匹配的可能性,但是如果它相当低,比如1:10000,那是可以接受的 能否实现更好的比较? 能否在低假阳性匹配概率的情况下实现更好的比较? 并不是说基本的比较速度慢得
很抱歉没有正确地澄清这一点,但这个问题并不是为了比较图像数据。不管怎样,有损图像格式都会让人感到痛苦,如果图像以不同的格式或使用不同的选项保存,则情况就不同了。尝试将这些特定格式转换为图像并使用此功能 我不知道这是否适用于您的场景,但请尝试让我知道:
public bool CompareImages(Image img1, Image img2)
{
bool rtn = true;
ImageConverter converter = new ImageConverter();
Bitmap bmp1 = img1;
Bitmap bmp2 = img2;
int dWid = Math.Min(bmp1.Width, bmp2.Width);
int dHei = Math.Min(bmp1.Height, bmp2.Height);
for (int x = 0; x <= dWid - 1; x++) {
for (int y = 0; y <= dHei - 1; y++) {
if (!bmp1.GetPixel(x, y).Equals(bmp2.GetPixel(x, y))) {
rtn = false;
break;
}
}
}
return rtn;
}
尝试将这些特定格式转换为图像并使用此功能 我不知道这是否适用于您的场景,但请尝试让我知道:
public bool CompareImages(Image img1, Image img2)
{
bool rtn = true;
ImageConverter converter = new ImageConverter();
Bitmap bmp1 = img1;
Bitmap bmp2 = img2;
int dWid = Math.Min(bmp1.Width, bmp2.Width);
int dHei = Math.Min(bmp1.Height, bmp2.Height);
for (int x = 0; x <= dWid - 1; x++) {
for (int y = 0; y <= dHei - 1; y++) {
if (!bmp1.GetPixel(x, y).Equals(bmp2.GetPixel(x, y))) {
rtn = false;
break;
}
}
}
return rtn;
}
如评论中所述,一张图片只会比较几次3或4种可能的匹配 比较次数少,可能无法弥补计算哈希/摘要的成本
我建议做一个直接的字符串比较,如果你有一个匹配,它将只是字符串的长度,如果他们不匹配,它将只处理几个字节,直到第一个差异。如果要避免从数据库检索所有记录,可以选择仅检索与要比较的字符串长度相同的记录。如注释中所述,图像将仅比较3或4次可能的匹配 比较次数少,可能无法弥补计算哈希/摘要的成本 我建议做一个直接的字符串比较,如果你有一个匹配,它将只是字符串的长度,如果他们不匹配,它将只处理几个字节,直到第一个差异。如果要避免从数据库检索所有记录,可以选择仅检索与要比较的字符串长度相同的记录。注意: base64编码图像在base64以PNG或JPEG格式对编码图像进行解码后包装在其中。因此,如果您在使用或不使用base64解码的情况下比较该内容,则只有当完整的PNG/JPEG流相等时,才能获得匹配,就像在比较文件时一样。如果您想要测试原始图像的相等性,即相同的像素,那么这将不起作用。这不仅是因为元数据(如时间戳),还因为两种格式在编码压缩算法和参数方面都有额外的自由度,因此相同的图像内容可以生成不同的PNG/JPEG图像 如果您对此没有意见,如果您真的想在say文件级别测试图像是否相等,那么您可以首先测试字符串长度,如果图像较大,那么长度不太可能相等,并且只有当它们匹配时,才进行逐字节比较。请参阅pmoleri关于散列/摘要的回答。 如果你想优化,只比较中间的一部分,比如说100字节。尤其是PNG图像,它们都有相同的16个字节,最后12个字节。注意: base64编码图像在base64以PNG或JPEG格式对编码图像进行解码后包装在其中。因此,如果您在使用或不使用base64解码的情况下比较该内容,则只有当完整的PNG/JPEG流相等时,才能获得匹配,就像在比较文件时一样。如果您想要测试原始图像的相等性,即相同的像素,那么这将不起作用。这不仅是因为元数据(如时间戳),还因为两种格式在编码压缩算法和参数方面都有额外的自由度,因此相同的图像内容可以生成不同的PNG/JPEG图像 如果您对此没有意见,如果您真的想在say文件级别测试图像是否相等,那么您可以首先测试字符串长度,如果图像较大,那么长度不太可能相等,并且只有当它们匹配时,才进行逐字节比较。请参阅pmoleri关于散列/摘要的回答。
如果你想优化,只比较中间的一部分,比如说100字节。尤其是PNG图像,它们都有相同的16个字节,最后是12个字节。我假设您指的是PNG到PNG和jpeg到jpeg-通过pi将PNG与jpeg像素进行比较
因为jpeg是有损的,所以像素永远不会匹配。如果您试图查找完全相同的文件,我认为比较字节字符串应该可以。当然可以。相同意味着它们是相同的。您需要只比较两个图像,还是将一个图像与存储在数据库中的N个图像进行比较?在第二种情况下,可以存储每个图像的哈希。@pmoleri通常将源1中的图像与源2中的3-4个图像进行比较。因为我只能控制Source2,它是一个sql数据库,所以我可以存储一个MD5。但是,我需要为源1中的每个图像创建一个md5哈希。好的观点。我假设你指的是png对png和jpeg对jpeg-逐像素比较png和jpeg永远不会匹配,因为jpeg是有损的。如果您试图查找完全相同的文件,我认为比较字节字符串应该可以。当然可以。相同意味着它们是相同的。您需要只比较两个图像,还是将一个图像与存储在数据库中的N个图像进行比较?在第二种情况下,可以存储每个图像的哈希。@pmoleri通常将源1中的图像与源2中的3-4个图像进行比较。因为我只能控制Source2,它是一个sql数据库,所以我可以存储一个MD5。但是,我需要为源1中的每个图像创建一个md5哈希。说得好,我觉得这不太理想。转换为图像是一个更大的操作。我工作,它可能不是最好的解决方案,但它比较图像。除非你比较成千上万张大图,否则这是可行的。对不起,我的问题不够清楚,但这不是我需要的。无论如何,比较有损格式要比这个复杂一些。这对我来说似乎不太理想。转换为图像是一个更大的操作。我工作,它可能不是最好的解决方案,但它比较图像。除非你比较成千上万张大图,否则这是可行的。对不起,我的问题不够清楚,但这不是我需要的。无论如何,比较有损格式比这要复杂一些。