Конвертер значений RGB в HSL

Google maps api v3 позволяет применять к карте «стили», включая настройку цвета различных функций. Однако цветовой формат, который он использует, - HSL (или что-то вроде него):

  • оттенок (шестнадцатеричная строка RGB)
  • легкость (значение с плавающей запятой от -100 до 100)
  • насыщенность (значение с плавающей запятой от -100 до 100)

(из документов)

Мне удалось найти преобразователи RGB в HSL в Интернете, но я не уверен, как указать преобразованные значения таким образом, чтобы карты Google принимали их. Например, типичное значение HSL, данное преобразователем, будет: 209° 72% 49%

Как это значение HSL сопоставляется с параметрами, которые я указал в API карт Google? то есть как значение степени оттенка отображается в шестнадцатеричную строку RGB и как процентное соотношение соответствует значению с плавающей запятой между -100 и 100?

Я все еще не уверен, как выполнить преобразование. Мне нужно, учитывая значение RGB, быстро преобразовать его в то, что ожидает Google Maps, чтобы цвет был идентичным ...


person aeq    schedule 12.08.2010    source источник


Ответы (4)


Поскольку аргумент оттенка ожидает 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), и карту Google со стилизованной геометрией дороги, с использованием значений, рассчитанных, как указано выше ('0x2800E2', 100, -11).

Совершенно ясно, что Google использует ваш стиль для создания около шести разных цветов, сосредоточенных на данном цвете, с контурами, наиболее близкими к входу. Я считаю, что это так близко, насколько это возможно.

alt text


Из экспериментов с: http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html.

Для воды gmaps вычитает гамму 0,5. Чтобы получить точный цвет, который вы хотите, используйте вычисления выше и добавьте эту гамму 0,5 обратно.

нравиться:

{
  featureType: "water",
  elementType: "geometry",
  stylers: [
    { hue: "#2800e2" },
    { saturation: 100 },
    { lightness: -11 },
    { gamma: 0.5 },
  ]
}
person bukzor    schedule 24.08.2010
comment
Это не совсем сработало. Глядя на комментарий в вашем скрипте, похоже, что вы предположили, что gmaps хочет значение от 0 до 100. На самом деле, gmaps хочет значение от -100 до 100. Может быть, вы можете изменить его соответствующим образом? Спасибо за вашу помощь!! - person aeq; 25.08.2010
comment
хм .. я попытался масштабировать ваше решение до значения от -100 до 100, добавив (прямо перед тем, как вы вернете L и S): S = 2 * S-100 и L = 2 * L-100, но правильные цвета все еще не не появляюсь ... может быть, неправильно вывел формулу .. - person aeq; 25.08.2010
comment
@aeq: Я изменил его и обновил пример в соответствии с вашим описанием. - person bukzor; 25.08.2010
comment
хм .. ваша модификация - это почти то же самое, что я упоминал в своем комментарии. Преобразованное значение отображается на карте довольно близко к исходному значению RGB. Но это все еще немного не так. # 2800E2, например, выглядит слегка фиолетовым ... Интересно, почему он все еще не горит? - person aeq; 25.08.2010
comment
Интересно. На самом деле я пытаюсь стилизовать цвет воды на карте, чтобы на самом деле не было концепции контура или границы. Странно, что так делают ... спасибо - person aeq; 25.08.2010
comment
@aeq: Я внес поправку в расчет S. Раньше я использовал формулу HSV. - person bukzor; 25.08.2010
comment
Ваш скрипт правильно вычисляет S и L. Я подтвердил, попробовав онлайн-конвертер rgb в HSL и масштабируя значения от -100 до 100, и я получаю тот же результат, что и ваш скрипт. Так что, возможно, gmaps делают что-то другое со значением H, или они как-то его корректируют ... или, может быть, я просто что-то упускаю - person aeq; 25.08.2010
comment
@aeq: Совершенно очевидно, что Google использует цвета вашего стиля только как основу для темы. Могу поспорить, что они просто стандартным образом сдвигают значения HSL для каждого элемента (вода = H, S-10, L + 10). Вы могли бы перепроектировать сдвиг, чтобы противодействовать ему. - person bukzor; 26.08.2010
comment
@aeq: я предполагаю, что награда просто истекает, если она не известна вручную, а ответ имеет менее двух голосов :( - person bukzor; 01.09.2010

Мы создали инструмент, который вам нужен. Он принимает шестнадцатеричные значения RGB и генерирует необходимый код HSL. Он поставляется с предварительным просмотром и выводом кода Google Map JavaScript API V3. Наслаждайтесь; D

http://googlemapscolorizr.stadtwerk.org/

person stadt.werk    schedule 08.04.2011
comment
РЕБЯТА, это лучший ответ !! ICH LIEBE EUCH, STADT.WERK !!! Я потратил целый час, пытаясь заставить сценарий в принятом ответе работать, но этого не произошло, этот сработал с первой попытки. - person lfborjas; 10.11.2011

Со связанной страницы:

Примечание: хотя оттенок принимает шестнадцатеричное значение цвета HTML, он использует это значение только для определения основного цвета (его ориентации вокруг цветового круга), а не его насыщенности или яркости, которые указываются отдельно в виде процентных изменений. Например, оттенок для чистого зеленого может быть определен как «# 00ff00» или «# 000100» в свойстве hue, и оба оттенка будут идентичными. (Оба значения указывают на чистый зеленый цвет в цветовой модели HSL.) Значения оттенка RGB, которые состоят из равных частей красного, зеленого и синего, например «# 000000» (черный) и «#FFFFFF» (белый), и все чистые оттенки серого - не указывайте оттенок вообще, поскольку ни одно из этих значений не указывает ориентацию в координатном пространстве HSL. Чтобы указать черный, белый или серый цвет, вы должны удалить всю насыщенность (установить значение -100) и вместо этого настроить яркость.

По крайней мере, как я это читал, это означает, что вам нужно преобразовать угол на основе цветового круга. Например, предположим, что 0 градусов - это чистый красный цвет, 120 градусов - чистый синий цвет, а 240 градусов - чистый зеленый цвет. Затем вы берете свой угол, выясняете, между какими двумя основными цветами он попадает, и интерполируете, чтобы определить, сколько из каждого основного цвета использовать. Теоретически вам, вероятно, следует использовать квадратичную интерполяцию, но есть вероятность, что вы вполне справитесь с линейной интерполяцией.

Используя это, 90 градусов (например) составляет 90/120 = 3/4 ths пути от красного к синему, поэтому ваше шестнадцатеричное число для оттенка будет 0x00010003 - или любое другое число, которое зеленый был установлен на 0, а соотношение красного и синего составляло 1: 3.

person Jerry Coffin    schedule 12.08.2010
comment
Если кто-то использует преобразователь RGB в HSL для вычисления угла, тогда у него уже есть значение RGB ... Значение RGB может быть просто шестнадцатеричным и отправлено как есть как значение H, а затем просто использовать преобразователь для S, Л. Или я недопонимаю. - person Andrew Shelansky; 13.08.2010
comment
У меня есть связанный с этим вопрос по дизайну. Если система, которая хочет цветов HSL, принимает значение RGB в качестве H, зачем ей нужны S и L для использования ... похоже, что если она собирается выполнять преобразование цветового пространства для вычисления H, это может также просто используйте указанный цвет Или использование HSL таким образом обеспечивает что-то, чего не хватает в пространстве RGB? - person Andrew Shelansky; 13.08.2010
comment
@Andrew: что касается прямого использования значения RGB, может быть, но, может быть, нет. В частности, я почти уверен, что он действительно ожидает, что хотя бы один из компонентов будет установлен на 0, что обычно не имеет места для необработанного цвета RGB. - person Jerry Coffin; 13.08.2010
comment
Я подозреваю, что они используют HSL для (некоторой) независимости устройства. Значение RGB (само по себе) в основном относится к цветам, создаваемым данным устройством, поэтому 0,0,0 означает самый темный черный, который он может произвести, а 255,255,255 означает самый яркий белый, который он может произвести - но (например) те будет немного отличаться между монитором и принтером (и даже на одном и том же принтере будет отличаться в зависимости от бумаги, которую вы его подаваете). Значение HSL немного легче связать с некоторым нейтральным цветовым пространством (CIE XYZ лучше для этого, но его сложнее визуализировать, объяснить или преобразовать в / из RGB). - person Jerry Coffin; 13.08.2010

Мне нужно было точно подобрать цвета. Поэтому я использовал инструмент, который предлагает @stadt.werk (http://googlemapscolorizr.stadtwerk.org/), чтобы приблизиться.

Но затем я столкнулся с проблемой, объясненной @bukzor, когда API Карт Google создает вариации вашего оттенка, ни один из которых не кажется в точности тем, что я указал.

Итак, я вытащил карту в браузере, сделал снимок экрана только области с двумя оттенками, которые не совсем совпадали, открыл его в редакторе изображений (в моем случае - pixlr.com), использовал цветовую присоску. инструмент для получения насыщенности и яркости тени, скорректировал мою насыщенность и / или яркость в вызове Google API на 1 и повторял, пока я не получил что-то, что кажется идеально совпадающим.

Конечно, возможно, что Google Maps API будет делать разные вещи с цветами на разных устройствах / браузерах и т. Д., Но пока все хорошо.

Да, утомительно, но работает.

person Trott    schedule 18.05.2011