base64编码图像的快速比较

时间:2014-04-09 14:38:45

标签: c# comparison png base64 jpeg

我有一个逻辑需要比较base64编码的图像(JPEG和PNG)并检查它们是否相同。

最基本的方法是比较整个字符串。

由于图像往往非常大,我想知道是否有更快和/或更高效的内存来比较它们。例如,只比较前x个字符,但base64是逐字节完成的,只能比较图片的前x个字节。

我不熟悉jpeg和png格式的内部工作方式以及第一个字节冲突的可能性(产生误报匹配),但是如果它相当低(如1:10000) )这是可以接受的。

  • 可以实施更好的比较吗?
  • 能否以较低的误报率匹配实施更好的比较?

并不是基本的比较速度很慢,而且因为我需要将整个字符串读入内存中以备其他操作,我可能最终会对它们使用简单的相等比较,我只是对其他可能性感兴趣。

修改

很抱歉没有正确澄清这个问题,但这个问题不是为了比较图像数据。有损的图像格式无论如何都会让它变得痛苦,如果图像以不同的格式或不同的选项保存,它的 就不同了。

3 个答案:

答案 0 :(得分:1)

如评论中所述,图像将仅进行几次比较(3或4种可能的匹配)。

较少的比较,可能无法弥补计算哈希/摘要的成本。

我建议进行直接的字符串比较,如果你有一个匹配,它将只是字符串的长度,如果它们不匹配,它将只处理几个字节,直到第一个差异。如果要避免从数据库中检索所有记录,可以选择仅检索与要比较的字符串长度相同的记录。

答案 1 :(得分:1)

警告: base64编码的图像以PNG或JPEG格式包含在其中(在base64解码之后)编码的图像。因此,如果您比较该内容(使用或不使用base64解码),只有在完整的PNG / JPEG流相同时才会获得匹配,就像比较文件时一样。如果要测试原始图像相等性(即相同像素),则无效。不仅因为元数据(例如,时间戳),而且因为两种格式在其编码(压缩算法和参数)中具有额外的自由度,因此相同的图像内容可以产生不同的PNG / JPEG图像。

如果您对此感到满意,如果您真的想在(比方说)文件级别测试图像相等性,那么您可以首先测试字符串长度(如果图像很大则不太可能长度将是等于)并且只有当它们匹配时才进行逐字节比较。 (参见有关散列/摘要的pmoleri答案)。 如果要优化,只需比较一部分(比如中间的100个字节)。 PNG图像,特别是16个字节和最后12个字节。

答案 2 :(得分:0)

尝试将这些特定格式转换为Image并使用此功能。

我不知道这是否适合您的情况,但请尝试让我知道:)

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