我想逐字节比较两个图像。它们都是 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 本身的信息。所以第二个流是用 Length
等于 41078 和 Position
等于 1278 创建的。如果 Position
是 1078 我会理解,但它不是't,从该位置开始还剩不到 40000 字节。
在我的算法中,我需要尽可能快地比较图像,所以我拒绝了创建位图并通过 GetPixel
方法进行比较的想法。我使用 MemoryStream.ReadByte
方法进行比较。
如何从第二个 Stream
中获取“真正的”BMP 字节?在这种情况下,有什么方法可以逐字节比较图像吗?
最佳答案
这是一篇关于在 C# 中非常快速地与图像进行比较的帖子。它以一个非常慢的版本开始(仍然比 GetPixel 好),以一个快 25 倍的版本结束:
http://danbystrom.se/2008/12/14/improving-performance/
如果图像相同,它返回一个数字,该数字为零,返回值越高 - 它们的差异越大。它应该为您指明正确的方向。
但是请注意。它经过优化,仅适用于 32bpp 图像。如果您有 24bpp 图像(加载后默认为 .jpg),您要么需要更“复杂”的代码,要么只需将其转换为 32bpp。 “并发症”是您不能在一个循环中进行所有比较,而是逐行循环并单独比较每一行。
关于c# - 比较两个图像问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201075/