首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将HSL转换为RBG

将HSL转换为RBG
EN

Stack Overflow用户
提问于 2012-02-17 06:37:35
回答 2查看 701关注 0票数 4

我正在尝试使用Data.Colour模块将一些HSL值转换为RBG。Hackage文档说Hue总是在0-360范围内。但是现在有SaturationLightness值的任意范围。它们是在0,100还是在0,1范围内?

我认为第一个变种是正确的,但似乎不是。

代码语言:javascript
复制
λ> hsl 100 50 50
RGB {channelRed = 866.6666666666692, channelGreen = -2400.0, channelBlue = 2500.0}

然后我尝试使用饱和度和亮度的范围0,1。

代码语言:javascript
复制
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ (0,0,0)
RGB {channelRed = 0, channelGreen = 0, channelBlue = 0}
it :: RGB Integer

这就是为什么我开始认为只有Saturation应该是[0,1]中的Double

例如,我们有一些HSL格式的颜色值。

代码语言:javascript
复制
λ> let c = (34.0,0.54,68.0)
c :: (Double, Double, Double)

然后我们将其转换为RGB并截断所有值

代码语言:javascript
复制
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ c
RGB {channelRed = 31, channelGreen = 63, channelBlue = 104}

但正如some online color-converters所说,(31,63,104)::RGB(214,54,26)::HSL

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-17 06:57:40

看起来该软件包对亮度和饱和度都使用范围[0, 1],但请注意,它也对RGB值使用此范围,而不是您似乎假设的[0, 255]。考虑到这一点,我得到了(几乎)期望值:

代码语言:javascript
复制
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
票数 5
EN

Stack Overflow用户

发布于 2012-02-17 06:58:23

所以最后我算出了SaturationLightness的值都应该在0,1的范围内。

代码语言:javascript
复制
λ> fmap (round . (255*)). (\(h,s,l) -> hsl h s l) $ (34.0,0.54,0.68)
RGB {channelRed = 217, channelGreen = 179, channelBlue = 129}
it :: RGB Integer

这是有意义的,因为(217,179,129)::RGB值等于(34,54,68)::HSL

因此,在文档中添加该约束可能会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9320205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档