gpt4 book ai didi

c# - WriteableBitmap访问冲突问题

转载 作者:行者123 更新时间:2023-11-30 16:29:52 25 4
gpt4 key购买 nike

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

最佳答案

两个问题。

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

(2) 计算偏移量时为什么要乘以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;

关于c# - WriteableBitmap访问冲突问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6096979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com