2012-01-18 11 views
5

Mam listę kolorów reprezentowanych w hex - muszę je posortować, aby dopasować kolejność kolorów w tęczy. - Mógłbym zakodować kolejność sortowania - ale czuję, że jest to czystszy sposób.Sortuj (hex) kolory, aby dopasować tęczę

+2

http://stackoverflow.com/questions/6208980/sorting-a-list-of-rgb-triplets-into-a-spectrum – NPE

Odpowiedz

12

Oto funkcja, która, biorąc pod uwagę specyfikację kolorów w hex RGB, zwraca swój kolor 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) 

Teraz można użyć tego, aby posortować listę RGB hex kolorów poprzez barwę:

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

Sortując za pomocą całej krotki HSV, upewniasz się, że kolory, które nie mają odcienia (tj. Skali szarości) sortują w spójnym miejscu, i że kolory o tym samym odcieniu, ale o różnych wartościach nasycenia/wartościach sortują w spójnej kolejności w stosunku do ich więcej- odpowiedniki nasycone/wycenione.

Nadal będziesz mieć bałagan, jeśli kolory różnią się znacznie w zależności od nasycenia (intensywności) lub wartości (jasności), ale nie da się tego obejść.

1

Najprostszą rzeczą do zrobienia jest posortowanie ich w kolejności hue.

1

Modyfikowanie odpowiedź kindall aby umożliwić krótkie specyfikacji kolorów w hex (np #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) 

Teraz można korzystać z funkcji, aby posortować listę według odcienia:

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

>> ['#500000', '#000500', '#005'] 
Powiązane problemy