如何使用字节数组比较两个图像

时间:2012-01-06 20:47:31

标签: c# image bytearray

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

我有here中的这两种方法:

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

有任何方法可以纠正这种方法或某些不同的功能来实现我的目标吗?

谢谢!

4 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:2)

==表示您对内存中的同一对象有引用。

This展示了如何以几种不同的方式比较字节数组。

答案 2 :(得分:2)

我最近需要编写一个需要将fileBytes保存为图像的图像裁剪器。这就是我做的。希望这对你有帮助。

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

显然我的裁剪/保存代码扩展了这一点。但我能够从文件字节返回一个Image对象。

答案 3 :(得分:1)

重新编码图像时,生成的文件(或字节数组)可能(稍微?)与原始版本不同。特别是如果你从数据库中检索的是一个jpeg文件!

因此,即使您比较数组中的字节(而不是引用),您也可以获得差异。

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