Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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# base64编码图像的快速比较_C#_Comparison_Png_Base64_Jpeg - Fatal编程技术网

C# base64编码图像的快速比较

C# base64编码图像的快速比较,c#,comparison,png,base64,jpeg,C#,Comparison,Png,Base64,Jpeg,我有一个逻辑,需要比较base64编码的图像JPEG和PNG,并检查它们是否相同 最基本的方法是比较整个字符串 由于图像往往很大,我想知道是否有更快和/或更节省内存的方法来比较它们。例如,仅比较前x个字符,而base64是逐字节进行的,只比较图片的前x个字节 我不熟悉jpeg和png格式的内部工作原理,也不熟悉第一个字节碰撞产生假阳性匹配的可能性,但是如果它相当低,比如1:10000,那是可以接受的 能否实现更好的比较? 能否在低假阳性匹配概率的情况下实现更好的比较? 并不是说基本的比较速度慢得

我有一个逻辑,需要比较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哈希。说得好,我觉得这不太理想。转换为图像是一个更大的操作。我工作,它可能不是最好的解决方案,但它比较图像。除非你比较成千上万张大图,否则这是可行的。对不起,我的问题不够清楚,但这不是我需要的。无论如何,比较有损格式要比这个复杂一些。这对我来说似乎不太理想。转换为图像是一个更大的操作。我工作,它可能不是最好的解决方案,但它比较图像。除非你比较成千上万张大图,否则这是可行的。对不起,我的问题不够清楚,但这不是我需要的。无论如何,比较有损格式比这要复杂一些。