Скопировать массив байтов в массив структур в 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.