任何人都对如何制作绿色的随机颜色有任何建议吗?现在我正在生成颜色:
color = (randint(100, 200), randint(120, 255), randint(100, 200))
这大部分都有效,但我的颜色变成棕色。
答案 0 :(得分:54)
简单解决方案:使用HSL or HSV颜色空间而不是rgb(如果需要,请将其转换为RGB)。不同之处在于元组的含义:其中RGB表示红色,绿色和蓝色的值,在HSL中,H是颜色(例如120度或0.33表示绿色),S表示饱和度,V表示亮度。因此,将H保持在固定值(或者对于更随机的颜色,您可以通过添加/子化一个小的随机数随机化它)并随机化S和V.请参阅wikipedia文章。
答案 1 :(得分:21)
正如其他人所建议的那样,在HSV色彩空间(或HSL,差异与此无关),生成随机颜色要容易得多。
因此,生成随机“绿色”颜色的代码和(出于演示目的)将它们显示为一系列简单的彩色HTML范围标记:
#!/usr/bin/env python2.5
"""Random green colour generator, written by dbr, for
http://stackoverflow.com/questions/1586147/how-to-generate-random-greenish-colors
"""
def hsv_to_rgb(h, s, v):
"""Converts HSV value to RGB values
Hue is in range 0-359 (degrees), value/saturation are in range 0-1 (float)
Direct implementation of:
http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_HSV_to_RGB
"""
h, s, v = [float(x) for x in (h, s, v)]
hi = (h / 60) % 6
hi = int(round(hi))
f = (h / 60) - (h / 60)
p = v * (1 - s)
q = v * (1 - f * s)
t = v * (1 - (1 - f) * s)
if hi == 0:
return v, t, p
elif hi == 1:
return q, v, p
elif hi == 2:
return p, v, t
elif hi == 3:
return p, q, v
elif hi == 4:
return t, p, v
elif hi == 5:
return v, p, q
def test():
"""Check examples on..
http://en.wikipedia.org/wiki/HSL_and_HSV#Examples
..work correctly
"""
def verify(got, expected):
if got != expected:
raise AssertionError("Got %s, expected %s" % (got, expected))
verify(hsv_to_rgb(0, 1, 1), (1, 0, 0))
verify(hsv_to_rgb(120, 0.5, 1.0), (0.5, 1, 0.5))
verify(hsv_to_rgb(240, 1, 0.5), (0, 0, 0.5))
def main():
"""Generate 50 random RGB colours, and create some simple coloured HTML
span tags to verify them.
"""
test() # Run simple test suite
from random import randint, uniform
for i in range(50):
# Tweak these values to change colours/variance
h = randint(90, 140) # Select random green'ish hue from hue wheel
s = uniform(0.2, 1)
v = uniform(0.3, 1)
r, g, b = hsv_to_rgb(h, s, v)
# Convert to 0-1 range for HTML output
r, g, b = [x*255 for x in (r, g, b)]
print "<span style='background:rgb(%i, %i, %i)'> </span>" % (r, g, b)
if __name__ == '__main__':
main()
输出(在网络浏览器中查看时)应该看起来像:
编辑:我不知道colorsys模块。除了上面的hsv_to_rgb
函数,您可以使用colorsys.hsv_to_rgb,这会使代码更短(它不是替代品,因为我的hsv_to_rgb
函数期望色调在度而不是0-1):
#!/usr/bin/env python2.5
from colorsys import hsv_to_rgb
from random import randint, uniform
for x in range(50):
h = uniform(0.25, 0.38) # Select random green'ish hue from hue wheel
s = uniform(0.2, 1)
v = uniform(0.3, 1)
r, g, b = hsv_to_rgb(h, s, v)
# Convert to 0-1 range for HTML output
r, g, b = [x*255 for x in (r, g, b)]
print "<span style='background:rgb(%i, %i, %i)'> </span>" % (r, g, b)
答案 2 :(得分:16)
查看colorsys
模块:
http://docs.python.org/library/colorsys.html
使用HSL或HSV色彩空间。将色调随机化为接近绿色,然后选择完全随机的饱和度和V(亮度)。
答案 3 :(得分:9)
如果你坚持使用RGB,你基本上只需要确保G值大于R和B,并尝试保持蓝色和红色值相似,这样色调就不会太疯狂。从Slaks扩展,也许就像(我几乎不知道Python):
greenval = randint(100, 255)
redval = randint(20,(greenval - 60))
blueval = randint((redval - 20), (redval + 20))
color = (redval, greenval, blueval)
答案 4 :(得分:5)
因此,在这种情况下,您很幸运能够想要对原色进行变换,但对于像这样的艺术用途,最好指定色轮坐标而不是原色。
您可能需要colorsys
模块中的内容,例如:
colorsys.hsv_to_rgb(h, s, v)
Convert the color from HSV coordinates to RGB coordinates.
答案 5 :(得分:3)
具有HSx色彩空间的解决方案非常好。但是,如果你需要一些非常简单的东西并且没有关于颜色分布的具体要求(如均匀性),那么简单的基于RGB的解决方案就是确保G值大于R和B
rr = randint(100, 200)
rb = randint(100, 200)
rg = randint(max(rr, rb) + 1, 255)
这会给你“绿色”的颜色。其中一些将是如此轻微的绿色。您可以通过增加(绝对或相对)上一次randint
调用的下限来增加保证的绿色程度。
答案 6 :(得分:1)
您想要的是HSL而不是RGB。您可以找到一系列满足“绿色”的色调,并从中选择随机色调。您也可以选择随机饱和度和亮度,但您可能希望将饱和度保持在1附近,将亮度保持在0.5左右,但您可以使用它们。
下面是一些将HSL转换为RGB的动作脚本代码。我有一段时间没有碰过python,或者它发布了python版本。
我发现绿色是0.47 * PI到0.8 * PI。
/**
@param h hue [0, 2PI]
@param s saturation [0,1]
@param l lightness [0,1]
@return object {r,g,b} {[0,1],[0,1][0,1]}
*/
public function hslToRGB(h:Number, s:Number, l:Number):Color
{
var q:Number = (l<0.5)?l*(1+s):l+s-l*s;
var p:Number = 2*l-q;
var h_k:Number = h/(Math.PI*2);
var t_r:Number = h_k+1/3;
var t_g:Number = h_k;
var t_b:Number = h_k-1/3;
if (t_r < 0) ++t_r; else if (t_r > 1) --t_r;
if (t_g < 0) ++t_g; else if (t_g > 1) --t_g;
if (t_b < 0) ++t_b; else if (t_b > 1) --t_b;
var c:Color = new Color();
if (t_r < 1/6) c.r = p+((q-p)*6*t_r);
else if (t_r < 1/2) c.r = q;
else if (t_r < 2/3) c.r = p+((q-p)*6*(2/3-t_r));
else c.r = p;
if (t_g < 1/6) c.g = p+((q-p)*6*t_g);
else if (t_g < 1/2) c.g = q;
else if (t_g < 2/3) c.g = p+((q-p)*6*(2/3-t_g));
else c.g = p;
if (t_b < 1/6) c.b = p+((q-p)*6*t_b);
else if (t_b < 1/2) c.b = q;
else if (t_b < 2/3) c.b = p+((q-p)*6*(2/3-t_b));
else c.b = p;
return c;
}
答案 7 :(得分:0)
最简单的方法是确保红色和蓝色组件相同,如下所示:(原谅我的Python)
rb = randint(100, 200)
color = (rb, randint(120, 255), rb)
答案 8 :(得分:0)
我会接受其他人提到的HSV方法。另一种方法是获得一张漂亮的高分辨率照片,其中包含绿色部分,裁剪非绿色部分,并使用PIL从中选择随机像素。