c# - 比较两个图像问题

标签 c# .net image image-processing

我想逐字节比较两个图像。它们都是 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/

相关文章:

c# - 当枚举值与字符串值不匹配时处理来自 nHibernate EnumStringType 的异常

c# - 如何去除重复的标签页?

c# - (无法)开始使用 Facebook C# SDK

c# - 如何从outlook邮件中提取表格

css - 图像 float 文本并清除所有内容?

javascript - 将文字放在图像上并另存为图像

c# - 仅在找到/存在实例时才使用 Redis 进行缓存?

c# - 使用 TPL-Dataflow 进行聚合和连接(内部、外部、左侧...)?

c# - 应用程序引发了未处理的异常。系统无效操作异常: Unable to > resolve service for type

javascript - 使用 Javascript 检测 404 图像