2010-08-01 35 views
39

Tôi cần phải chuyển đổi (0, 128, 64) thành một cái gì đó như thế này # 008040. Tôi không biết phải gọi cái gì sau, khiến việc tìm kiếm trở nên khó khăn.Chuyển đổi một bộ màu RGB thành mã có sáu chữ số, trong Python

+0

Xem câu trả lời SO trước đó http://stackoverflow.com/questions/214359/converting-hex-to-rgb-and-vice-versa - trong ba câu trả lời, câu trả lời có nhiều phiếu bầu nhất bao gồm đoạn mã python đứng dọc để làm những gì tôi tin rằng bạn đang theo sau. – doug

+0

Thuật ngữ bạn đang tìm kiếm là Hex Triplet. http://en.wikipedia.org/wiki/Hex_color#Hex_triplet –

Trả lời

79

Sử dụng toán tử định dạng %:

>>> '#%02x%02x%02x' % (0, 128, 64) 
'#008040' 

Lưu ý rằng nó sẽ không kiểm tra giới hạn ...

>>> '#%02x%02x%02x' % (0, -1, 9999) 
'#00-1270f' 
33
def clamp(x): 
    return max(0, min(x, 255)) 

"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b)) 

này sử dụng phương pháp ưa thích của định dạng chuỗi, như described in PEP 3101. Nó cũng sử dụng min()max để đảm bảo rằng 0 <= {r,g,b} <= 255.

Cập nhật thêm chức năng kẹp như được đề xuất bên dưới.

Cập nhật Từ tiêu đề của câu hỏi và ngữ cảnh được đưa ra, phải rõ ràng rằng điều này mong đợi 3 int trong [0,255] và sẽ luôn trả về màu khi truyền 3 int như vậy. Tuy nhiên, từ ý kiến, điều này có thể không được rõ ràng cho tất cả mọi người, vì vậy hãy để nó được quy định rõ ràng:

Cung cấp ba int giá trị, điều này sẽ trả về một bộ ba hex hợp lệ đại diện cho một màu sắc. Nếu những giá trị đó nằm trong khoảng [0,255] thì giá trị đó sẽ coi giá trị RGB đó và trả lại màu tương ứng với các giá trị đó.

+0

Chỉ một gợi ý: 'def clamp (x): return max (0, min (x, 255))' –

+0

Đề xuất tốt. Cảm ơn Mark, tôi sẽ cập nhật giải pháp. –

+0

@Jesse Dhillon: "kẹp" == "âm thầm không thành công". Hãy thử một cái gì đó như thế này: 'if not (0 <= x <= 255): tăng ValueError ('rgb (% r) không nằm trong phạm vi (256)'% x)' –

7
triplet = (0, 128, 64) 
print '#'+''.join(map(chr, triplet)).encode('hex') 

hoặc

from struct import pack 
print '#'+pack("BBB",*triplet).encode('hex') 

python3 là hơi khác nhau

from base64 import b16encode 
print(b'#'+b16encode(bytes(triplet))) 
11

Đây là một câu hỏi cũ nhưng đối với thông tin, tôi đã phát triển một gói với một số tiện ích liên quan đến màu sắc và colormaps và chứa hàm rgb2hex bạn đang tìm cách chuyển đổi bộ ba thành giá trị hexa (có thể được tìm thấy trong nhiều các gói khác, ví dụ: matplotlib). Đó là trên pypi

pip install colormap 

và sau đó

>>> from colormap import rgb2hex 
>>> rgb2hex(0, 128, 64) 
'##008040' 

Hiệu lực của các đầu vào được kiểm tra (giá trị phải được từ 0 đến 255).

6

Tôi đã tạo một chương trình python đầy đủ cho nó các chức năng sau có thể chuyển đổi rgb thành hex và ngược lại.

def rgb2hex(r,g,b): 
    return "#{:02x}{:02x}{:02x}".format(r,g,b) 

def hex2rgb(hexcode): 
    return tuple(map(ord,hexcode[1:].decode('hex'))) 

Bạn có thể xem mã đầy đủ và hướng dẫn tại liên kết sau: RGB to Hex and Hex to RGB conversion using Python

0

Trong Python 3.6, bạn có thể sử dụng e-chuỗi để làm sạch này:

rgb = (0,128, 64) 
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}' 

Tất nhiên bạn có thể đặt đó vào một chức năng, và như một phần thưởng, giá trị được làm tròn và chuyển đổi sang int:

def rgb2hex(r,g,b): 
    return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}' 

rgb2hex(*rgb) 
0
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue) 

background = RGB(0, 128, 64) 

tôi biết một lớp lót bằng Python không nece ssarily nhìn vui vẻ. Nhưng có những lúc tôi không thể cưỡng lại lợi dụng những gì mà trình phân tích cú pháp Python cho phép. Đó là câu trả lời tương tự như giải pháp của Dietrich Epp (tốt nhất), nhưng được bọc trong một chức năng của một dòng. Vì vậy, cảm ơn bạn Dietrich!

Tôi đang sử dụng nó ngay bây giờ với Tkinter :-)

0

Đây là một chức năng hoàn chỉnh hơn cho các tình huống xử lý, trong đó bạn có thể có giá trị RGB trong khoảng [0,1] hoặc phạm vi [ 0,255].

def RGBtoHex(vals, rgbtype=1): 
    """Converts RGB values in a variety of formats to Hex values. 

    @param vals  An RGB/RGBA tuple 
    @param rgbtype Valid valus are: 
          1 - Inputs are in the range 0 to 1 
         256 - Inputs are in the range 0 to 255 

    @return A hex string in the form '#RRGGBB' or '#RRGGBBAA' 
""" 

    if len(vals)!=3 and len(vals)!=4: 
    raise Exception("RGB or RGBA inputs to RGBtoHex must have three or four elements!") 
    if rgbtype!=1 and rgbtype!=256: 
    raise Exception("rgbtype must be 1 or 256!") 

    #Convert from 0-1 RGB/RGBA to 0-255 RGB/RGBA 
    if rgbtype==1: 
    vals = [255*x for x in vals] 

    #Ensure values are rounded integers, convert to hex, and concatenate 
    return '#' + ''.join(['{:02X}'.format(int(round(x))) for x in vals]) 

print(RGBtoHex((0.1,0.3, 1))) 
print(RGBtoHex((0.8,0.5, 0))) 
print(RGBtoHex(( 3, 20,147), rgbtype=256)) 
print(RGBtoHex(( 3, 20,147,43), rgbtype=256)) 
Các vấn đề liên quan