Ruby,生成一个随机的十六进制颜色(只有浅色)

4

我知道这可能是一个重复的问题。 Ruby, 生成随机十六进制颜色

我的问题略有不同。 我需要知道如何仅生成随机十六进制浅色,而不是深色。


3
你如何区分深色和浅色之间的界限? - Jonas Elfström
1
@Jonas 这对解决方案有什么影响吗? - Alin Purcaru
2
就像@Alin在下面写的那样,这取决于您如何定义浅色。也许它是r、g、b的总和应至少为0xff,其中一个至少为0x80,也许是其他什么东西。 - Jonas Elfström
1
@Jonas Elfström,您将浅色定义为 L(亮度)> 0.5。因此,亮度有一个官方定义,但它与 RGB 没有直接关系。 - Alin Purcaru
@Jonas 看起来你找到了一个重复项 :) - Alin Purcaru
显示剩余5条评论
6个回答

7

在这个帖子中,颜色亮度的计算公式为

(0.2126*r) + (0.7152*g) + (0.0722*b)

相同的亮度公式在维基百科中给出(取自这篇文章)。它反映了人类的感知,其中绿色是最“强烈”的颜色,而蓝色是最不强烈的颜色。
因此,您可以选择r、g、b,直到亮度值超过明亮之间的分界线(255到0)。例如:
lum, ary = 0, []
while lum < 128
 ary = (1..3).collect {rand(256)}
 lum = ary[0]*0.2126 + ary[1]*0.7152 + ary[2]*0.0722
end

另一篇文章提到亮度是由r、g和b的算术平均值得出的。请注意,亮度更加主观,因为在不同的环境下,给定的目标亮度可能会引起不同的亮度感知(特别是周围的颜色会影响您的感知)。

总之,这取决于您认为哪些颜色是“浅色”的。


1
那么,你想说#FF0000不是浅色吗?或者#FF7777呢?我认为RGB模型不适合这个问题。 - Alin Purcaru
1
@Alin 你说得对。这就是为什么答案以“取决于你如何定义轻量级”开头的原因。我希望现在它更有意义,更精确了一些。 - Miki
你的答案现在已经“足够接近”了。你可能想要添加一些链接到使用该公式定义“轻量级”的(原始)来源。 - Alin Purcaru

3

一些提示:

使用HSL并随机生成各个值,但保持L在您选择的区间内。然后,如果需要,转换为RGB

这比生成所有组件均大于某个值(比如0x7f)的RGB要困难一些,但如果您想要颜色均匀分布,那么这是正确的方法。


2

--我发现在128到256之间可以得到较浅的颜色

    Dim rand As New Random
    Dim col As Color
    col = Color.FromArgb(rand.Next(128, 256), rand.Next(128, 256), rand.Next(128, 256))

1

我修改了链接问题中的一个答案(Daniel Spiewak的答案),得到了一个在排除较暗颜色方面相当灵活的解决方案:

floor = 22 # meaning darkest possible color is #222222
r = (rand(256-floor) + floor).to_s 16
g = (rand(256-floor) + floor).to_s 16
b = (rand(256-floor) + floor).to_s 16

[r,g,b].map {|h| h.rjust 2, '0'}.join

你可以更改“floor”的值以适应你的需求。较高的值将限制输出为较浅的颜色,而较低的值将允许更深的颜色。

非常易于使用。我将地板修改为150,以确保所有颜色都能作为黑色文本的背景看起来很好。 - E L Rayle

1

所有颜色的r、g、b值均大于0x7f

color = (0..2).map{"%0x" % (rand * 0x80 + 0x80)}.join

它显示了八个字符(字母数字)。但是,十六进制颜色只有六个,对吧?irb(main):001:0> color = (0..3).map{"%0x" % (rand * 0x80 + 0x7f)}.join => "e1ad8f97" irb(main):002:0> color = (0..3).map{"%0x" % (rand * 0x80 + 0x7f)}.join => "d28cf5fe" irb(main):003:0> - Mr. Black

0
一个非常好的解决方案由color-generator gem提供,您可以调用:
ColorGenerator.new(saturation: 0.75, lightness: 0.5).create_hex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接