Использование Lockbits для поиска черных пикселей, но это случайно? - PullRequest
1 голос
/ 17 февраля 2009

У меня проблема с Lockbits. Я ищу черные пиксели, и, поскольку они кажутся неправильными, я использую WindowPopup для печати цветов каждого пикселя, но похоже, что моя программа использует другое изображение.

альтернативный текст 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);

1 Ответ

3 голосов
/ 17 февраля 2009

Если вы используете смещения, такие как p[((y)*stride)+((x)*4)], вам, вероятно, вообще не следует увеличивать p? Конечно, вы уже обработали это (x и y) с умножением? Кроме того, bmpData.Stride - b.Width*4 не является (насколько я вижу) значимым числом ... шаг - это размер строк, включая отступы.

Либо удалите код "p += ...", либо измените алгоритм смещения. В настоящий момент вы пропускаете данные (плохо) и получаете доступ к данным вне объекта ( очень плохо).

...