отображать три массива байтов в поле изображения

У меня есть три массива байтов, хранящиеся в трех цветах (красный, зеленый, синий), как я могу отобразить этот массив в поле изображения в С#, а тип файла - растровый файл для изображения

byte[,] R=new byte[width, height];
byte[,] G=new byte[width, height];
byte[,] B=new byte[width, height];

эти три массива не пусты, в каждом массиве хранятся данные.


person user3147794    schedule 07.01.2014    source источник


Ответы (2)


Ты имеешь в виду:

Bitmap bmp = new Bitmap(width,height);
for(int i=0;i<width;i++)
for(int j=0;j<height;j++) {
    SetPixel(i,j,Color.FromArgb(R[i,j],G[i,j],B[i,j]));
}
picturebox.image=bmp;
person Alexander    schedule 07.01.2014

Вам нужно построить однобайтовый массив из данных, что будет не очень быстро, так как вам нужно чередовать данные. В принципе, вы бы сделали что-то вроде этого:

var bytes= new byte[width * height * 4];

for (var x = 0; x < width; x++)
  for (var y = 0; y < height; y ++)
  {
    bytes[(x + y * width) * 4 + 1] = R[x, y];
    bytes[(x + y * width) * 4 + 2] = G[x, y];
    bytes[(x + y * width) * 4 + 3] = B[x, y];
  }

Затем вы можете использовать массив байтов для создания растрового изображения, например:

var bmp = new Bitmap(width, height);

var data = bmp.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)

Marshal.Copy(bytes, 0, data.Scan0, width * height * 4);

bmp.UnlockBits(data);

Обратите внимание, что вы должны убедиться, что bmp.UnlockBits всегда вызывается, поэтому вам, вероятно, следует поместить его в блок finally.

Это не обязательно лучший или самый быстрый способ, но в любом случае это зависит от ваших потребностей :)

Если вы действительно стремитесь к самому быстрому пути, вы, вероятно, будете использовать небезопасный код (не потому, что он быстрее сам по себе, а потому, что растровое изображение .NET не управляется изначально — это управляемая оболочка для неуправляемого растрового изображения). Вы выделяете память для массива байтов в неуправляемой куче, затем заполняете данные и создаете растровое изображение с помощью конструктора, который принимает IntPtr scan0 в качестве параметра. Если все сделано правильно, это должно избежать ненужных проверок границ массива, а также ненужного копирования.

person Luaan    schedule 07.01.2014