WriteableBitmap访问冲突问题

本文关键字:问题 访问冲突 WriteableBitmap | 更新日期: 2023-09-27 17:57:38

当访问最后一个像素(x=255,y=255)时,以下代码总是在Fill方法中导致AccessViolationException。但是,如果我使用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;
}

WriteableBitmap访问冲突问题

两个问题。

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