web-dev-qa-db-ja.com

整数をRGB値に変換し、Python

2つの関数があります。1つは指定された整数からRGB値を返す関数で、もう1つはその逆を実行し、整数を返すRGB値を提供します。 RGBに変換した整数がRGBから元の整数値に戻るかどうかを確認してこれをテストしていますが、異なる値を取得しています。

def getRGBfromI(RGBint):
    blue =  RGBint & 255
    green = (RGBint >> 8) & 255
    red =   (RGBint >> 16) & 255
    return red, green, blue

def getIfromRGB(rgb):
    red = rgb[0]
    green = rgb[1]
    blue = rgb[2]
    print red, green, blue
    RGBint = (red<<16) + (green<<8) + blue
    return RGBint

テスト:

i1 = 2147483647
colr1 = getRGBfromI(i1)
print colr1 # returns (255,255,255)

i2 =getIfromRGB(colr1)

print i1, i2 # returns 2147483647 16777215

私には、getRGBfromI()が正しく、getIfromRGB()が正しくないように見えますが、それについても間違っている可能性があります。

11
M_PF

どちらの機能も正常に機能しているようです。

24ビット整数で表される最大値(今のところ符号を忘れてください)は

mx = pow(2,24)-1 # i.e. 16777215

そう

i1 = 2147483647

mxよりも高く

colr1 = getRGBfromI(i1)

正しく与える

(255, 255, 255)  # better to view it in hex as 0xFFFFFF

24より高いビットを切り取るため(0xFFFFFFは0から23までのビットを占有します)

逆に、

i2 = getIfromRGB(colr1)

正しく与える

16777215

これは、24ビットで表すことができる最大値です(つまり、上記のmx)。

1Lのボトルに1.4リットルの水を注ぐと、オーバーフローでいくらかの水が失われます。ボトルを空にすると、最大で1Lになります

9
Pynchia

コードに問題はありません。入力として2147483647を指定しているため、値が異なります。これは、hexadecimal、出力として0x7FFFFFFFを返します。一方、16777215hexadecimal0xFFFFFFであるため、コードに問題はないことがわかります。実際には、入力としてこのような大きな10進数を指定しているという事実は別として。

入力すればこれをテストできます

print i1 & 0xFFFFFF, i2 # this will return equal values
4
nikaltipar