如何使用字节数组比较两张图片

17

我希望能够将Byte[]转换为Image,反之亦然。

我从这里获得了这两种方法:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return  ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}

它们似乎有效,但如果我执行:

byte[] pic = GetImageFromDb();
bool result = pic == imageToByteArray(byteArrayToImage(pic));

我得到了result = false的结果!

有没有办法修正这些方法或者使用其他不同的函数来实现我的目标?

谢谢!


同样的问题在这里: https://dev59.com/5moy5IYBdhLWcg3wHabt除了 == 的东西 使用 pic.equals(imageToByteArray(byteArrayToImage(pic)); - Oliver Bernhardt
@OliverBernhardt 请尝试这段代码 new byte[] { 1 }.Equals(new byte[] { 1 }) - L.B
4个回答

16

如果没有覆盖,使用 == 将比较对象引用。

由于这是两个不同的 byte [] 对象,因此引用不同。

您需要逐个比较 byte [] 对象的项目以确认它们是否相同。在这种情况下,您可以使用SequenceEquals


此外,OP应该阅读类似于https://dev59.com/oHRB5IYBdhLWcg3wXWG2的内容,以了解如何正确比较它们。 - Chris Shain
2
@ChrisShain - 这个问题是关于在不同的数组中拥有相同的项 - 排序在那里并不重要。但在这里,它非常重要。 - Oded
非常正确,我没有注意到。虽然这个例子很糟糕,但关于这个主题的好问题有很多。 - Chris Shain

2

== 表示你有一个指向内存中同一对象的引用。

这里 展示了几种不同的方法来比较字节数组。


为什么这个语句返回 false?new byte[] { 1 }.Equals(new byte[] { 1 }) - L.B
@L.B:非常正确。但对于数组,这种方法行不通。请参见此处了解如何正确比较字节数组。我会相应地更新我的答案。 - Mark Avenius

2

最近我需要编写一个图像裁剪器,需要将文件字节保存为图像。这是我所做的。希望这能帮助到你。

public Image byteArrayToImage(byte[] fileBytes)
{
    using (MemoryStream fileStream = new MemoryStream(fileBytes))
    {
        return Image.FromStream( fileStream );
    }
}

显然,我的裁剪/保存代码是在此基础上扩展的。但我能够从文件字节返回一个图像对象。

1

当你重新编码图像时,结果文件(或字节数组)可能与原始版本略有不同。特别是如果从数据库中检索到的是jpeg文件!

因此,即使比较数组中的字节(而不是引用),也可能存在差异。

编辑
当您将包含GIF编码图像的byte []读入BitMap中时,这些字节会被解压缩为每个像素4个(ARGB)字节。当您将该BitMap保存到新的gif文件(或字节数组)中时,新编码的文件可能会有所不同(例如,存储颜色的顺序)。因此,不能保证新文件(或字节数组)与旧文件完全相同,尽管图像本身没有改变。


为什么会这样?有没有办法避免它? - Diego

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