2009-07-28 62 views
0

我正在构建和保存位图,并且我有一个循环将位图中的像素设置为其正确的值。但是,它会在代码中指定的点出现IndexOutOfRange异常之后的短时间内崩溃。Y坐标在循环中超出范围

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

我很沮丧,为什么会发生这种情况。为什么会发生这种情况,我该如何解决?

(记OT所有那些reommend不安全的代码:我要一个工作程序,然后一快一我一定会写了,当我开始被检者3点的问题;!))

+2

请添加一行你进入循环之前打印出来data.Length,宽度和高度替代

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

,并修改问题与这些价值观。我怀疑他们不是你期望他们的。 – 2009-07-28 08:29:56

+0

请注意,“i + 1”是不必要的,顺便说一句 - 我将永远是平均的,因此在将其除以二之前加上一个就不会改变结果。 – 2009-07-28 08:31:35

回答

0

不知道你的data究竟是什么,很难说出什么可能是错误的。我怀疑它可能像位图一样组织成行,但有时位图格式数据要求行的长度是4个字节的倍数(末尾有未使用的填充,请参阅BMP file format)。如果是这种情况,您的y值可能会变得比您预期的要大。您可能需要考虑这种填充。

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

我建议用

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