WriteableBitmap访问冲突问题

发布于 2024-11-09 08:04:05 字数 1155 浏览 0 评论 0原文

当访问最后一个像素 (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;
}

The following code always causes an AccessViolationException in the Fill method when the last pixel (x = 255, y = 255) is accessed. However, if I use a size such as 200x200 it works. Same problem with 512 x 512 or 1024 x 1024 or other power-of-two sizes (seems to work fine with 4x4, 8x8 ... up to 32 x 32). Any ideas why that is?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冰火雁神 2024-11-16 08:04:05

两个问题。

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

Two issues.

(1) Your are assuming that bitsPerPixels is the same as the size of an int when you set the color.

(2) Why are you multiplying x by 3 when calculting the offset?

If bitsPerPixels is 32; then (1) is current and (2) should be multiplying x by 4.

Else if bitsPerPixels is 24 then (1) should be

       *((byte *) pBadkBufferWithOffset + 0) = color.R;
       *((byte *) pBadkBufferWithOffset + 1) = color.G;
       *((byte *) pBadkBufferWithOffset + 2) = color.B;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文