views:

97

answers:

1

I am working on constructing and saving a bitmap, and i have a loop that sets the pixels in the bitmap to their proper values. However it crashes after a short period of ime with an IndexOutOfRange exception at the noted point in the code.

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

I'm stumped as to why this happens.Why does this happen and how can i fix it?

(a note ot all of those that reommend unsafe code: I am going for a working program then a fast one. I'll be sure to write up 3 questions on the subject when i start! ;) )

A: 

It's hard to tell what might be wrong without knowing what your data actually is. I suspect that it might be organised into rows like a bitmap, but sometimes bitmap format data requires that rows be a multiple of 4 bytes in length (with unused padding at the end, see BMP file format). If this is the case, your y value might become larger than you expect. You may need to take such padding into account.

Greg Hewgill