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

6

我有一份以十六进制表示颜色的列表 - 我需要将它们排序以匹配彩虹中颜色的顺序。 - 我可以硬编码一个排序顺序 - 但我觉得有更简洁的方法。


2
https://dev59.com/J2025IYBdhLWcg3wHSCn - NPE
4个回答

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元组进行排序,可以确保没有色调(即灰度)的颜色以一致的位置排序,并且具有相同色调但不同饱和度/值的颜色与它们更饱和/值的对应物相对排序。

如果颜色的饱和度(强度)或值(亮度)差异很大,则仍会出现一些混乱,但是无法避免。


5

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

1

最简单的方法是按hue顺序对它们进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接