(0、128、64)をこの#008040のようなものに変換する必要があります。後者を何と呼ぶかわからないので、検索が難しくなります。
(0、128、64)をこの#008040のようなものに変換する必要があります。後者を何と呼ぶかわからないので、検索が難しくなります。
回答:
フォーマット演算子を使用します%
:
>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'
境界をチェックしないことに注意してください...
>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
'#%x%x%x' % (r, g, b)
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値として扱い、それらの値に対応する色を返します。
これは古い質問ですが、参考までに、色とカラーマップに関連するいくつかのユーティリティを含むパッケージを開発し、トリプレットをヘキサ値に変換しようとしているrgb2hex関数が含まれています(matplotlibなどの他の多くのパッケージにあります)。pypiにあります
pip install colormap
その後
>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'
入力の有効性がチェックされます(値は0から255の間でなければなりません)。
私はそれのために完全な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への変換
これは、[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))
これは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
ラムダ文字列と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
このようなもので効率が心配になるとは思えませんが、かなり効率的なビット演算子を使用することもできます。また、比較的きれいです。境界をクランプまたはチェックしないことに注意してください。これは、少なくともPython2.7.17以降でサポートされています。
hex(r << 16 | g << 8 | b)
そしてそれを変更して#で始まるようにするには:
"#" + hex(243 << 16 | 103 << 8 | 67)[2:]
誰もこのアプローチを提案しなかったことに本当に驚いています。
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
webcolorsというパッケージがあります。https://github.com/ubernostrum/webcolors
方法があります webcolors.rgb_to_hex
>>> import webcolors
>>> webcolors.rgb_to_hex((12,232,23))
'#0ce817'