我有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文件,但其中很多都是重复的(不同子文件夹中存在相同名称的相同图片,而且有些图片名称相同但图片不同)
我想将所有独特的图片移动到新文件夹并删除那些重复的图片,以防万一我有两张同名的图片我需要比较它们。
答案 0 :(得分:0)
使用这样的原型,该功能不会比较JPEG图像文件,而是比较它们来自的解压缩位图。逐像素比较将是有效的(使用LockBits,如Franck所建议的)。计算和比较校验和可以更快,因为这是一个无分支操作,但一定要使用快速公式。
如果您的目标是比较文件而不是图像,请避免将文件作为位图加载,因为这会导致代价高昂的解压缩并增加内存占用。无论如何,即使图像相同,这也会检测标签/文件组织的差异。
最后但同样重要的是,比较相似图像是一个完全不同的故事。