簡體   English   中英

如何使用字節數組比較兩個圖像

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM