比较两张图片的问题

3
我希望能够逐字节比较两个图像。这两个图像都是8位BMP图像,大小恰好为40000字节。第一张图像以字节数组的形式在内存中生成,第二张图像从文件中读取并转换成一个Image对象。
我使用MemoryStream实例进行比较:
    byte[] generatedImage = new byte[40000];
    // some unrelated logic of image generation ...
    MemoryStream imageStream1 = new MemoryStream(generatedImage);

    // loaded image, 200x200 bmp - 40000 bytes
    MemoryStream imageStream2 = new MemoryStream();
    Image loadedImage = Image.FromFile("image.bmp");
    loadedImage.Save(imageStream2, ImageFormat.Bmp);

问题在于加载的图像内存流imageStream2包含超过40000字节,据我所知,它还包含有关BMP本身的一些信息。因此,第二个流的长度为41078,位置为1278。如果位置是1078,我会理解,但它不是,而且从这个位置开始,剩下的字节数少于40000个。
在我的算法中,我需要尽可能快地比较图像,因此我拒绝了创建位图并通过GetPixel方法进行比较的想法。我使用MemoryStream.ReadByte方法进行比较。
如何从第二个Stream获取“真实”的BMP字节?在这种情况下,是否有办法按字节比较图像?

在操作文件时,只需比较文件:http://support.microsoft.com/kb/320348 - Damian Leszczyński - Vash
不仅在文件上。我不仅仅比较图像,而是尝试通过对每个图像的每个字节进行某些操作来计算它们有多大的差异。 - Centro
4个回答

3
这是一篇关于在C#中快速比较两张图片的文章。它开始使用一个相对较慢的版本(但仍比GetPixel好),最终得到了一个速度快25倍的版本。

http://danbystrom.se/2008/12/14/improving-performance/

它返回一个数字,如果图像相同则为零,返回值越高 - 差异越大。它应该指引你朝着正确的方向前进。
但是需要注意一点,它仅优化用于32bpp图像。如果您有24bpp图像(默认情况下是.jpg),则需要更多“复杂”的代码或将其转换为32bpp。 “复杂性”在于您无法在一个循环中进行所有比较,而是逐行循环并单独比较每一行。

2

0
我不会按字节级别将它们进行比较。相反,我会将它们放入位图中。通过调用GetPixel(x,y)对所有像素进行迭代,使用从零到WidthHeight的所有可能值。

我需要将生成的图像与从文件中读取并加载到内存中的许多图像进行比较,因此算法必须尽可能快。 - Centro

0

逐字节比较图像不是解决问题的好方法。在这种情况下,您可以使用散列算法之一的实现。

散列函数”获取变长值并生成具有恒定长度的输出。例如,SHA256算法获取输入值并生成256位输出。请注意,仅当对应的数据匹配时,两组数据的哈希相同,并且任何数据的微小更改都会导致哈希值发生巨大变化,因此在比较大量数据时,这是一个很棒的方法。有关更多信息,请阅读本文中的“哈希闪存”部分: http://www.codeproject.com/KB/GDI-plus/comparingimages.aspx?msg=3503625&display=Mobile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接