преобразование целых чисел в значения 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