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()が正しくないように見えますが、それについても間違っている可能性があります。
どちらの機能も正常に機能しているようです。
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になります
コードに問題はありません。入力として2147483647を指定しているため、値が異なります。これは、hexadecimal、出力として0x7FFFFFFF
を返します。一方、16777215はhexadecimalの0xFFFFFF
であるため、コードに問題はないことがわかります。実際には、入力としてこのような大きな10進数を指定しているという事実は別として。
入力すればこれをテストできます:
print i1 & 0xFFFFFF, i2 # this will return equal values