преобразование целых чисел в значения RGB и обратно с помощью Python

у меня есть две функции, одна для возврата значений 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 () неверен, но я могу ошибаться и это тоже.

2 ответов


обе функции, похоже, работают нормально.

максимальное значение, выраженное 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)

Viceversa,

i2 = getIfromRGB(colr1)

правильно дает

16777215

что максимальное значение вы можете представлять с 24 битами (т. е. mx выше).

если вы льете 1,4 литра воды в бутылке 1л, то некоторая вода будет потеряна в переполнении. Когда вы опорожните бутылку, вы найдете 1L на max


в вашем коде нет ничего плохого. значения разные, потому что вы даете 2147483647 как вход, который, в переводе на шестнадцатеричное, передает 0x7FFFFFFF в качестве выходного. С другой стороны,--4-->16777215 is 0xFFFFFF на шестнадцатеричное, поэтому вы понимаете, что на самом деле нет ничего плохого в вашем коде, кроме того факта, что вы даете такое большое десятичное число в качестве ввода.

вы можете проверьте это, если вы вводите:

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