【问题标题】:convert Integers to RGB values and back with Python使用 Python 将整数转换为 RGB 值并返回
【发布时间】:2015-10-14 11:41:21
【问题描述】:

我有两个函数,一个从给定的整数返回 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

标签: python colors integer rgb argb


【解决方案1】:

这两个功能似乎都运行良好。

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.4 升水倒入 1L 瓶中,溢出的水会损失一些水。 当你清空瓶子时,你会发现最大 1L

【讨论】:

  • 我假设上限是 2147483647,但如果我使用 32 位(对于 ARGB 值)并且这里我只使用 24(RGB),则可以使用。我的错误在于输入而不是代码。感谢您指出这一点。
  • 快速说明:在getIfromRGB 中,您可以使用red, green, blue = rgb 使代码更清晰、更简洁,而不是在元组上使用索引。
【解决方案2】:

您的代码没有任何问题。 值不同,因为您将 2147483647 作为输入,将其转换为 十六进制,给出0x7FFFFFFF 作为输出。另一方面,16777215十六进制 中的 0xFFFFFF,所以你明白你的代码实际上没有任何问题,除了你给出了这么大的十进制数作为输入。

如果你输入,你可以测试一下

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

【讨论】:

    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多