2012-01-18 54 views
5

我有一個用十六進制表示的顏色列表 - 我需要對它們進行排序以匹配彩虹中的顏色順序。 - 我可以硬編碼排序 - 但我覺得有一個更清晰的方法。排序(十六進制)的顏色匹配彩虹

+2

HTTP:/ /stackoverflow.com/questions/6208980/sorting-a-list-of-rgb-triplets-into-a-spectrum – NPE 2012-01-18 18:12:26

回答

12

這裏是一個函數,考慮在十六進制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元組進行排序,可以確保沒有色相(即灰度)的顏色排列在一個一致的位置,並且具有相同色調但不同飽和度/值的顏色按照其更一致的順序排列,飽和/有價值的同行。

如果顏色因飽和度(強度)或數值(亮度)而變化很大,您仍然會感到混亂,但沒有辦法解決這個問題。

1

最簡單的事情就是按照hue的順序對它們進行排序。

1

修改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']