如何使用字节数组比较两个图像
本文关键字:两个 图像 比较 何使用 字节 字节数 数组 | 更新日期: 2023-09-27 18:19:43
我希望能够从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
!
有什么方法可以纠正这种方法或一些不同的功能来实现我的目标吗?
谢谢!
如果未重写,则使用==
将比较对象引用。
由于这是两个不同的byte[]
对象,因此引用是不同的。
您需要逐项比较byte[]
对象,以确认它们是相同的。在这种情况下,您可以使用SequenceEquals
。
==
表示您在内存中有对同一对象的引用。
这展示了如何以几种不同的方式比较字节数组。
我最近需要编写一个图像cropper,它需要将fileBytes保存为图像。这就是我所做的。希望这能对你有所帮助。
public Image byteArrayToImage(byte[] fileBytes)
{
using (MemoryStream fileStream = new MemoryStream(fileBytes))
{
return Image.FromStream( fileStream );
}
}
显然,我的裁剪/保存代码对此进行了扩展。但是我能够从文件字节中返回一个Image对象。
重新编码图像时,生成的文件(或字节数组)可能与原始版本有所不同。特别是如果你从数据库中检索到的是jpeg文件!
因此,即使比较数组中的字节(而不是引用),也可以得到差异。
编辑
当您将字节[](包含GIF编码的图像)读取到BitMap
中时,这些字节将解压缩为每个像素4(ARGB)字节。当您将位图保存到(新的)gif文件(或byte[])时,新编码的文件可能不同(例如,颜色的存储顺序)。因此,不能保证新文件(或byte[])与旧文件相同,尽管图像本身没有更改。