如何生成随机的“绿色”颜色

34 投票
9 回答
8817 浏览
提问于 2025-04-15 15:10

有没有人有什么建议,怎么生成一些随机的绿色调颜色?现在我生成颜色的方法是这样的:

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)'>&nbsp;&nbsp;</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)'>&nbsp;&nbsp;</span>" % (r, g, b)
54

简单的解决办法是:使用 HSL 或 HSV 颜色空间,而不是 RGB(如果需要 RGB,可以再转换回来)。它们的区别在于每个值的含义:RGB 是红、绿、蓝的值,而 HSL 中的 H 代表颜色(比如 120 度或 0.33 就表示绿色),S 代表饱和度,V 代表亮度。所以你可以把 H 固定在一个值上(如果想要更随机的颜色,可以加减一个小的随机数),然后随机化 S 和 V。更多信息可以查看 维基百科 的文章。

撰写回答