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