在C#中遇到BitmapSource对象有问题

时间:2010-12-10 07:01:25

标签: c# image bitmap size pixels

我正在尝试操作一个图像,当涉及到位图和图像时,我对我的问题和代码感到很陌生。我正在初始化一个字节数组来保存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);

我知道我没有正确设置像素数组。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

“值不在预期范围内”是当WIC函数(WPF映像功能的本机API)返回HRESULT.CheckWINCODEC_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];
    }
}