Проблема нарушения прав доступа WriteableBitmap - PullRequest
3 голосов
/ 23 мая 2011

Следующий код всегда вызывает AccessViolationException в методе Fill при доступе к последнему пикселю (x = 255, y = 255).Однако, если я использую размер, такой как 200x200, это работает.Та же проблема с 512 x 512 или 1024 x 1024 или другими размерами степени двойки (кажется, хорошо работает с 4x4, 8x8 ... до 32 x 32).Есть идеи, почему это так?

var wb = new WriteableBitmap(256, 256, 96, 96, PixelFormats.Bgr24, null);
wb.Fill(256, 256, 3, Colors.Black);

...

public static void Fill(this WriteableBitmap bmp, int width, int height, int bytesPerPixel, Color color)
{
    var rect = new Int32Rect(0, 0, width, height);
    var fillColor = color.ToInt();

    bmp.Lock();

    unsafe
    {
      int pBackBuffer = (int)bmp.BackBuffer;
      int stride = bmp.BackBufferStride;

      for (int y = 0; y < height; y++)
        for (int x = 0; x < width; x++)
        {
          int offset = y * stride + x * bytesPerPixel;
          int pBackBufferWithOffset = pBackBuffer + offset;
          *((int*) pBackBufferWithOffset) = fillColor;
        }
    }

    bmp.AddDirtyRect(rect);
    bmp.Unlock();
}

private static int ToInt(this Color color)
{
    int c = color.R << 16; // R
    c    |= color.G << 8;  // G
    c    |= color.B << 0;  // B
    return c;
}

1 Ответ

3 голосов
/ 23 мая 2011

Два вопроса.

(1) Вы предполагаете, что bitsPerPixels совпадает с размером int при установке цвета.

(2) Почему вы умножаете x на 3 при расчете смещения?

Если bitsPerPixels равно 32;тогда (1) является текущим и (2) должно умножаться на x на 4.

Иначе, если bitsPerPixels равно 24, тогда (1) должно быть

       *((byte *) pBadkBufferWithOffset + 0) = color.R;
       *((byte *) pBadkBufferWithOffset + 1) = color.G;
       *((byte *) pBadkBufferWithOffset + 2) = color.B;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...