如何在Python中转换此RGB格式

如何在Python中转换此RGB格式,python,math,colors,Python,Math,Colors,我正在从Python中读取一些值。这些值的格式很奇怪。文件说: Som,红色的值为16712965我很想知道如何将这些值“解包”为元组之类的东西,但我正在努力解决这个问题。如果这是不可能的,以某种方式将该值转换为rgb值的方法将非常有用。请帮忙!感谢注意公式中的2^8和2^16,这表明您可以使用类似于C中右移的东西。将输入数字除以2^8=256相当于8位右移。这里需要注意的另一点是,R,G,B的输出值是实数。因此,您希望在计算过程中使用float函数 c = 8355711 print 'inp

我正在从Python中读取一些值。这些值的格式很奇怪。文件说:


Som,红色的值为
16712965
我很想知道如何将这些值“解包”为元组之类的东西,但我正在努力解决这个问题。如果这是不可能的,以某种方式将该值转换为rgb值的方法将非常有用。请帮忙!感谢

注意公式中的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

你的文字有错误

  • 红色=16712965=0xFF0505h
  • 超出您的索赔限额范围8355711=7F7F7Fh
那么,您的源和目标颜色格式是什么

  • 最常见的是每R、G、B通道8位压缩为32位值
  • 您的每个频道看起来像8比特(使用了7比特)打包到??位值
你到底想要什么

  • 双R、G、B值,范围为int col
  • 在C++中,不是Python编码器,它看起来是这样的:

    // 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
    表示将值x的算术位右移n位(将零填充到MSB位)

  • 它与
    x/(2^n)

如果需要不同的转换,则必须指定它。

是否尝试过除法?是的,但我不确定如何将一个整数拆分为三个…它所做的只是将其转换为十六进制(乘以2的幂等于位移位)。试着用谷歌搜索在十六进制和rgb之间来回转换,到处都是,包括这里,你试过模了吗?这看起来非常接近,但是,我不确定我的数学是否正确:例如,当我尝试以下结果时:
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 print(R,G,B)color=int((R*127*65536)+(G*127*256)+B*127)print(color)
不会返回相同的值(但非常接近)。类似地,RGB值似乎介于0-1之外的值(可能介于1和3之间?)@Startec,您提供的信息
8912743
应为无效颜色,生成它的唯一方法是使用
G=2.0079
。感谢您捕获错误。我不知道这是怎么发生的。你解释得很好。
// 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;