How to generate random 'greenish' colors

后端 未结 9 2072
鱼传尺愫
鱼传尺愫 2020-12-28 13:31

Anyone have any suggestions on how to make randomized colors that are all greenish? Right now I\'m generating the colors by this:

color = (randint(100, 200),         


        
9条回答
  •  自闭症患者
    2020-12-28 13:48

    As others have suggested, generating random colours is much easier in the HSV colour space (or HSL, the difference is pretty irrelevant for this)

    So, code to generate random "green'ish" colours, and (for demonstration purposes) display them as a series of simple coloured HTML span tags:

    #!/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 "  " % (r, g, b)
    
    if __name__ == '__main__':
        main()
    

    The output (when viewed in a web-browser) should look something along the lines of:

    Example output, showing random green colours

    Edit: I didn't know about the colorsys module. Instead of the above hsv_to_rgb function, you could use colorsys.hsv_to_rgb, which makes the code much shorter (it's not quite a drop-in replacement, as my hsv_to_rgb function expects the hue to be in degrees instead of 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 "  " % (r, g, b)
    

提交回复
热议问题