2010-08-08 69 views
4

我目前正在實現一個方法來接受兩個位圖對象。我們可以假設所說的對象具有相同的尺寸等。該方法的返回是一個像素變化列表(它存儲在一個自制對象中)。這是以迭代的方式開發的,所以當前的實現是基本的實現......只是簡單地處理每個像素並將其與其對應物進行比較。這種產生變化的方法比可接受的(500ms左右)慢,因此我正在尋找更快的過程。快速比較兩個位圖對象每個像素的像素基數

我想過的想法是將圖像分解爲條狀圖,並在新線程上運行每個比較或將屏幕區域作爲對象進行比較,然後僅根據需要詳細檢查。您的理解

當前代碼...

for (int x = 0; x < screenShotBMP.Width; x++) 
    { 
     for (int y = 0; y < screenShotBMP.Height; y++) 
     { 
      if (screenShotBMP.GetPixel(x, y) != _PreviousFrame.GetPixel(x, y)) 
      { 
      _pixelChanges.Add(new PixelChangeJob(screenShotBMP.GetPixel(x,y), x, y)); 
      } 
     } 
    } 

,你從代碼有問題之類的概念是採取截圖,並生成從以前拍攝的屏幕截圖像​​素更改的列表中扣除。

回答

3

你一定要看Lockbits操作位圖數據的方法。

它比GetPixel/SetPixel快幾個數量級。

編輯:
檢查this link一段代碼(儘管在VB,但你應該得到的漂移),幾乎你想要做什麼。它只是檢查兩個位圖是否相等,並返回true或false。您可以更改函數,以便每個像素檢查在必要時添加到您的_pixelChanges列表中,並返回此列表而不是布爾值。

另外,如果你交換迭代器循環,它可能會更快。即讓內部循環在X上迭代,並且外部循環在Y上迭代。

+0

謝謝,有關如何在Lockbits下實現上述內容的任何建議,我們將不勝感激......但現在,我的大腦已經壞掉了,並使用我自己的大腦! – Nick 2010-08-08 11:02:01

+0

謝謝安迪我現在已經很好地實施了。 – Nick 2010-08-08 18:36:20

+0

沒有probs。只是爲了好奇,它快多少? – Andy 2010-08-08 18:38:55

3

將BitBlt與選項XOR ....一起使用。應該快得多。