RGB value to HSL converter

前端 未结 4 1906
余生分开走
余生分开走 2021-01-12 04:12

Google maps api v3 allows \"styles\" to be applied to the map, including setting the color of various features. However, the color format it uses is HSL (or what seems like

相关标签:
4条回答
  • 2021-01-12 04:31

    From the linked page:

    Note: while hue takes an HTML hex color value, it only uses this value to determine the basic color (its orientation around the color wheel), not its saturation or lightness, which are indicated separately as percentage changes. For example, the hue for pure green may be defined as "#00ff00" or "#000100" within the hue property and both hues will be identical. (Both values point to pure green in the HSL color model.) RGB hue values which consist of equal parts Red, Green and Blue — such as "#000000" (black) and "#FFFFFF" (white) and all the pure shades of grey — do not indicate a hue whatsoever, as none of those values indicate an orientation in the HSL coordinate space. To indicate black, white or grey, you must remove all saturation (set the value to -100) and adjust lightness instead.

    At least as I read it, that means you need to convert your angle based on a color wheel. For example, let's assume 0 degrees is pure red, 120 degrees is pure blue and 240 degrees is pure green. You'd then take your angle, figure out which two primaries it falls between, and interpolate to determine how much of each primary to use. In theory you should probably use a quadratic interpolation -- but chances are that you can get by reasonably well with linear.

    Using that, 90 degrees (for example) is 90/120 = 3/4ths of the way from red to blue, so your hex number for the hue would be 0x00010003 -- or any other number that had green set to 0, and a 1:3 ratio between red and blue.

    0 讨论(0)
  • 2021-01-12 04:31

    I needed to match colors exactly. So I used the tool that @stadt.werk offers (http://googlemapscolorizr.stadtwerk.org/) to get close.

    But then I ran into the problem explained by @bukzor where the Google Maps API creates variations on your shade, none of which seem to be exactly what I specified.

    So I pulled up the map in a browser, took a screenshot of just the area with the two shades that weren't quite matching, opened it up in an image editor (pixlr.com, in my case), used the color-sucker tool to get the saturation and lightness for the shade, adjusted my saturation and/or lightness in the Google API call by 1, and repeated until I got something that seems to match perfectly.

    It is possible, of course, that Google Maps API will do different things with the colors on different devices/browsers/etc., but so far, so good.

    Tedious, yes, but it works.

    0 讨论(0)
  • 2021-01-12 04:49

    Since the hue argument expects RGB, you can use the original color as the hue.

    rgb2hsl.py:

    #!/usr/bin/env python
    
    def rgb2hsl(r, g, b):
        #Hue: the RGB string
        H = (r<<16) + (g<<8) + b
        H = "0x%06X" % H
    
        #convert to [0 - 1] range
        r = float(r) / 0xFF
        g = float(g) / 0xFF
        b = float(b) / 0xFF
    
        #http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
        M = max(r,g,b)
        m = min(r,g,b)
        C = M - m
    
        #Lightness
        L = (M + m) / 2
    
        #Saturation (HSL)
        if L == 0:
            S = 0
        elif L <= .5:
            S = C/(2*L)
        else:
            S = C/(2 - 2*L)
    
        #gmaps wants values from -100 to 100
        S = int(round(S * 200 - 100))
        L = int(round(L * 200 - 100))
    
        return (H, S, L)
    
    
    def main(r, g, b):
        r = int(r, base=16)
        g = int(g, base=16)
        b = int(b, base=16)
        print rgb2hsl(r,g,b)
    
    if __name__ == '__main__':
        from sys import argv
        main(*argv[1:])
    

    Example:

    $ ./rgb2hsl.py F0 FF FF
    ('0xF0FFFF', 100, 94)
    

    Result:

    Below is a screenshot showing the body set to a rgb background color (#2800E2 in this case), and a google map with styled road-geometry, using the values calculated as above ('0x2800E2', 100, -11).

    It's pretty clear that google uses your styling to create around six different colors centered on the given color, with the outlines being closest to the input. I believe this is as close as it gets.

    alt text


    From experimentation with: http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html

    For water, gmaps subtracts a gamma of .5. To get the exact color you want, use the calculations above, and add that .5 gamma back.

    like:

    {
      featureType: "water",
      elementType: "geometry",
      stylers: [
        { hue: "#2800e2" },
        { saturation: 100 },
        { lightness: -11 },
        { gamma: 0.5 },
      ]
    }
    
    0 讨论(0)
  • 2021-01-12 04:50

    We coded a tool which exactly does want you want. It takes hexadecimal RGB values and generates the needed HSL code. It comes with a preview and Google Map JavaScript API V3 code output. Enjoy ;D

    http://googlemapscolorizr.stadtwerk.org/

    0 讨论(0)
提交回复
热议问题