web-dev-qa-db-ja.com

Pythonで16進数をRGB値に変換する

ジェレミーの応答をここで処理します: 16進数の色をRGBに変換、またはその逆 pythonプリセット色の16進数コードを変換するプログラム(例#B4FBB8)を取得できましたただし、エンドユーザーの観点から、コードを編集してそこから実行するように人々に依頼することはできません。

これまでのコードは次のとおりです。

_def hex_to_rgb(value):
    value = value.lstrip('#')
    lv = len(value)
    return Tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))


def rgb_to_hex(rgb):
    return '#%02x%02x%02x' % rgb

hex_to_rgb("#ffffff")              # ==> (255, 255, 255)
hex_to_rgb("#ffffffffffff")        # ==> (65535, 65535, 65535)
rgb_to_hex((255, 255, 255))        # ==> '#ffffff'
rgb_to_hex((65535, 65535, 65535))  # ==> '#ffffffffffff'

print('Please enter your colour hex')

hex == input("")

print('Calculating...')
print(hex_to_rgb(hex()))
_

print(hex_to_rgb('#B4FBB8'))を使用して、正しいRGB値(180、251、184)を吐き出すことができます

それはおそらく非常にシンプルです-私はまだPythonでかなり荒いです。

38
Julian White

私はこれがあなたが探していることをしていると信じています:

h = input('Enter hex: ').lstrip('#')
print('RGB =', Tuple(int(h[i:i+2], 16) for i in (0, 2, 4)))

(上記はPython 3)について書かれたものです)

サンプル実行:

Enter hex: #B4FBB8
RGB = (180, 251, 184)

ファイルへの書き込み

書式を保持しながらハンドルfhandleを使用してファイルに書き込むには:

fhandle.write('RGB = {}'.format( Tuple(int(h[i:i+2], 16) for i in (0, 2, 4)) ))
82
John1024

遅延オプション: webcolors パッケージにはhex_to_rgb 関数。

11
vwrobel

ここには2つの小さなエラーがあります!

_hex == input("")
_

する必要があります:

_user_hex = input("")
_

比較をチェックせずに、input()の出力をhexに割り当てます。また、コメント(@koukouviou)で述べたように、hexをオーバーライドせず、代わりに_user_hex_のような名前を付けます。

また:

_print(hex_to_rgb(hex()))
_

する必要があります:

_print(hex_to_rgb(user_hex))
_

型の呼び出し可能メソッド(___call___)ではなく、hexの値を使用する必要があります。

2
Matt Davidson

私が見たすべての答えには、16進文字列の操作が含まれます。私の見解では、文字列だけでなく、エンコードされた整数とRGBトリプル自体を使用したいと思います。これには、色を16進数で表す必要がないという利点があります。つまり、8進数、2進数、10進数などの色を使用できます。

RGBトリプルを整数に変換するのは簡単です。

rgb = (0xc4, 0xfb, 0xa1) # (196, 251, 161)

def rgb2int(r,g,b):
    return (256**2)*r + 256*g + b

c = rgb2int(*rgb) # 12909473
print(hex(c))     # '0xc4fba1'

反対方向の計算がもう少し必要です。同様の 数学交換の質問 への私の答えから、以下を取り上げました。

c = 0xc4fba1

def int2rgb(n):
    b = n % 256
    g = int( ((n-b)/256) % 256 )      # always an integer
    r = int( ((n-b)/256**2) - g/256 ) # ditto
    return (r,g,b)

print(Tuple(map(hex, int2rgb(c)))) # ('0xc4', '0xfb', '0xa1')

このアプローチを使用すると、文字列との間で簡単に変換できます。

0
terrygarcia

フロート版:

 def hextofloats(h):
    return [int(h[i:i + 2], 16) / 255. for i in (1, 3, 5)] # skip '#'

 def floatstohex(rgb):
    return f'#{int(rgb[0]*255):02x}{int(rgb[1]*255):02x}{int(rgb[2]*255):02x}'
0
roberto