convert Integers to RGB values and back with Python

20,391

Solution 1

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

Solution 2

There's nothing wrong with your code. The values are different, because you are giving 2147483647 as input, which, translated to hexadecimal, gives 0x7FFFFFFF as an output. On the other hand, 16777215 is 0xFFFFFF in hexadecimal, so you understand there is nothing wrong with your code actually, apart from the fact that you are giving such a big decimal number as an input.

You can test this if you type:

print i1 & 0xFFFFFF, i2 # this will return equal values
Share:
20,391
M_PF
Author by

M_PF

Updated on July 09, 2022

Comments

  • M_PF
    M_PF almost 2 years

    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.

  • M_PF
    M_PF over 8 years
    i assumed the upper limit was 2147483647 but that works if i'm using 32bits (for an ARGB value) and here Im only using 24 (RGB). My mistake is in the input not the code. thanks for pointing that out.
  • Pynchia
    Pynchia over 8 years
    a quick note: in getIfromRGB you can make the code clearer and more concise with red, green, blue = rgb instead using indexes on the tuple.