【问题标题】:RGB value to HSL converterRGB 值到 HSL 转换器
【发布时间】:2011-03-29 04:10:12
【问题描述】:

Google maps api v3 允许将“样式”应用于地图,包括设置各种特征的颜色。但是,它使用的颜色格式是 HSL(或看起来像的):

  • 色调(RGB 十六进制字符串)
  • 亮度(-100 到 100 之间的浮点值)
  • 饱和度(-100 到 100 之间的浮点值)

(来自docs

我设法在网上找到了 RGB 到 HSL 转换器,但我不确定如何以谷歌地图接受的方式指定转换后的值。例如,转换器给出的典型 HSL 值是:209° 72% 49%

该 HSL 值如何映射到我从 google maps api 指定的参数?即色调度值如何映射到 RGB 十六进制字符串,百分比如何映射到 -100 到 100 之间的浮点值?

我仍然不确定如何进行转换。我需要,给定一个 RGB 值,快速将其转换为谷歌地图期望的颜色,以便颜色相同......

【问题讨论】:

    标签: android google-maps-api-3 rgb hsl


    【解决方案1】:

    由于 hue 参数需要 RGB,因此您可以使用原始颜色作为色调。

    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:])
    

    例子:

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

    结果:

    下面是一个屏幕截图,显示设置为 rgb 背景颜色的主体(在本例中为 #2800E2),以及具有样式道路几何图形的谷歌地图,使用如上计算的值('0x2800E2', 100, -11) .

    很明显,谷歌使用您的样式创建了以给定颜色为中心的大约六种不同颜色,轮廓最接近输入。我相信这是最接近的。


    来自实验:http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html

    对于水,gmaps 减去 0.5 的 gamma。要获得您想要的确切颜色,请使用上面的计算,然后将 0.5 伽马加回去。

    喜欢:

    {
      featureType: "water",
      elementType: "geometry",
      stylers: [
        { hue: "#2800e2" },
        { saturation: 100 },
        { lightness: -11 },
        { gamma: 0.5 },
      ]
    }
    

    【讨论】:

    • 这不太奏效。查看脚本中的注释,您似乎假设 gmaps 需要一个 0-100 之间的值。实际上,gmaps 想要一个从 -100 到 100 的值。也许你可以相应地修改它?谢谢你的帮助!!
    • hmm..我尝试通过添加(在返回 L 和 S 之前)将您的解决方案缩放到 -100 到 100 之间的值:S=2*S-100 和 L=2*L- 100,但仍然没有出现正确的颜色...可能是公式错误..
    • @aeq:我已经修改并根据您的描述更新了示例。
    • hmm..您的修改与我在评论中提到的几乎相同。转换后的值显示在地图上,非常接近原始 RGB 值。但它仍然有点偏离。例如,#2800E2 显示为略带紫色......我想知道为什么它仍然关闭
    • 有趣。我实际上是在尝试在地图上设置水的颜色,因此实际上并没有轮廓或边框的概念。奇怪的是他们这样做...谢谢
    【解决方案2】:

    我们编写了一个您想要的工具。它采用十六进制 RGB 值并生成所需的 HSL 代码。它带有预览和 Google Map JavaScript API V3 代码输出。享受;D

    http://googlemapscolorizr.stadtwerk.org/

    【讨论】:

    • 你们,这是最好的答案!! ICH LIEBE EUCH,STADT.WERK!!!我花了整整一个小时试图使接受的答案中的脚本工作,它从来没有,这个在第一次尝试时工作。
    【解决方案3】:

    来自链接页面:

    注意:虽然 hue 采用 HTML 十六进制颜色值,但它仅使用该值来确定基本颜色(它围绕色轮的方向),而不是饱和度或亮度,它们分别以百分比变化表示。例如,纯绿色的色调可以在色调属性中定义为“#00ff00”或“#000100”,并且两种色调将相同。 (在 HSL 颜色模型中,这两个值都指向纯绿色。) RGB 色调值由相等的红色、绿色和蓝色部分组成——例如“#000000”(黑色)和“#FFFFFF”(白色)以及所有纯色灰色 - 不表示任何色调,因为这些值都没有表示 HSL 坐标空间中的方向。要指示黑色、白色或灰色,您必须移除所有饱和度(将值设置为 -100)并改为调整亮度。

    至少在我阅读时,这意味着您需要根据色轮转换角度。例如,假设 0 度是纯红色,120 度是纯蓝色,240 度是纯绿色。然后,您将采取您的角度,找出它位于哪两个原色之间,并进行插值以确定每个原色的使用量。从理论上讲,您可能应该使用二次插值 - 但很有可能您可以使用线性插值。

    使用它,90 度(例如)是从红色到蓝色的 90/120 = 3/4ths,因此色调的十六进制数将为 0x00010003 - 或任何其他将绿色设置为 0 且红色和蓝色比例为 1:3 的数字。

    【讨论】:

    • 如果使用 RGB 到 HSL 转换器来计算角度,那么已经有 RGB 值... RGB 值可以被十六进制并作为 H 值原样发送,并且那么只需将转换器用于 S,L。还是我误解了。
    • 我有一个相关的设计问题。如果需要 HSL 颜色的系统接受一个 RGB 值作为 H,那么到底为什么它需要一个 S 和一个 L 来搭配......看起来如果它要进行色彩空间转换来计算 H,它可能也只使用指定的颜色或者以这种方式使用 HSL 是否提供了 RGB 空间中缺少的东西?
    • @Andrew:至于直接使用 RGB 值,也许——但也许不是。特别是,我很确定它确实希望至少有一个组件被设置为 0,而原始 RGB 颜色通常不会出现这种情况。
    • 我怀疑他们使用 HSL 来实现(一定程度的)设备独立性。 RGB 值(本身)基本上参考给定设备产生的颜色,因此 0,0,0 表示它可以产生的最暗的黑色,而 255,255,255 表示它可以产生的最亮的白色——但是(例如)那些显示器和打印机之间会有很大差异(即使在同一台打印机上也会因您送入的纸张而异)。 HSL 值更容易引用一些“中性”颜色空间(CIE XYZ 对此更好,但更难以可视化、解释或转换为/从 RGB)。
    【解决方案4】:

    我需要完全匹配颜色。所以我使用了@stadt.werk 提供的工具(http://googlemapscolorizr.stadtwerk.org/)来接近。

    但后来我遇到了@bukzor 解释的问题,其中 Google Maps API 会在您的阴影上创建变化,这些变化似乎都不是我指定的。

    所以我在浏览器中调出地图,截取了两个阴影不太匹配的区域的屏幕截图,在图像编辑器(在我的例子中是 pixlr.com)中打开它,使用吸色工具来获取阴影的饱和度和亮度,将我在 Google API 调用中的饱和度和/或亮度调整为 1,然后重复,直到我得到看起来完美匹配的东西。

    当然,Google Maps API 可能会对不同设备/浏览器/等上的颜色做不同的事情,但到目前为止,一切都很好。

    乏味,是的,但它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 2011-01-22
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2012-11-04
      相关资源
      最近更新 更多