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