我有一个3D字节[,,]数组(i,x,y),里面有 i = B / G / R 和 x = x坐标和 y = y坐标。例如。 i = 2 x = 100 y = 200,像素的红色分量(100,200)或i = 0 x = 100 y = 200,像素的蓝色分量(100,200)是的我知道RGB的顺序相反。
现在,我不确定如何将此字节[,,]转换为图像。我看过http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx。如果我使用SetPixel(),它会非常慢吗?如何避免使用SetPixel()?我尝试使用BitLock方法,避免使用GetPixel()或SetPixel(),我还有哪些替代方法可以做同样的事情?但速度更快。
let greyscale (byteArray: byte[,,]) =
let file = new Bitmap("cat.jpg")
for j = 0 to file.Height - 1 do
for i = 0 to file.Width - 1 do
let p = Color.FromArgb(int byteArray.[2, i, j], int byteArray.[1, i, j], int byteArray.[0, i, j])
file.SetPixel(i, j, Color.FromArgb(greyValue p, greyValue p, greyValue p)) //greyValue returns average of RGB
file.Save("cat.jpg")
greyscale thisis3darray
答案 0 :(得分:1)
您需要位图构造函数(Int32, Int32, Int32, PixelFormat, IntPtr)
(文档here)。您必须将byteArray
转换为匹配格式。
回顾previous question,如果直接操纵该问题的values
数组而不是构建中间Array3D
,则可能会更容易。