2011-06-01 67 views
3

我想比較兩個圖像逐字節。它們都是8位BMP圖像,大小正好是40000字節。第一個圖像在內存中以字節數組的形式生成,第二個圖像從文件讀入Image對象。比較兩個圖像問題

我使用MemoryStream實例用於比較:

byte[] generatedImage = new byte[40000]; 
    // some unrelated logic of image generation ... 
    MemoryStream imageStream1 = new MemoryStream(generatedImage); 

    // loaded image, 200x200 bmp - 40000 bytes 
    MemoryStream imageStream2 = new MemoryStream(); 
    Image loadedImage = Image.FromFile("image.bmp"); 
    loadedImage.Save(imageStream2, ImageFormat.Bmp); 

的問題是,所加載的圖像imageStream2的存儲器流含有 40000字節,據我所知包含有關BMP的一些信息本身也是如此。所以第二個流創建Length等於41078和Position等於1278.我會理解,如果Position是1078,但它不是,並從該位置有少於40000字節剩下。

在我的算法中,我需要儘可能快地比較圖像,所以我拒絕了創建位圖和通過GetPixel方法進行比較的想法。我使用MemoryStream.ReadByte方法進行比較。

如何從第二個Stream獲得「真實」BMP字節?在這種情況下,有什麼方法可以在字節到字節的基礎上比較圖像嗎?

+0

如您對文件進行操作只是比較文件:http://support.microsoft.com/kb/320348 – 2011-06-01 12:29:13

+0

不僅上的文件。我不簡單地比較這些圖像,我試圖找出它們在每個圖像的每個字節上的某些操作有多少不同。 – Centro 2011-06-01 12:35:38

回答

3

這是一篇關於在C#中比較圖像的文章,相當快。它開始了一個相當緩慢的版本(這仍然比GetPixel更好),並與一個版本是25倍的速度結束了:

http://danbystrom.se/2008/12/14/improving-performance/

它返回一個數字,是零,如果圖像是相同的,回報值越高 - 它們的差異越大。它應該指向正確的方向。

然而,謹慎的一句話。它僅針對32bpp圖像進行了優化。如果你有24bpp的圖像(在加載後缺省爲.jpg),你需要更復雜的代碼或者簡單地將其轉換爲32bpp。 「複雜性」是你不能在一個循環中完成所有的比較,而是逐個循環地逐行比較每一行。

0

我不會在字節級別比較它們。相反,我會把它們放入Bitmap。並通過調用GetPixel(x,y)來重複遍歷所有像素,所有可能的值從零到WidthHeight

+0

我需要將生成的圖像與從文件中讀取並加載到內存中的大量圖像進行比較,因此算法必須儘可能快。 – Centro 2011-06-01 12:40:56

0

比較圖像逐字節不是一個很好的解決您的問題。在這種情況下,您可以使用其中一種哈希算法的實現。

Hash Function」得到一個可變長度值併產生一個長度恆定的輸出。例如,SHA256算法獲取輸入值並生成256位輸出。請注意,當且僅當相應的數據匹配時,兩組數據的散列相同,並且數據中的任何小的更改都會導致散列值急劇變化,所以在比較大量數據時這是一種很酷的方法。欲瞭解更多信息,這篇文章的部分「是Flash哈希」閱讀: http://www.codeproject.com/KB/GDI-plus/comparingimages.aspx?msg=3503625&display=Mobile