2014-01-07 3 views
0

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

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

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

ответ

0

Вы имеете в виду:

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; 
0

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

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 Bitmap не natively-managed - это управляемая оболочка для неуправляемого растрового изображения). Вы выделили бы память для байтового массива на неуправляемой куче, затем вы заполнили бы данные и создали растровое изображение, используя конструктор, который принимает параметр IntPtr scan0 в качестве параметра. Если все сделано правильно, оно должно избегать ненужных проверок границ массива, а также ненужного копирования.

Смежные вопросы