[英]How to compare two images using byte arrays
我希望能夠從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
。
==
表示您對內存中的同一對象有引用。
這顯示了如何以幾種不同的方式比較字節數組。
我最近需要寫一個圖像裁切器,該裁切器需要將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 [])與舊文件相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.