将(十六进制)颜色排序以匹配虹彩

6 投票
4 回答
12153 浏览
提问于 2025-04-17 10:32

我有一份颜色列表,这些颜色是用十六进制表示的——我需要把它们排序,按照彩虹的颜色顺序来排。虽然我可以直接写死一个排序的顺序,但我觉得有更简单的方法。

4 个回答

2

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

查一下HSV颜色表示法:https://en.wikipedia.org/wiki/HSL_and_HSV

先按色相(Hue)排序,就可以按人眼看到的颜色来排序。你可以在RGB和HSV之间随意转换。

16

这里有一个函数,它可以把用十六进制表示的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值进行排序,你可以确保没有色相的颜色(也就是灰色)能排在一个固定的位置,同时色相相同但饱和度或亮度不同的颜色也能按照它们的饱和度和亮度有一个一致的排序。

不过,如果颜色的饱和度(强度)或亮度(明亮程度)差异很大,排序结果可能还是会有点乱,但这个问题是没办法避免的。

撰写回答