2012-01-18 26 views
5

Tôi có một danh sách các màu được biểu diễn bằng hex - tôi cần sắp xếp chúng để khớp với thứ tự các màu trong cầu vồng. - Tôi có thể hardcode một thứ tự sắp xếp - nhưng tôi cảm thấy có một cách sạch hơn.Sắp xếp (hex) màu sắc để phù hợp với cầu vồng

+2

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

Trả lời

12

Dưới đây là một chức năng, được đưa ra một đặc điểm kỹ thuật màu sắc trong hex RGB, trả về màu HSV của nó:

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) 

Bây giờ bạn có thể sử dụng để sắp xếp danh sách các màu hex RGB bởi hue:

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

Bằng cách sắp xếp sử dụng toàn bộ bộ HSV, bạn đảm bảo rằng các màu không có màu sắc (tức là thang độ xám) sắp xếp ở một vị trí phù hợp, và màu sắc có cùng màu sắc, nhưng các giá trị/giá trị khác nhau sắp xếp theo thứ tự nhất quán các đối tác bão hòa/có giá trị.

Bạn vẫn sẽ có thứ gì đó lộn xộn nếu màu sắc thay đổi rất nhiều bởi độ bão hòa (cường độ) hoặc giá trị (độ sáng), nhưng không có xung quanh điều đó.

5

Tra cứu các đại diện màu HSV: https://en.wikipedia.org/wiki/HSL_and_HSV

Bằng cách sắp xếp đầu tiên của Huế, bạn có thể sắp xếp theo màu sắc nhận thức. Bạn có thể tự do chuyển đổi giữa RGB và HSV.

1

Điều đơn giản nhất là sắp xếp chúng theo thứ tự hue.

1

Sửa đổi câu trả lời kindall để cho phép thông số kỹ thuật ngắn màu trong hex (ví dụ #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) 

Bây giờ bạn có thể sử dụng chức năng để sắp xếp danh sách bởi hue:

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

>> ['#500000', '#000500', '#005'] 
Các vấn đề liên quan