2012-01-06 58 views
17

我想能够从字节[]转换为图像,反之亦然。如何比较两个图像使用字节数组

我有这两种方法从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

任何方法来纠正这种方法或一些不同的功能,以实现我的目标?

谢谢!

+0

同样的问题在这里: http://stackoverflow.com/questions/8763630/c-sharp-gif-image-to-memorystream-and-back-lose-animation 除了==东西 使用PIC。 equals(imageToByteArray(byteArrayToImage(pic)); – 2012-01-06 21:05:12

+0

@OliverBernhardt尝试此代码'new byte [] {1} .Equals(new byte [] {1})' – 2012-01-06 21:12:05

回答

15

如果未覆盖,则使用==将比较对象引用。

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

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

+0

此外,OP应该读取类似于http:// stackoverflow .com/questions/649444/testing-equal-of-arrays-in-c-sharp来了解如何正确比较它们。 – 2012-01-06 20:51:43

+0

多么愚蠢!我完全错过了! – Diego 2012-01-06 20:52:17

+2

@ChrisShain - 问题是关于在不同的数组中有相同的项目 - 排序在那里并不重要。这里非常重要。 – Oded 2012-01-06 20:55:38

2

==意味着你有一个对内存中同一对象的引用。

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

+0

那么为什么这返回false? '新字节[] {1} .Equals(新字节[] {1})' – 2012-01-06 21:04:20

+0

@ L.B:非常真实。原谅我;对于数组,这不起作用。请参阅[这里](http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net)了解如何正确比较字节数组。相应地更新我的答案。 – 2012-01-06 21:09:04

1

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

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

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

+0

为什么会这样?有什么办法可以避免它? – Diego 2012-01-06 20:57:34

+0

@Diego - 请参阅编辑 – 2012-01-07 10:17:35

2

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

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

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