Сортировка (шестнадцатеричные) цвета в соответствии с радугой - PullRequest
5 голосов
/ 18 января 2012

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

Ответы [ 4 ]

12 голосов
/ 18 января 2012

Вот функция, которая с учетом спецификации цвета в шестнадцатеричном RGB возвращает свой цвет HSV:

import colorsys

def get_hsv(hexrgb):
    hexrgb = hexrgb.lstrip("#")   # in case you have Web color specs
    r, g, b = (int(hexrgb[i:i+2], 16) / 255.0 for i in xrange(0,5,2))
    return colorsys.rgb_to_hsv(r, g, b)

Теперь вы можете использовать это для сортировки списка шестнадцатеричных цветов RGB по оттенку:

color_list = ["000050", "005000", "500000"]  # GBR
color_list.sort(key=get_hsv)
print color_list

Сортируя с использованием всего кортежа HSV, вы гарантируете, что цвета, не имеющие оттенка (то есть оттенки серого), сортируются в согласованном месте, а цвета с одинаковым оттенком, но разными насыщенностью / значениями сортируются в согласованном порядке относительноих более насыщенные / ценные аналоги.

У вас все еще будет что-то вроде беспорядка, если цвета будут сильно различаться по насыщенности (интенсивности) или значению (яркости), но от этого никуда не деться.

5 голосов
/ 18 января 2012

Посмотрите цветовое представление HSV: https://en.wikipedia.org/wiki/HSL_and_HSV

Сортировав сначала по оттенку, вы можете сортировать по воспринимаемому цвету.Вы можете свободно конвертировать между RGB и HSV.

1 голос
/ 23 мая 2014

Изменение ответа kindall для разрешения кратких характеристик цвета в шестнадцатеричном формате (например, #f0f, #005):

import colorsys

def get_hsv(hexrgb):
    hexrgb = hexrgb.lstrip("#")   # in case you have Web color specs
    lh = len(hexrgb)
    # Allow short and long hex codes
    r, g, b = (int(hexrgb[i:i+lh/3], 16) / 255.0 for i in xrange(0, lh, lh/3))
    return colorsys.rgb_to_hsv(r, g, b)

Теперь вы можете использовать функцию для сортировки списка по оттенку:

color_list = ["#005", "#000500", "#500000"]
color_list.sort(key=get_hsv)
print color_list

>> ['#500000', '#000500', '#005']
1 голос
/ 18 января 2012

Самое простое, что нужно сделать, это отсортировать их в порядке оттенок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...