Python에서 RGB 색상 튜플을 6 자리 코드로 변환


87

(0, 128, 64)를 # 008040과 같은 것으로 변환해야합니다. 나는 후자를 무엇이라고 부를지 모르겠다. 검색을 어렵게 만든다.


이전 SO 답변을 참조하십시오. stackoverflow.com/questions/214359/…- 세 가지 답변 중 가장 많은 표를 얻은 사람은 내가 당신이 추구한다고 믿는 것을 수행하는 독립형 파이썬 코드 스 니펫을 포함합니다.
doug

3
당신이 찾고있는 용어는 Hex Triplet입니다. en.wikipedia.org/wiki/Hex_color#Hex_triplet
Mark Ransom

보다 일반적인 질문에 대해서는 여기보다 훨씬 더 나은 답변이 있습니다. stackoverflow.com/a/57197866/624066
MestreLion

답변:


183

형식 연산자 사용 %:

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

경계를 확인하지 않습니다.

>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'

하지만 2 자리 제한이 정말 필요합니까? RGB 값이 0-255의 적절한 범위에있는 한 필요하지 않습니다. 그래서 당신은 할 수 있습니다'#%x%x%x' % (r, g, b)
wordsforthewise

3
실제로 이제 값이 0이면 다른 0으로 채워야 함을 알 수 있습니다. 따라서 02를 두 자리로 만듭니다.
wordsforthewise

51
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 값으로 처리하고 해당 값에 해당하는 색상을 반환합니다.


20

이것은 오래된 질문이지만 정보를 위해 색상 및 컬러 맵과 관련된 유틸리티가 포함 된 패키지를 개발했으며 트리플렛을 헥사 값으로 변환하려는 rgb2hex 함수가 포함되어 있습니다 (이는 matplotlib와 같은 많은 다른 패키지에서 찾을 수 있음). pypi에 있습니다.

pip install colormap

그리고

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

입력의 유효성이 확인됩니다 (값은 0에서 255 사이 여야 함).


3
rgb2hex를 사용하려고했지만 "ImportError : no module named easydev.tools"라는 오류가 발생했습니다. 그것에 대한 해결책을 제안 할 수 있습니까?
Abhils

easydev를 다시 설치하십시오. 그런 다음 'pip3 install easydev'.
Shounak Ray

16

다음 함수는 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로 변환


rgb의 십진수 값에는 작동하지 않습니다. 그것에 대한 해결책을 제안 해 주시겠습니까?
Abhils

일주. 최종 색상에 큰 차이가 없어야합니다.
Shounak Ray

9
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)))

3

이것은 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

(13,13,12)에 적용된이 함수 rgb2hex는 0xDDC를 제공하지만 웹 사이트 RGB to HEX는 0x0D0D0C로 제공하며 이는 또한 숫자가 13 * 65536 + 13 * 256 + 12 여야한다는 생각과도 일치합니다. 그리고 0xDDC는 파이썬에서 3548로 읽습니다.
Lars Ericson

CSS 색상이 일치하지 않습니다. 6 자리 16 진수 색상, 3 자리 16 진수 색상, 소수와 백분율이있는 rgb 표기법, hsl 등이 있습니다. 항상 6 자리 16 진수 색상을 제공하도록 공식을 조정했으며 더 일관성이있을 수 있다고 생각합니다. 더 정확한지 모르겠습니다.
Brian Bruggeman

3

람다와 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


1
람다를 직접 호출하는 것은 여러 가지 이유로 권장되지 않습니다. 나는 그것을 검토 한 프로젝트에서 이렇게 사용했고 모든 사람들이 직접 전화하지 않고 같은 말을했다.
MikeyB

2
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)

background = RGB(0, 128, 64)

파이썬에서 한 줄짜리가 반드시 친절하게 여겨지는 것은 아니라는 것을 알고 있습니다. 그러나 파이썬 파서가 허용하는 것을 활용하는 것을 거부 할 수없는 때가 있습니다. Dietrich Epp의 솔루션 (최고)과 동일한 대답이지만 한 줄 함수로 요약되어 있습니다. 그래서 디트리히 감사합니다!

나는 지금 tkinter와 함께 사용하고 있습니다 :-)


2

다음은 [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))

1

Python 3.6 에서는 f- 문자열 을 사용하여 더 깔끔하게 만들 수 있습니다 .

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)

1

이런 식으로 효율성에 대해 걱정할 것 같지 않지만 매우 효율적인 비트 현명한 연산자를 사용할 수도 있습니다. 또한 비교적 깨끗합니다. 경계를 고정하거나 확인하지 않습니다. 이것은 적어도 Python 2.7.17 이후로 지원되었습니다 .

hex(r << 16 | g << 8 | b)

#으로 시작하도록 변경하려면 다음을 수행 할 수 있습니다.

"#" + hex(243 << 16 | 103 << 8 | 67)[2:]

1

아무도이 접근법을 제안하지 않았다는 사실에 정말 놀랐습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.