Search code examples
pythoncolorsintegerrgbargb

convert Integers to RGB values and back with Python


I have two functions, one to return RGB values from a given Integer, and the other function does the reverse, providing it with RGB values it returns an Integer. I'm testing this by seeing if the integer i convert to RGB turns back from RGB into the original integer value, but I'm getting different values.

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

the test:

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

i2 =getIfromRGB(colr1)

print i1, i2 # returns 2147483647 16777215

To me it seems like the getRGBfromI() is correct and the getIfromRGB() is incorrect, but I may be wrong about that too.


Solution

  • Both functions seem to be working fine.

    The max value expressed by a 24 bit integer (forget the sign for now) is

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

    So

    i1 = 2147483647
    

    is higher than mx and

    colr1 = getRGBfromI(i1)
    

    correctly gives

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

    since it cuts out the bits higher than 24 (0xFFFFFF occupies bits from 0 to 23)

    Viceversa,

    i2 = getIfromRGB(colr1)
    

    correctly gives

    16777215
    

    which is the max value you can represent with 24 bits (i.e. the mx above).

    If you pour 1.4 litres of water in a 1L bottle, some water will be lost in the overflow. When you empty the bottle, you will find 1L at max