2

我正在尝试操作图像,当涉及到位图和图像时,我对我的问题和代码非常陌生。我正在初始化一个字节数组来保存 Bgr24 像素数据,这样我就可以将它传递给 BitmapSource 对象。但是我的像素数组不是“我认为”的正确大小。

最后一行代码实际上是我的问题所在,参数“pixels”向我抛出了以下错误“System.ArgumentException was unhandled Value does not fall in the expected range.”

我初始化这些变量

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

我了解我没有正确设置像素阵列。有什么想法吗?

4

2 回答 2

4

“值不在预期范围内”是HRESULT.Check当 WIC 函数(底层 WPF 成像功能的本机 API)返回时引发的 ArgumentException 消息WINCODEC_ERR_INVALIDPARAMETER

在这种情况下,问题在于最终参数BitmapSource.Create应该是位图的“步幅”(而不是宽度)。位图的“步幅”是存储位图每一行所需的(整数)字节数。根据这篇 MSDN 杂志文章,计算步幅的通用公式是stride = (width * bitsPerPixel + 7) / 8;。对于 24bpp 位图,这简化为width * 3.

为防止出现异常,请传入正确的步幅值:

BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width * 3);
于 2010-12-10T08:26:31.780 回答
1

这是我在使用位图时使用的一些代码...

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];
    }
}
于 2010-12-10T07:10:57.020 回答