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

问题描述 投票:0回答:5

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

python algorithm sorting colors
5个回答
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
投票

查找 HSV 颜色表示:https://en.wikipedia.org/wiki/HSL_and_HSV

通过首先按色调排序,您可以按感知的颜色进行排序。您可以在 RGB 和 HSV 之间自由转换。


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 顺序对它们进行排序。


0
投票

如果您想要开箱即用的解决方案,您可以使用 colorir 来实现:

import colorir as cl
# Sorts 10000 random colors by their HCLab hue component
hue_sorted([random_color() for _ in range(10000)], gray_thresh=0)

© www.soinside.com 2019 - 2024. All rights reserved.