我正在使用 gtk2hs 在 Haskell 中工作,遇到了一个我找不到答案的问题。
我正在编写一个非常简单的程序:它采用一个颜色值(或多个颜色值),然后将一个函数应用于它们。它可以做一些事情,比如补色、一组颜色的平均值等等。我已经在 Glade 中完成了界面的整合,并阅读了一些关于使用 gtk2hs 的简单教程;到目前为止一切正常,当我运行我的程序时,我的界面就会出现。
但是,我的问题在于ColorSelection
小部件。当我从中获得我的值时,它给出的值是类型Color Word16 Word16 Word16
,其中每个Word16
介于 0 和 65535 之间。我想要做的是将它String
理想地转换为十六进制三元组(作为 a ),或者我可以转换成十六进制三元组。到目前为止,我发现这似乎与颜色存储为 rrrrggggbbbb 而不是 HTML 样式的 rrggbb 这一事实有关。我发现了什么,使用这段代码:
colorToHex (Color a b c)
= (showHex a "") ++ " " ++ (showHex b "") ++ " " ++ (showHex c "")
就是这样,虽然大多数时候它是准确的,但在使用颜色选择器工具时,我可以输入一种看起来与输出不同的颜色。例如,使用颜色选择器,我选择了#A9D06E
- 但是,我的函数返回了"aa11 d12d 6e41"
. 虽然相当接近,但我无法计算出这种关系 - 在这个例子中,红色通道的四舍五入是如何工作的?另外,如果我#A9D06E
直接输入十六进制值,我会得到"a9a9 d0d0 6e6e"
.
我曾尝试使用 Hoogle 找到一个将 a 转换Colour
为 aString
或 a的函数Colour
,并在 Hackage 上搜索 Gtk 包的文档,但没有找到任何可以满足我要求的东西。我也搜索了互联网,找不到太多关于处理Colour
类型的信息。我确实找到了一个功能来做我想要的,位于底部。但是,这有同样的问题,因为它不会给出与颜色选择器本身为特定选择给出的值相同的值。
更新 1
我也尝试过位移值。移位 8 位几乎总是给出正确的值,但是,根据我尝试过的其他事情,每隔一段时间就会稍微偏离。