我正在构建和保存位图,我有一个循环,将位图中的像素设置为正确的值。但是,在一段时间后,它会在代码中的注明点处出现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个问题!;))
答案 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
值可能会超出预期。您可能需要考虑这样的填充。