我有一个以十六进制表示的颜色列表 - 我需要对它们进行排序以匹配彩虹中的颜色顺序。 - 我可以硬编码排序顺序 - 但我觉得有一种更清洁的方式。
答案 0 :(得分: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 :(得分:5)
查找HSV颜色表示:https://en.wikipedia.org/wiki/HSL_and_HSV
首先按顺序排序,您可以按感知颜色排序。您可以在RGB和HSV之间自由转换。
答案 2 :(得分:1)
最简单的方法是按hue顺序对它们进行排序。
答案 3 :(得分:1)
修改kindall answer以允许十六进制的短颜色规范(例如#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']