2012-01-18 40 views
5

Tengo una lista de colores representados en hexadecimal: necesito ordenarlos para que coincidan con el orden de los colores en un arcoiris. - Podría codificar un orden de clasificación - pero creo que hay una manera más limpia.Colores de ordenación (hex) para que coincida con el arcoíris

+2

http://stackoverflow.com/questions/6208980/sorting-a-list-of-rgb-triplets-into-a-spectrum – NPE

Respuesta

12

Aquí es una función que, dada una especificación de color en RGB hexadecimal, devuelve su color 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) 

Ahora usted puede usar esto para ordenar la lista de colores hexadecimales RGB por tonalidad:

color_list = ["000050", "005000", "500000"] # GBR 
color_list.sort(key=get_hsv) 
print color_list 

Al ordenar utilizando toda la tupla HSV, se asegura de que los colores que no tienen tonalidad (es decir, escalas de grises) ordenan en un lugar consistente y que colorean con el mismo tono pero diferentes saturaciones/valores ordenados en un orden consistente en relación con su contrapartes saturadas/valoradas.

Todavía tendrá algo de un lío si los colores varían ampliamente por saturación (intensidad) o valor (brillo), pero no hay forma de evitar eso.

1

Lo más fácil de hacer es ordenarlos en orden hue.

1

Modificación de respuesta Kindall para permitir especificaciones cortos de color en hexadecimal (por ejemplo #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) 

Ahora se puede utilizar la función para ordenar la lista por tonalidad:

color_list = ["#005", "#000500", "#500000"] 
color_list.sort(key=get_hsv) 
print color_list 

>> ['#500000', '#000500', '#005'] 
Cuestiones relacionadas