2012-01-06 59 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對象。