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

我希望能够从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

有没有办法纠正这种方法或一些不同的function来实现我的目标?

谢谢!

如果不重写,使用==将比较对象引用。

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

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

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

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

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

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

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

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

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

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