2009-02-17 14 views
1

我遇到了Lockbits的問題。我正在搜索黑色像素,並且由於它看起來不正確,我使用WindowPopup來打印每個像素的顏色,但它就像我的程序正在使用另一張圖像。使用Lockbits來搜索黑色像素,但是這是隨機的嗎?

alt text http://i208.photobucket.com/albums/bb91/Savaronna/pixel-1.jpg?t=1234874238

標誌着我第一個找到的黑色像素的紅色。正如你所看到的,還有其他幾個像素也應該匹配。我究竟做錯了什麼?

這是我的劇本,我負責的東西嗎?

Bitmap b = this.TableListBMP; 
BitmapData bmpData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
           ImageLockMode.ReadWrite, 
           PixelFormat.Format32bppPArgb); 

int stride = bmpData.Stride; 
IntPtr Scan0 = bmpData.Scan0; 

unsafe 
{ 
    byte * p = (byte *)(void *)Scan0; 
    int nOffset = bmpData.Stride - b.Width*4;  
    int xOffset, yOffset; 

    for(int y=5; y<b.Height; ++y) 
    { 
    for(int x=1; x<b.Width; ++x) 
    { 
     MessageBox.Show(
     string.Format("x={0}, y={1}, ARGB={2},{3},{4},{5}", 
      x, y, 
      Convert.ToString(p[(y*stride)+(x*4)]), 
      Convert.ToString(p[(y*stride)+(x*4)+1]), 
      Convert.ToString(p[(y*stride)+(x*4)+2]), 
      Convert.ToString(p[(y*stride)+(x*4)+3]))); 
     p +=4; 
    } 
    // EDIT: This line should be removed 
    p += nOffset; 
    } 
} 
b.UnlockBits(bmpData); 

回答

3

如果您使用的偏移量如p[((y)*stride)+((x)*4)],您可能不應該增加p?當然你已經處理了(xy)乘法?另外,bmpData.Stride - b.Width*4不是(據我所見)一個有意義的數字......跨度是包含填充的行大小。

要麼刪除「p += ...」代碼,或改變它的偏移算法。此刻你跳過數據(壞)和對象(非常壞的)之外的訪問數據。

+0

只是想讓你知道,我刪除了p + =部分,它的工作原理。 感謝您的幫助 – Sven 2009-02-17 16:32:12