2014-09-24 3 views
0

Я читаю значения от чего-то в Python. Значения приходят в странном формате. В документации сказано:Как преобразовать этот формат RGB в Python

Color is represented by a single value from 0 to 8355711. The RGB(r,g,b) function calculates 
((R*127 x 2^16) + (G*127 x 2^8) + B*127), where R, G and B are values between 0.00 and 1.00 

Som, красный цвет имеет значение 16712965 Я хотел бы знать, как «распаковать» эти значения как кортеж или что-то, но борюсь с этой математикой. Если это невозможно, способ конвертировать это значение в значение rgb каким-то образом будет отличным. Пожалуйста помоги! Спасибо

+0

Вы пробовали делиться? –

+0

Да, но я не уверен, как я могу разделить одно целое на три ... – Startec

+1

Все, что он делает, это преобразование его в шестнадцатеричное (умножение на степенями 2 - это то же, что и сдвиги бит). Попробуйте переходить на googling взад и вперед между шестнадцатеричным и rgb, он покрыт повсюду, включая так, например, здесь http://stackoverflow.com/questions/214359/converting-hex-color-to-rgb-and-vice-versa –

ответ

1

у вас есть ошибка в тексте

  • Красный = 16712965 = 0xFF0505h
  • находится вне зоны действия заявляемого предела 8355711 = 7F7F7Fh

Так что именно ваш источник и цветной формат назначения ???

  • наиболее распространенным является 8bit на R, G, B каналов упакованы в 32-битовое значение
  • ваш выглядит как 8bit на канал (7bit используется) упакованы в ?? бит

Что именно вы хотите?

  • двойные значения R, G, B в диапазоне < 0,0,1,0> от int col?
  • не питон кодера в C++ это выглядит следующим образом:

    // 8(7 used) bit per channel 
    double R=double(col>>16)/127.0; 
    double G=double(col>> 8)/127.0; 
    double B=double(col )/127.0; 
    
    // 8 bit per channel 
    double R=double(col>>16)/255.0; 
    double G=double(col>> 8)/255.0; 
    double B=double(col )/255.0; 
    
  • x>>n означает арифметический бит сдвиг вправо (заполняющие нули к MSB бит) значения х на п бит

  • это то же самое as x/(2^n)

Если вы хотите разные конверсии, вы должны указать его.

+0

Спасибо за обнаружение ошибки. Не знаю, как это произошло. Вы прекрасно это объяснили. – Startec

1

Обратите внимание на 2^8 и 2^16 в формуле, это предполагает, что вы можете использовать что-то похожее на правый сдвиг в C. Разделение входного номера на 2^8 = 256 эквивалентно 8-битовому сдвигу вправо. Еще один момент, который следует обратить внимание на то, что ваши выходные значения R, G, B являются действительными числами. Таким образом, вы хотите использовать функцию float во время вычислений.

c = 8355711 
print 'input colour', c 

# conversion to RGB format 
B = float(c % 256)/127.0 
c = c/256 
G = float(c % 256)/127.0 
c = c/256 
R = float(c % 256)/127.0 

print R, G, B 

# reverse calculation for verifying the result 
colour = int((R*127 * 65536) + (G*127 * 256) + B*127) 
print colour 
+0

Это очень похоже на то, что я не уверен, что моя математика правильная: например, когда я попробую ваш результат со следующим: 'c = 8912743 B = float (c% 256) /127.0 c = c/256 G = float (c% 256) /127.0 c = c/256 R = float (c% 256)/127.0 печати (R, G, В) цвет = INT ((R * 127 * 65536) + (G * 127 * 256) + В * 127) печати (цвет) ' То же значение не является (хотя очень близко). аналогично, значения RGB, по-видимому, находятся между чем-то отличным от 0 - 1 (от 1 до 3, возможно?) – Startec

+0

@Startec с информацией, которую вы указали '8912743', должен быть недопустимым цветом, единственный способ его создания - 'G = 2.0079'. –

Смежные вопросы