如何使用字节数组比较两个图像
我希望能够从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 [])与旧文件相同,尽管图像本身不会更改。