【问题标题】:Using Lockbits to search for black pixels, but does this randomly?使用 Lockbits 搜索黑色像素,但这是随机的吗?
【发布时间】:2025-12-19 06:35:11
【问题描述】:

我遇到了关于 Lockbits 的问题。我正在搜索黑色像素,因为它看起来不正确,所以我使用 WindowPopup 来打印每个像素的颜色,但这就像我的程序正在使用另一张图片一样。

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);

【问题讨论】:

    标签: c# gdi+ ocr


    【解决方案1】:

    如果您使用诸如p[((y)*stride)+((x)*4)] 之类的偏移量,您可能根本不应该增加p?你肯定已经用乘法处理了(xy)?此外,bmpData.Stride - b.Width*4 不是(据我所见)一个有意义的数字...步幅是包括填充在内的行大小。

    要么删除“p += ...”代码,要么更改偏移算法。目前,您正在跳过数据(错误)并访问对象外部的数据(非常错误)。

    【讨论】:

    • 只是想让你知道,我删除了 p += 部分并且它有效。感谢您的帮助