繁体   English   中英

base64编码图像的快速比较

[英]Fast comparison of base64 encoded images

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

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

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

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

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

并不是说基本的比较是非常缓慢的,而且因为我需要将整个字符串读入内存而无论如何其他操作,我可能最终会对它们使用简单的相等比较,我只是对其他可能性感兴趣。

编辑:

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

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

较低的比较次数可能无法弥补计算散列/摘要的成本。

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

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

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

尝试将这些特定格式转换为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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM