Haskell三便士Gui:在特定点从画布读取颜色?

Haskell三便士Gui:在特定点从画布读取颜色?,haskell,canvas,threepenny-gui,Haskell,Canvas,Threepenny Gui,有没有办法读取画布特定点的颜色 比如: getColor :: Canvas -> Point -> Color 我在上查看了文档,但找不到任何用于此的函数。也许我只是没看到,因为我用Haskell的时间不长 如果你有任何提示给我,请告诉我 提前多谢了, 克莱姆 编辑:多亏了海因里希·阿普费尔莫斯的回答,我才能够写出一个有效的解决方案,并希望在有人需要相同功能的情况下与大家分享。当然,如果您使用它并进行调整,请随意分享:) 导入合格的Graphics.UI.Threepenny作为

有没有办法读取画布特定点的颜色

比如:

getColor :: Canvas -> Point -> Color
我在上查看了文档,但找不到任何用于此的函数。也许我只是没看到,因为我用Haskell的时间不长

如果你有任何提示给我,请告诉我

提前多谢了, 克莱姆

编辑:多亏了海因里希·阿普费尔莫斯的回答,我才能够写出一个有效的解决方案,并希望在有人需要相同功能的情况下与大家分享。当然,如果您使用它并进行调整,请随意分享:)

导入合格的Graphics.UI.Threepenny作为UI
导入Graphics.UI.Threepenny.Core
导入Codec.Picture.Types
--到UI(像素RGB8)也是可能的,只需在返回后从fst更改为snd即可
getCanvCol::UI.Canvas->UI.Point->UI(UI.Color)
getCanvCol画布(x,y)=do
--str返回带有逗号分隔值的字符串,即“255,0255”
str Bool)->String->[String]
单词当p s=大小写时,p s为
"" -> []
s'->w:p s'时的单词
式中(w,s“”)=断开ps
--获取字符串列表并生成三个整数
lsToRGB::[String]->(Int,Int,Int)
lsToRGB(a:b:c:xs)=(读a,读b,读c)
lsToRGB=(0,0,0)
--根据所需颜色制作三个Int
tripleToCol::(Int,Int,Int)->(UI.Color,PixelRGB8)
三倍色(r,g,b)=((UI.RGB r,b),(像素rgb8 r'g'b'))
其中(r',g',b')=(从积分r,从积分g,从积分b)
(作者在此)

从threepenny-gui-0.5.0.0开始,目前还没有预定义的函数可以实现这一点。但是,您可以使用包含的JavaScript FFI调用返回所需值的JavaScript函数。例如,以下是
drawImage
函数的源代码:

drawImage :: Element -> Vector -> Canvas -> UI ()
drawImage image (x,y) canvas =
    runFunction $ ffi "%1.getContext('2d').drawImage(%2,%3,%4)" canvas image x y

ffi
函数允许您调用任意JavaScript函数。唯一的问题是,您必须将结果封送到类型
Color
;目前,仅支持两种类型作为返回值,如
Int
String
。请查看源代码以获取示例。

非常感谢您的快速回复!我能够让它工作(见上面帖子中的编辑)。虽然它可能并不完美,但现在对我来说已经足够好了:)三便士gui真的很棒,也谢谢你。我很高兴。:-)如果您喜欢,还可以尝试使用
Value
作为封送的返回类型,这是
aeson
库中的JavaScript对象;我认为Graphics.UI.Threepenny.Event模块有一些这样的例子。但是既然你的代码可以工作,就没有必要修改它。
drawImage :: Element -> Vector -> Canvas -> UI ()
drawImage image (x,y) canvas =
    runFunction $ ffi "%1.getContext('2d').drawImage(%2,%3,%4)" canvas image x y