如何避免 Bgr24 格式的“WriteableBitmap 缓冲区大小不足”异常?
How to avoid `WriteableBitmap buffer size is not sufficient` exception for Bgr24 format?
我想创建一个 WriteableBitmap
,然后将其设置为 Image.Source
。我只对完全不透明的 RGB 感兴趣,所以我选择了 Bgr24
格式。
现在,当我尝试将一些像素写入位图时,使用 WritePixels()
我得到 缓冲区大小不足 异常。
wb = new WriteableBitmap(255, 255, 96d, 96d, PixelFormats.Bgr24, null);
for (int x = 0; x < wb.PixelWidth; x++)
{
for (int y = 0; y < wb.PixelHeight; y++)
{
byte blue = GetBlue();
byte green = GetGreen();
byte red = GetRed();
byte[] pixelColor = { blue, green, red };
// position where the pixel will be drawn
Int32Rect rect = new Int32Rect(x, y, 1, 1);
int stride = wb.PixelWidth * wb.Format.BitsPerPixel / 8;
// Write the pixel.
wb.WritePixels(rect, pixelColor, stride, x);
}
}
这是我的问题,pixelColor
大小(3 字节)是否足以进行该操作?
编辑
仅当我将 WriteableBitmap
初始化为 1 的 width
和 height
时才有效。
wb = new WriteableBitmap(255, 255, 96d, 96d, PixelFormats.Bgr24, null);
rect
尺寸有问题吗?
您错误地使用 x
作为输入缓冲区偏移量,它应该为零:
wb.WritePixels(rect, pixelColor, stride, 0);
您也可以直接使用 x
和 y
作为目标值,并使用适当的源矩形和步幅,例如
wb.WritePixels(new Int32Rect(0, 0, 1, 1), pixelColor, 3, x, y);
我想创建一个 WriteableBitmap
,然后将其设置为 Image.Source
。我只对完全不透明的 RGB 感兴趣,所以我选择了 Bgr24
格式。
现在,当我尝试将一些像素写入位图时,使用 WritePixels()
我得到 缓冲区大小不足 异常。
wb = new WriteableBitmap(255, 255, 96d, 96d, PixelFormats.Bgr24, null);
for (int x = 0; x < wb.PixelWidth; x++)
{
for (int y = 0; y < wb.PixelHeight; y++)
{
byte blue = GetBlue();
byte green = GetGreen();
byte red = GetRed();
byte[] pixelColor = { blue, green, red };
// position where the pixel will be drawn
Int32Rect rect = new Int32Rect(x, y, 1, 1);
int stride = wb.PixelWidth * wb.Format.BitsPerPixel / 8;
// Write the pixel.
wb.WritePixels(rect, pixelColor, stride, x);
}
}
这是我的问题,pixelColor
大小(3 字节)是否足以进行该操作?
编辑
仅当我将 WriteableBitmap
初始化为 1 的 width
和 height
时才有效。
wb = new WriteableBitmap(255, 255, 96d, 96d, PixelFormats.Bgr24, null);
rect
尺寸有问题吗?
您错误地使用 x
作为输入缓冲区偏移量,它应该为零:
wb.WritePixels(rect, pixelColor, stride, 0);
您也可以直接使用 x
和 y
作为目标值,并使用适当的源矩形和步幅,例如
wb.WritePixels(new Int32Rect(0, 0, 1, 1), pixelColor, 3, x, y);