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

本文关键字:两个 图像 比较 何使用 字节 字节数 数组 | 更新日期: 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[])与旧文件相同,尽管图像本身没有更改。