2014-01-04 1 views
0

У меня есть следующий код для копирования содержимого байтового массива в массив структур. Однако, когда я его использую, я получаю «Исключительное исключение из диапазона». Что не так?Почему я получаю исключение индекса из диапазона при копировании массива Byte в массив Struct?

public struct pix 
{ 
    public byte b; 
    public byte g; 
    public byte r; 
}; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static byte[] bmp = File.ReadAllBytes("D:\\x.bmp"); 
     static pix[,] img; 
     static void Main(string[] args) 
     { 
      int wi = 320; 
      int hi = 240; 
      int i=54; 
      img = new pix[wi-1, hi-1]; 

      Console.Write(bmp.Length-54); 

      for (int y = hi-1; y > 0; y--) 
      { 
       for (int x = wi-1; x > 0; x--) 
       { 
        img[x,y].b = bmp[i]; 
        img[x,y].g = bmp[i + 1]; 
        img[x,y].r = bmp[i + 2]; 

        i = i + 3; 
       }  
      } 

    } 
} 
+0

bmp [i + 1]; - Где _i_? –

+1

@Digital_Reality После 'int hi' в той же строке – user1781290

+1

Когда вы отлаживаете код на какой строке возникает исключение? – melodiouscode

ответ

0

Похоже у вас есть проблемы со значением i

Ваш цикл на самом деле, уменьшается от 320/240 и каждый раз, когда вы возрастать после I на 3! которые начинаются с 54, так похоже, что скоро выйдет из грани IMG

for (int y = hi-1; y > 0; y--) 
{ 
    for (int x = wi-1; x > 0; x--) 
    { 
     i = i + 3; 
    }  
} 

Кроме того, изменение распределения IMG ниже.

img = new pix[wi, hi]; 
+0

Он, кажется, читает растровое изображение, поэтому 'i' вряд ли выйдет за рамки, я думаю – user1781290

0

Вы создаете массив с длинами wi - 1 и hi - 1

img = new pix[wi-1, hi-1]; 

Действительно индексы в этом массиве 0 - wi-2 и 0 - hi-2 соответственно.

Затем вы начинаете свой цикл с wi-1 и hi-1, таким образом, получая доступ к массиву только за пределами его границ. Вероятно, вы просто хотите изменить распределение массива на new pix[wi, hi]