将像素序列映射到它们的颜色

时间:2014-04-03 23:45:16

标签: f# f#-interactive f#-3.0

我有一系列元素[(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.RColor.BColor.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>

2 个答案:

答案 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)