如何将十六进制三元组转换为RGB元组并返回?

时间:2010-11-28 09:55:13

标签: python colors

我想将十六进制三元组转换为RGB元组,然后将元组转换为十六进制三元组。

10 个答案:

答案 0 :(得分:71)

>>> import struct
>>> rgbstr='aabbcc'
>>> struct.unpack('BBB',rgbstr.decode('hex'))
(170, 187, 204)

>>> rgb = (50,100,150)
>>> struct.pack('BBB',*rgb).encode('hex')
'326496'

答案 1 :(得分:25)

尝试 pythonic

>>> rgbstr='aabbcc'
>>> tuple(ord(c) for c in rgbstr.decode('hex'))
(170, 187, 204)
>>> tuple(map(ord, rgbstr.decode('hex'))
(170, 187, 204)

>>> rgb=(12,50,100)
>>> "".join(map(chr, rgb)).encode('hex')
'0c3264'

答案 2 :(得分:17)

你可以使用一个带有一些切片和移位的查找表 - 所有相对快速的操作 - 来创建一些在Python 2和3中都能保持不变的函数:

_NUMERALS = '0123456789abcdefABCDEF'
_HEXDEC = {v: int(v, 16) for v in (x+y for x in _NUMERALS for y in _NUMERALS)}
LOWERCASE, UPPERCASE = 'x', 'X'

def rgb(triplet):
    return _HEXDEC[triplet[0:2]], _HEXDEC[triplet[2:4]], _HEXDEC[triplet[4:6]]

def triplet(rgb, lettercase=LOWERCASE):
    return format(rgb[0]<<16 | rgb[1]<<8 | rgb[2], '06'+lettercase)

if __name__ == '__main__':
    print('{}, {}'.format(rgb('aabbcc'), rgb('AABBCC')))
    # -> (170, 187, 204), (170, 187, 204)

    print('{}, {}'.format(triplet((170, 187, 204)),
                          triplet((170, 187, 204), UPPERCASE)))
    # -> aabbcc, AABBCC

    print('{}, {}'.format(rgb('aa0200'), rgb('AA0200')))
    # -> (170, 2, 0), (170, 2, 0)

    print('{}, {}'.format(triplet((170, 2, 0)),
                          triplet((170, 2, 0), UPPERCASE)))
    # -> aa0200, AA0200

答案 3 :(得分:17)

我找到了一个简单的方法:

car

答案 4 :(得分:11)

matplotlib

matplotlib使用值为0到1的RGB元组:

from matplotlib.colors import hex2color, rgb2hex

hex_color = '#00ff00'
rgb_color = hex2color(hex_color)
hex_color_again = rgb2hex(rgb_color)

rgb_colorhex_color都采用matplotlib可接受的格式。

webcolors

html使用RGB元组,其值介于0到255之间。

您可以使用模块webcolors在它们之间进行转换,使用函数hex_to_rgbrgb_to_hex

答案 5 :(得分:10)

将rgb转换为十六进制的非常简单的方法

>>> rgb = (255, 255, 255)
>>> r, g , b = rgb
>>> hex(r)
'0xff'
>>> hex(r) + hex(g)[2:] + hex(b)[2:]
'0xffffff'
>>>

将Hex转换为rgb

的简单方法
>>> h  = '0xffffff'
>>> h1, h2, h3 = h[0:4], '0x' + h[4:6], '0x' + h[6:8]
>>> h1, h2, h3
('0xff', '0xff', '0xff')
>>> r, g , b = int(h1, 16), int(h2, 16), int(h3, 16)
>>> r, g, b
(255, 255, 255)

使用提供这些功能的模块:webcolors

>>> hex_to_rgb('#000080')
(0, 0, 128)
>>> rgb_to_hex((255, 255, 255))
'#ffffff'

功能doc:

  

hex_to_rgb(hex_value)    将十六进制颜色值转换为适合在指定该颜色的rgb()三元组中使用的3元组整数。

     

rgb_to_hex(rgb_triplet):    将适合在rgb()颜色三元组中使用的3元组整数转换为该颜色的标准化十六进制值。

答案 6 :(得分:5)

def hex_to_int_color(v):
    if v[0] == '#':
        v = v[1:]
    assert(len(v) == 6)
    return int(v[:2], 16), int(v[2:4], 16), int(v[4:6], 16)

def int_to_hex_color(v):
    assert(len(v) == 3)
    return '#%02x%02x%02x' % v

答案 7 :(得分:3)

十六进制到RGB元组

>>> tuple(bytes.fromhex('61559a'))
(97, 85, 154)

RGB元组转换为十六进制

>>> bytes((97, 85, 154)).hex()
'61559a'

无需导入!


这是什么魔术?!

  

由于字节对象是整数序列(类似于元组),因此   字节对象b,b [0]将是一个整数,而b [0:1]将是一个字节   长度为1的对象

     

...

     

字节对象的表示使用文字格式(b'...')   因为它通常比例如位元组([46,46,46])。您可以   始终使用list(b)将字节对象转换为整数列表。

来源:https://docs.python.org/3/library/stdtypes.html#bytes-objects

答案 8 :(得分:1)

import re

def hex_to_int_color(v):
  return tuple(int(i,16) for i in re.match(
    r'^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$', v,
    flags=re.IGNORECASE).groups())

def int_to_hex_color(v):
  return '#%02x%02x%02x' % v

答案 9 :(得分:1)

你走了。我使用它将$path = "uploads/File Name/"; $files = scandir($path); foreach ($files as $csv_file) { $filepath = str_replace(" ", "\ ", $csv_file); echo $filepath . '<br/>'; unlink($csv_file); } 格式的颜色转换为graphviz颜色格式#RGBA

prefix=#

用法:

def rgba_hex( color, prefix = '0x' ):
    if len( color ) == 3:
       color = color + (255,)
    hexColor = prefix + ''.join( [ '%02x' % x for x in color ] )
    return hexColor