복붙노트

[PYTHON] RGB Int에서 RGB - 파이썬

PYTHON

RGB Int에서 RGB - 파이썬

어떻게 RGB 정수를 해당 RGB 튜플 (R, G, B)로 변환 할 수 있습니까? 충분히 단순 해 보이지만 Google에서 아무 것도 찾을 수 없습니다.

나는 모든 RGB (r, g, b)에 정수 n = r256 ^ 2 + g256 + b를 가지고 있음을 안다. 파이썬에서 역함수를 구할 수있는 방법은 IE가 n이고, r, g, b 값이 필요하다. .

해결법

  1. ==============================

    1.꼭 파이썬 전문가는 아니지만, 아는 한 C와 같은 연산자를 사용합니다.

    꼭 파이썬 전문가는 아니지만, 아는 한 C와 같은 연산자를 사용합니다.

    그렇다면 이것이 효과적 일 것이며 modulo와 division을 사용하는 것보다 훨씬 빠르다.

    Blue =  RGBint & 255
    Green = (RGBint >> 8) & 255
    Red =   (RGBint >> 16) & 255
    

    각 경우에 가장 낮은 바이트를 마스크하기 위해 수행하는 작업 (2 진수 및 255 .. 8 비트와 같음). 녹색 및 적색 구성 요소의 경우 동일하지만 색상 채널을 가장 낮은 바이트로 먼저 이동합니다.

  2. ==============================

    2.RGB 정수에서 :

    RGB 정수에서 :

    Blue =  RGBint mod 256
    Green = RGBint / 256 mod 256
    Red =   RGBint / 256 / 256 mod 256
    

    당신이 그것을 얻는 방법을 알게되면 이것은 매우 간단하게 구현 될 수 있습니다. :)

    Upd : 파이썬 함수 추가. 더 좋은 방법이 있을지 모르지만, 파이썬 3과 2.4에서 작동합니다.

    def rgb_int2tuple(rgbint):
        return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256)
    

    비트 시프트 (bithifting)와 마스킹 (masking)을 사용하는 탁월한 솔루션은 Nils Pipenbrinck이 게시 한 것보다 훨씬 빠릅니다.

  3. ==============================

    3.

    >>> import struct
    >>> str='aabbcc'
    >>> struct.unpack('BBB',str.decode('hex'))
    (170, 187, 204)
    
    for python3:
    >>> struct.unpack('BBB', bytes.fromhex(str))
    

    >>> rgb = (50,100,150)
    >>> struct.pack('BBB',*rgb).encode('hex')
    '326496'
    
    for python3:
    >>> bytes.hex(struct.pack('BBB',*rgb))
    
  4. ==============================

    4.RGB 값 (예 : ARGB)이 포함 된 32 비트 정수가 있다고 가정합니다. 그런 다음 struct 모듈을 사용하여 이진 데이터의 압축을 풀 수 있습니다.

    RGB 값 (예 : ARGB)이 포함 된 32 비트 정수가 있다고 가정합니다. 그런 다음 struct 모듈을 사용하여 이진 데이터의 압축을 풀 수 있습니다.

    # Create an example value (this represents your 32-bit input integer in this example).
    # The following line results in exampleRgbValue = binary 0x00FF77F0 (big endian)
    exampleRgbValue = struct.pack(">I", 0x00FF77F0)
    
    # Unpack the value (result is: a = 0, r = 255, g = 119, b = 240)
    a, r, g, b = struct.unpack("BBBB", exampleRgbValue)
    
  5. ==============================

    5.

    >>> r, g, b = (111, 121, 131)
    >>> packed = int('%02x%02x%02x' % (r, g, b), 16)
    

    그러면 다음과 같은 정수가 생성됩니다.

    >>> packed
    7305603
    

    그런 다음 긴 명시적인 방법으로 압축을 풀 수 있습니다.

    >>> packed % 256
    255
    >>> (packed / 256) % 256
    131
    >>> (packed / 256 / 256) % 256
    121
    >>> (packed / 256 / 256 / 256) % 256
    111
    

    .. 또는보다 컴팩트 한 방식으로 :

    >>> b, g, r = [(packed >> (8*i)) & 255 for i in range(3)]
    >>> r, g, b
    

    샘플은 RGBA 색상과 같은 임의의 자릿수와 함께 적용됩니다.

    >>> packed = int('%02x%02x%02x%02x' % (111, 121, 131, 141), 16)
    >>> [(packed >> (8*i)) & 255 for i in range(4)]
    [141, 131, 121, 111]
    
  6. ==============================

    6.Google의 Appengine Images Python API를 사용하는 모든 사용자를위한 메모입니다. 32 비트 RGB 색상 값을 가진 메소드를 제공해야하는 상황이 있음을 발견했습니다.

    Google의 Appengine Images Python API를 사용하는 모든 사용자를위한 메모입니다. 32 비트 RGB 색상 값을 가진 메소드를 제공해야하는 상황이 있음을 발견했습니다.

    특히 API를 사용하여 PNG (또는 투명 픽셀이있는 이미지)를 변환하는 경우 transparent_substitution_rgb라는 인수를 execute_transforms 메소드에 제공해야합니다.이 인수는 32 비트 RGB 색상 값이어야합니다.

    dbr의 대답에서 빌려, 나는 이와 비슷한 방법을 생각해 냈다.

    def RGBTo32bitInt(r, g, b):
      return int('%02x%02x%02x' % (r, g, b), 16)
    
    transformed_image = image.execute_transforms(output_encoding=images.JPEG, transparent_substitution_rgb=RGBTo32bitInt(255, 127, 0))
    
  7. ==============================

    7.

    def unpack2rgb(intcol):
        tmp, blue= divmod(intcol, 256)
        tmp, green= divmod(tmp, 256)
        alpha, red= divmod(tmp, 256)
        return alpha, red, green, blue
    

    divmod (value, (divider1, divider2, divider3 ...)) 제안 만 수락되면 다양한 시간 변환도 간소화됩니다.

  8. ==============================

    8.아마도 이렇게하는 것이 더 짧은 방법 일 것입니다.

    아마도 이렇게하는 것이 더 짧은 방법 일 것입니다.

    dec=10490586
    hex="%06x" % dec
    r=hex[:2]
    g=hex[2:4]
    b=hex[4:6]
    rgb=(r,g,b)
    

    편집 :이 잘못되었습니다 - 16 진수, OP 원하는 int있는 대답을 제공합니다. EDIT2 : 불행과 실패를 줄이기 위해 세련됨 - 16 진수가 항상 6 자리로 표시되도록하려면 '% 06x'가 필요합니다. [Peter Hansen의 의견에 감사드립니다.]

  9. ==============================

    9.NumPy를 사용하고 RGBint 배열을 가지고 있다면 dtype을 변경하여 빨강, 초록, 파랑 ​​및 알파 구성 요소를 추출 할 수 있습니다.

    NumPy를 사용하고 RGBint 배열을 가지고 있다면 dtype을 변경하여 빨강, 초록, 파랑 ​​및 알파 구성 요소를 추출 할 수 있습니다.

    >>> type(rgbints)
    numpy.ndarray
    >>> rgbints.shape
    (1024L, 768L)
    >>> rgbints.dtype
    dtype('int32')
    >>> rgbints.dtype = dtype('4uint8')
    >>> rgbints.shape
    (1024L, 768L, 4L)
    >>> rgbints.dtype
    dtype('uint8')
    
  10. ==============================

    10.위에 언급 된 것에 추가. 간결한 1 라이너 대안.

    위에 언급 된 것에 추가. 간결한 1 라이너 대안.

    # 2003199 or #E190FF is Dodger Blue.
    tuple((2003199 >> Val) & 255 for Val in (16, 8, 0))
    # (30, 144, 255)
    

    그리고 미래의 혼란을 피하기 위해서.

    from collections import namedtuple
    RGB = namedtuple('RGB', ('Red', 'Green', 'Blue'))
    rgb_integer = 16766720  # Or #ffd700 is Gold.
    # The unpacking asterisk prevents a TypeError caused by missing arguments.
    RGB(*((rgb_integer >> Val) & 255 for Val in (16, 8, 0)))
    # RGB(Red=255, Green=215, Blue=0)
    
  11. from https://stackoverflow.com/questions/2262100/rgb-int-to-rgb-python by cc-by-sa and MIT license