Скопировать массив байтов в массив структур в C#

Я использую этот код для копирования данных из bmp в массив структур в C#, когда при запуске progrom выдается сообщение "параметр недействителен"

struct pix  //structure for pixel in bmp image
{
   public byte b;//Red
   public byte g;//Green
   public byte r;//Blue
};

private void button1_Click(object sender, EventArgs e)
{
   byte[] bmp = File.ReadAllBytes("D:\\x.bmp");
   Bitmap img = new Bitmap(openFileDialog1.FileName);

   pix[,] bmpdata = new pix[img.Height-1, img.Width-1];  
   Array.Copy(bmp, 54, bmpdata, 0, (bmp.Length)-54);
}

Что не так в программе, есть ли другой метод для копирования, и мне нужно отобразить новый массив в picturebox?

2 ответа

Извините, но вы не можете использовать Array.Copy как это.

Ваш исходный массив byte[] и ваш целевой массив pix[,], Согласно документации (Array.Copy Метод ( Array , Int32 , Array , Int32 , Int32 )) Размеры массивов должны быть одинаковыми.

sourceArray а также destinationArray параметры должны иметь одинаковое количество измерений.

Но даже несмотря на это, вы не могли использовать Array.Copy потому что то, что вы действительно пытаетесь сделать, - это объединять каждые 3 последовательных элемента из byte[] в один в pix[,], К сожалению, это невозможно, используя Array.Copy,

Я могу придумать несколько способов получить массив информации о пикселях, который вы хотите.
Наиболее очевидным было бы что-то вроде

Bitmap img = new Bitmap(openFileDialog1.FileName);
pix[,] bmpdata = new pix[img.Height-1, img.Width-1];
for (x=0;x<img.Width;x++)
for (y=0;y<img.Height;y++)
{
Color c=img.GetPixel(x,y);
pix[x,y].b=c.B;
pix[x,y].r=c.R;
pix[x,y].g=c.G;
}

Вы, однако, не сказали нам, почему вы хотите растровое изображение в этой форме. Поэтому я не могу комментировать, насколько подходящим будет этот код. Есть ли причина, по которой вы не можете просто оставить Bitmap и вызывать GetPixel по мере необходимости?

Я не знаю, насколько велики изображения, которые вы собираетесь разбирать, или какую производительность вам нужно, но я мог бы представить, что вложенный цикл не будет быстрым на большом изображении.
Альтернативой, которую вы могли бы изучить (при необходимости), было бы чтение данных непосредственно из потока в нужный вам формат. Это, однако, требует, чтобы вы понимали формат файла.bmp.

Другие вопросы по тегам