使用Python将整数转换为RGB值并进行反向转换

15

我有两个函数,一个从给定的整数返回RGB值,另一个函数则相反,提供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()函数则不正确,但是我也可能是错的。


它们都可以正常工作,因为0xFFFFFF等于16777215。 - Pynchia
2个回答

9

这两个函数似乎都运行正常。

一个用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)。

如果你往一个1升的瓶子里倒入1.4升的水,会有一些水会溢出。 当你倒空瓶子时,最多只能找到1升水。


2
我以为上限是2147483647,但如果我使用32位(对于ARGB值),那么这个数字是正确的,而在这里我只使用了24位(RGB)。我的错误在于输入而不是代码。感谢您指出这一点。 - M_PF
一个快速的提示:在 getIfromRGB 中,你可以使用 red, green, blue = rgb 来使代码更清晰、更简洁,而不是使用元组的索引。 - Pynchia

4

您的代码没有问题。 值不同,是因为您输入了2147483647,这在十六进制中翻译成0x7FFFFFFF。另一方面,16777215十六进制中是0xFFFFFF,所以您实际上的代码没有问题,除了您输入了如此大的十进制数。

如果您键入以下内容,则可以进行测试

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接