WriteableBitmap访问冲突问题 [英] WriteableBitmap access violation problem

查看:62
本文介绍了WriteableBitmap访问冲突问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当访问最后一个像素(x = 255,y = 255)时,以下代码始终在Fill方法中导致AccessViolationException.但是,如果我使用200x200之类的尺寸,则可以使用.512 x 512或1024 x 1024或其他2的幂次幂也存在相同的问题(似乎可以在4x4、8x8 ...最高32 x 32的情况下正常工作).知道为什么吗?

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

推荐答案

两个问题.

(1)您假设在设置颜色时bitsPerPixels与int的大小相同.

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

(2)为什么在计算偏移量时将x乘以3?

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

如果bitsPerPixels为32;那么(1)是当前的,而(2)应该将x乘以4.

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

否则,如果bitsPerPixels为24,则(1)应该为

Else if bitsPerPixels is 24 then (1) should be

       *((byte *) pBadkBufferWithOffset + 0) = color.R;
       *((byte *) pBadkBufferWithOffset + 1) = color.G;
       *((byte *) pBadkBufferWithOffset + 2) = color.B;

这篇关于WriteableBitmap访问冲突问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆