比较两个.jpg文件:校验和或字节到字节或其他建议?

时间:2017-07-04 15:45:46

标签: c# image-processing compare

我有C#程序比较2个.jpg文件,
我正在使用我在互联网上找到的这个功能,它运行良好,但速度非常慢(比较需要一秒多的时间)

public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
{
 MemoryStream ms = new MemoryStream();
 firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
 String firstBitmap = Convert.ToBase64String(ms.ToArray());
 ms.Position = 0;

 secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
 String secondBitmap = Convert.ToBase64String(ms.ToArray());

 if (firstBitmap.Equals(secondBitmap))
 {
     return true;
 }
 else
 {
     return false;
 }
}

现在我想知道为什么不使用更快的校验和进行比较? 结果字节到字节的比较是否更准确?

我需要比较jpg文件的原因:
在我的电脑上,我有数千个从我的相机和智能手机中取出的jpg文件,但其中很多都是重复的(不同子文件夹中存在相同名称的相同图片,而且有些图片名称相同但图片不同)

我想将所有独特的图片移动到新文件夹并删除那些重复的图片,以防万一我有两张同名的图片我需要比较它们。

1 个答案:

答案 0 :(得分:0)

使用这样的原型,该功能不会比较JPEG图像文件,而是比较它们来自的解压缩位图。逐像素比较将是有效的(使用LockBits,如Franck所建议的)。计算和比较校验和可以更快,因为这是一个无分支操作,但一定要使用快速公式。

如果您的目标是比较文件而不是图像,请避免将文件作为位图加载,因为这会导致代价高昂的解压缩并增加内存占用。无论如何,即使图像相同,这也会检测标签/文件组织的差异。

最后但同样重要的是,比较相似图像是一个完全不同的故事。