我正在尝试操作一个图像,当涉及到位图和图像时,我对我的问题和代码感到很陌生。我正在初始化一个字节数组来保存Bgr24像素数据,所以我可以将它传递给BitmapSource对象。但我的像素阵列“我认为”的大小不正确。
最后一行代码实际上是我的问题所在,参数“pixels”给我发出以下错误“System.ArgumentException未处理值不在预期范围内。”
我初始化这些变量
int imageSize = 100;
double dpi = 96;
int width = 128;
int height = 128;
byte[] pixels = new byte[width * height * 3];
//Create my image....
for (int i = 0; i < imageSize; i++)
{
for (int j = 0; j < imageSize; j++)
{
int ct = myImage[i, j];
pixels[i * imageSize * 3 + j + 0] = (byte)((ct % 16) * 14);
pixels[i * imageSize * 3 + j + 1] = (byte)((ct % 32) * 7);
pixels[i * imageSize * 3 + j + 2] = (byte)((ct % 128) * 2);
}
}//end for
//Create the bitmap
BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width);
我知道我没有正确设置像素数组。有什么想法吗?
答案 0 :(得分:3)
“值不在预期范围内”是当WIC函数(WPF映像功能的本机API)返回HRESULT.Check
时WINCODEC_ERR_INVALIDPARAMETER
抛出的ArgumentException消息。
在这种情况下,问题是BitmapSource.Create
的最终参数应该是位图的“步幅”(不是宽度)。位图的“步幅”是存储位图的每一行所需的(整数)字节数。根据{{3}},计算步幅的通用公式为stride = (width * bitsPerPixel + 7) / 8;
。对于24bpp位图,这简化为width * 3
。
要防止异常,请传入正确的步幅值:
BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width * 3);
答案 1 :(得分:1)
以下是我在使用Bitmaps时使用的一些代码...
private const int cRedOffset = 0;
private const int cGreenOffset = 1;
private const int cBlueOffset = 2;
private const int cAlphaOffset = 3;
var width = bmp.Width;
var height = bmp.Height;
var data = bmp.LockBits(Rectangle.FromLTRB(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
var stride = data.Stride;
var pixels = new byte[height * stride];
Marshal.Copy(data.Scan0, pixels, 0, height * stride);
for (var row = 0; row < height; row++)
{
for (var col = 0; col < width; col++)
{
var pixel = (row * stride) + (col * 4);
var red = pixels[pixel + cRedOffset];
var green = pixels[pixel + cGreenOffset];
var blue = pixels[pixel + cBlueOffset];
var alpha = pixels[pixel + cAlphaOffset];
}
}