我有一系列元素[(12, 34); (56, 78); ...]
,我希望将其转换为[(XXX, XXX, XXX); (XXX, XXX, XXX); ...]
,其中(XXX, XXX, XXX)
是给定元组/坐标的(R,G,B),例如, (12, 34)
。根据.NET文档,System.Drawing.Bitmap.GetPixel
返回System.Drawing.Color
,您只需致电Color.R
,Color.B
和Color.G
即可将颜色值设为byte
}。
这是我到目前为止所得到的:
let neighbourColor (img : System.Drawing.Bitmap) (s : seq<int * int>) =
s |> Seq.collect(fun e -> s |> img.GetPixel(fst(e), snd(e)) |> Seq.map(fun c -> (c.R, c.G, c.B)))
对于序列e
中的每个元素s
,获取e的颜色,它是图像img
上的坐标元组,然后将其传递给Seq.map
进行转换进入(红色,绿色,蓝色)并将其作为新序列neighbourColor
收集。
基本上我想将seq<int*int>
变成seq<byte*byte*byte>
。
答案 0 :(得分:2)
let neighbourColor (img:Bitmap) coords =
coords |> Seq.map (fun (x, y) -> let c = img.GetPixel (x, y) in c.R, c.G, c.B)
一般情况下,只有在无法推断时才明确指定参数类型可能是更好的风格(在这种情况下,coords
已被隐含地理解为seq<int*int>
)。
答案 1 :(得分:1)
let (|RGB|) (c:Color)=RGB(c.R,c.G,c.B)
let Test (img:Bitmap)=Seq.map (img.GetPixel>>function RGB(r,g,b)->r,g,b)