(0, 128, 64)를 # 008040과 같은 것으로 변환해야합니다. 나는 후자를 무엇이라고 부를지 모르겠다. 검색을 어렵게 만든다.
(0, 128, 64)를 # 008040과 같은 것으로 변환해야합니다. 나는 후자를 무엇이라고 부를지 모르겠다. 검색을 어렵게 만든다.
답변:
형식 연산자 사용 %
:
>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'
경계를 확인하지 않습니다.
>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
'#%x%x%x' % (r, g, b)
def clamp(x):
return max(0, min(x, 255))
"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))
이는 PEP 3101에 설명 된 대로 선호되는 문자열 형식 지정 방법을 사용합니다 . 또한 사용 min()
하고 max
을 보장하기 위하여 0 <= {r,g,b} <= 255
.
업데이트 는 아래와 같이 클램프 기능을 추가했습니다.
업데이트 질문의 제목과 주어진 문맥에서, 이것이 [0,255]에 3 개의 int를 예상하고 3 개의 int를 전달하면 항상 색상을 반환한다는 것이 분명해야합니다. 그러나 주석에서 이것은 모든 사람에게 분명하지 않을 수 있으므로 명시 적으로 명시하십시오.
세 개의
int
값을 제공 하면 색상을 나타내는 유효한 16 진수 삼중 선이 반환됩니다. 해당 값이 [0,255] 사이이면 RGB 값으로 처리하고 해당 값에 해당하는 색상을 반환합니다.
이것은 오래된 질문이지만 정보를 위해 색상 및 컬러 맵과 관련된 유틸리티가 포함 된 패키지를 개발했으며 트리플렛을 헥사 값으로 변환하려는 rgb2hex 함수가 포함되어 있습니다 (이는 matplotlib와 같은 많은 다른 패키지에서 찾을 수 있음). pypi에 있습니다.
pip install colormap
그리고
>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'
입력의 유효성이 확인됩니다 (값은 0에서 255 사이 여야 함).
다음 함수는 rgb를 16 진수로 또는 그 반대로 변환 할 수있는 완전한 파이썬 프로그램을 만들었습니다.
def rgb2hex(r,g,b):
return "#{:02x}{:02x}{:02x}".format(r,g,b)
def hex2rgb(hexcode):
return tuple(map(ord,hexcode[1:].decode('hex')))
다음 링크에서 전체 코드 및 자습서를 볼 수 있습니다. Python을 사용하여 RGB에서 16 진수로 및 16 진수에서 RGB로 변환
이것은 python3.6 이상에서만 작동합니다.
def rgb2hex(color):
"""Converts a list or tuple of color to an RGB string
Args:
color (list|tuple): the list or tuple of integers (e.g. (127, 127, 127))
Returns:
str: the rgb string
"""
return f"#{''.join(f'{hex(c)[2:].upper():0>2}' for c in color)}"
위의 내용은 다음과 같습니다.
def rgb2hex(color):
string = '#'
for value in color:
hex_string = hex(value) # e.g. 0x7f
reduced_hex_string = hex_string[2:] # e.g. 7f
capitalized_hex_string = reduced_hex_string.upper() # e.g. 7F
string += capitalized_hex_string # e.g. #7F7F7F
return string
람다와 f- 문자열을 사용할 수 있습니다 (파이썬 3.6 이상에서 사용 가능)
rgb2hex = lambda r,g,b: f"#{r:02x}{g:02x}{b:02x}"
hex2rgb = lambda hx: (int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16))
용법
rgb2hex(r,g,b) #output = #hexcolor
hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)
background = RGB(0, 128, 64)
파이썬에서 한 줄짜리가 반드시 친절하게 여겨지는 것은 아니라는 것을 알고 있습니다. 그러나 파이썬 파서가 허용하는 것을 활용하는 것을 거부 할 수없는 때가 있습니다. Dietrich Epp의 솔루션 (최고)과 동일한 대답이지만 한 줄 함수로 요약되어 있습니다. 그래서 디트리히 감사합니다!
나는 지금 tkinter와 함께 사용하고 있습니다 :-)
다음은 [0,1] 범위 또는 [0,255] 범위의 RGB 값을 가질 수있는 상황을 처리하기위한보다 완벽한 함수입니다 .
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))
이런 식으로 효율성에 대해 걱정할 것 같지 않지만 매우 효율적인 비트 현명한 연산자를 사용할 수도 있습니다. 또한 비교적 깨끗합니다. 경계를 고정하거나 확인하지 않습니다. 이것은 적어도 Python 2.7.17 이후로 지원되었습니다 .
hex(r << 16 | g << 8 | b)
#으로 시작하도록 변경하려면 다음을 수행 할 수 있습니다.
"#" + hex(243 << 16 | 103 << 8 | 67)[2:]
아무도이 접근법을 제안하지 않았다는 사실에 정말 놀랐습니다.
Python 2 및 3의 경우 :
'#' + ''.join('{:02X}'.format(i) for i in colortuple)
Python 3.6 이상 :
'#' + ''.join(f'{i:02X}' for i in colortuple)
함수로서 :
def hextriplet(colortuple):
return '#' + ''.join(f'{i:02X}' for i in colortuple)
color = (0, 128, 64)
print(hextriplet(color))
#008040
webcolors라는 패키지가 있습니다. https://github.com/ubernostrum/webcolors
방법이 있습니다 webcolors.rgb_to_hex
>>> import webcolors
>>> webcolors.rgb_to_hex((12,232,23))
'#0ce817'