PythonでRGBカラータプルを6桁のコードに変換する


93

(0、128、64)をこの#008040のようなものに変換する必要があります。後者を何と呼ぶか​​わからないので、検索が難しくなります。


以前のSOの回答を参照してくださいstackoverflow.com/questions/214359/…-3つの回答のうち、投票数が最も多いのは、あなたが求めていると思うことを実行するためのスタンドアロンのPythonコードスニペットです。
ダグ2010

3
あなたが探している用語はHexTripletです。en.wikipedia.org/wiki/Hex_color#Hex_triplet
Mark Ransom

:ここよりもはるかに良い答えと、より一般的な質問については、stackoverflow.com/a/57197866/624066
MestreLion

回答:


191

フォーマット演算子を使用します%

>>> '#%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を2桁にします。
wordsforthewise

52
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つの整数を期待し、そのような3つの整数を渡すと常に色を返すことは明らかです。ただし、コメントから、これはすべての人に明らかではない可能性があるため、明示的に述べてください。

3つの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:easydev.toolsという名前のモジュールがありません」というエラーが発生しました。それに対する解決策を提案できますか?
Abhils

easydevを再インストールしてみてください。次に、「pip3installeasydev」。
ShounakRay20年

16

私はそれのために完全なPythonプログラムを作成しました。次の関数は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の10進値では機能しません。解決策を教えていただけますか?
Abhils

円形。最終的な色に大きな違いはないはずです。
ShounakRay20年

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

これは、[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))

これはすごい!本当に一般的な関数。Thx、リチャード!
SungheeYun20年

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

この関数rgb2hexを(13,13,12)に適用すると、0xDDCが得られますが、WebサイトのRGBからHEXでは0x0D0D0Cとして得られます。これは、数値を13 * 65536 + 13 * 256 +12にする必要があるという考えとも一致します。 0xDDCはPythonによって3548として読み取られます。–
Lars Ericson

CSSの色に一貫性がありません。6桁の16進色、3桁の16進色、小数とパーセンテージのrgb表記、hslなどがあります。常に6桁の16進色を提供するように式を微調整しました。より一貫性があると思いますが、私はそれがもっと正しいかどうかはわかりません。
Brian Bruggeman 2018年

3

ラムダ文字列とf文字列を使用できます(Python 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)

Pythonのワンライナーは必ずしも親切に見られているわけではないことを私は知っています。しかし、Pythonパーサーが許可することを利用することに抵抗できない場合があります。これはDietrichEppのソリューション(最良)と同じ答えですが、1行の関数にまとめられています。だから、ディートリッヒありがとう!

私は今tkinterでそれを使っています:-)


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

このようなもので効率が心配になるとは思えませんが、かなり効率的なビット演算子を使用することもできます。また、比較的きれいです。境界をクランプまたはチェックしないことに注意してください。これは、少なくともPython2.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.