如何生成随机的“绿色”颜色
有没有人有什么建议,怎么生成一些随机的绿色调颜色?现在我生成颜色的方法是这样的:
color = (randint(100, 200), randint(120, 255), randint(100, 200))
这个方法大体上是有效的,但我经常得到一些棕色的颜色。
9 个回答
16
看看这个叫做 colorsys
的模块:
http://docs.python.org/library/colorsys.html
可以使用 HSL 或 HSV 这种颜色空间。先把颜色的色调调到接近绿色,然后饱和度和亮度就随便选一些随机的值。
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模块。你可以用colorsys.hsv_to_rgb来替代上面的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)