Y坐标在循环中超出范围

时间:2009-07-28 08:22:56

标签: c# .net image-processing

我正在构建和保存位图,我有一个循环,将位图中的像素设置为正确的值。但是,在一段时间后,它会在代码中的注明点处出现IndexOutOfRange异常而崩溃。

    //data is an array of bytes of size (image width * image height) * 2;
    Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    for (int i = 0; i < data.Length; i += 2)
    {
        int luminance = ((int)data[i] << 8) | (int)data[i + 1];
        Color c = Color.FromArgb(luminance,luminance,luminance,luminance);

        int x = i / 2;
        int y = x / width;
        x %= width;
        b.SetPixel(x, y, c);//crashes here when Y is at 513, should only go to 512
    }
    b.Save(Path.GetFileNameWithoutExtension(fileName) + ".bmp");

我很难过为什么会这样。为什么会发生这种情况,我该如何解决呢?

(所有那些重新推荐不安全代码的说明:我正在寻找一个工作程序,然后是一个快速的程序。当我开始时,我肯定会写下关于这个主题的3个问题!;))

2 个答案:

答案 0 :(得分:1)

当长度为奇数时,则在某个时刻i + 1 ==长度为真。

for (int i = 0; i < data.Length; i += 2)
{
   int luminance = ((int)data[i] << 8) | (int)data[i + 1];

   int x = (i + 1) / 2;
}

我建议更换

//data is an array of bytes of size (image width * image height) * 2;

System.Diagnostics.Debug.Assert(data.Length == width * height * 2);
System.Diagnostics.Debug.Assert((data.Length % 2) == 0);

答案 1 :(得分:0)

如果不知道data实际上是什么,很难说出可能出现的问题。我怀疑它可能被组织成类似位图的行,但有时位图格式数据要求行的长度为4个字节的倍数(最后使用未使用的填充,请参阅BMP file format)。如果是这种情况,您的y值可能会超出预期。您可能需要考虑这样的填充。