RGB 색 튜플을 16진수 문자열로 변환
변환해야 합니다.(0, 128, 64)
이와 같은 것에"#008040"
후자를 뭐라고 불러야 할지 몰라서 검색이 어렵습니다.
형식 연산자 사용%
:
>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'
경계를 확인하지 않습니다...
>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
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를 통과할 때 항상 색상을 반환한다는 것이 분명해야 합니다.그러나 의견을 들어보면 이는 모두에게 명백하지 않을 수 있으므로 다음과 같이 명시해야 합니다.
3개 제공
int
값, 색상을 나타내는 유효한 16진수 삼중항을 반환합니다.이러한 값이 [0,255] 사이이면 RGB 값으로 처리되고 해당 값에 해당하는 색상이 반환됩니다.
저는 그것을 위해 완전한 파이썬 프로그램을 만들었습니다. 다음 함수들은 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에서 Hex로, Hex에서 RGB로 변환.
이것은 오래된 질문이지만 참고로, 저는 색상과 색상 지도와 관련된 유틸리티로 패키지를 개발했고 당신이 삼중항을 헥사 값으로 변환하려고 했던 rgb2hex 함수를 포함하고 있습니다(예: matplotlib).파이피에 있습니다.
pip install colormap
그리고 나서.
>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'
입력의 유효성이 확인됩니다(값은 0에서 255 사이여야 함).
아무도 이러한 접근 방식을 제안하지 않은 것이 정말 놀랍습니다.
Python 2 및 3의 경우:
'#' + ''.join('{:02X}'.format(i) for i in colortuple)
파이썬 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
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')
또는
from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')
python3는 약간 다릅니다.
from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))
람다와 f-delam을 사용할 수 있습니다(파이썬 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
Python 3.6에서는 f-string을 사용하여 다음을 더 깨끗하게 만들 수 있습니다.
rgb = (0,128, 64)
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'
물론 함수에 넣을 수 있으며, 추가적으로 값은 반올림되고 int로 변환됩니다.
def rgb2hex(r,g,b):
return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}'
rgb2hex(*rgb)
다음은 [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 3.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
효율성에 대해 걱정할 것 같지는 않지만 상당히 효율적인 비트 연산자를 사용할 수도 있습니다.또한 비교적 깨끗합니다.경계를 고정하거나 확인하지 않습니다.이것은 적어도 Python 2.7.17 이후로 지원되고 있습니다.
hex(r << 16 | g << 8 | b)
#로 시작하도록 변경하려면 다음 작업을 수행합니다.
"#" + hex(243 << 16 | 103 << 8 | 67)[2:]
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)
background = RGB(0, 128, 64)
파이썬의 한 줄기가 반드시 친절하게 봐주지는 않는다는 것을 알고 있습니다.하지만 때때로 저는 파이썬 파서가 허용하는 것을 이용하지 않을 수 없습니다.Dietrich Epp의 솔루션(최고)과 동일한 답변이지만, 한 줄 기능으로 마무리되었습니다.감사합니다, 디트리히!
지금은 tkinter와 함께 사용하고 있습니다 :-)
웹컬러라는 패키지가 있습니다.https://github.com/ubernostrum/webcolors
은 방법이 있습니다.webcolors.rgb_to_hex
>>> import webcolors
>>> webcolors.rgb_to_hex((12,232,23))
'#0ce817'
서식 문자열을 세 번 입력하는 것이 약간 장황한 것 같으면...
비트 시프트와 f-스트링의 조합은 작업을 잘 수행할 것입니다.
# Example setup.
>>> r, g, b = 0, 0, 195
# Create the hex string.
>>> f'#{r << 16 | g << 8 | b:06x}'
'#0000c3'
또한 빨간색 또는 녹색 채널이 0인 경우 '선행' 0비트가 떨어지지 않는 방법도 설명합니다.
''.join('%02x'%i for i in input)
int 번호에서 16진수 변환에 사용할 수 있습니다.
나의 코스 과제는 루프와 다른 것들을 사용하지 않고 이것을 하는 것이 필요했고, 여기 내 이상한 해결책이 있습니다. 하하.
color1 = int(input())
color2 = int(input())
color3 = int(input())
color1 = hex(color1).upper()
color2 = hex(color2).upper()
color3 = hex(color3).upper()
print('#'+ color1[2:].zfill(2)+color2[2:].zfill(2)+color3[2:].zfill(2))
언급URL : https://stackoverflow.com/questions/3380726/converting-an-rgb-color-tuple-to-a-hexidecimal-string
'programing' 카테고리의 다른 글
날짜 문자열을 다른 형식으로 변환하는 방법 (0) | 2023.07.17 |
---|---|
모든 Mongo 컬렉션을 루프하고 쿼리 실행 (0) | 2023.07.17 |
아나콘다에서 이전 패키지로 되돌리려면 어떻게 해야 합니까? (0) | 2023.07.17 |
Amazon MWS - 계산된 요청 서명이 제공된 서명과 일치하지 않습니다. (0) | 2023.07.17 |
iOS 응용 프로그램의 최대 크기 (0) | 2023.07.17 |