2011-12-12 67 views
8

如何将RGB颜色值转换为普通小数?将RGB颜色值转换为十进制

所以我有:RGB(255,255,255)是白色
相应的十进制数为:16777215

我试图想它可能只是:

var dec = r*g*b; // but this doesn't work 

虽然不工作。

任何人都知道从RGB(或rgba)转换为十进制的算法/公式?

+2

16,777,215是RGB(255,255,255)的十六进制版本0x00FFFFFF的十进制等效值。 –

+0

你打算如何处理这些值?你给他们什么软件/功能/等? –

+0

我有一个Flash应用程序的颜色值,它是十进制的,我需要在html/css中显示它们,并且也可以将其转换回去。 –

回答

10

通常将RGB整数视为三个不同的字节,其中最左侧(最高位)字节为红色,中间字节为绿色,最右侧(最低位)字节为蓝色。你可以检索这些单个字节的值是这样的:

var c = 0xff03c0; // 16712640 
var components = { 
    r: (c & 0xff0000) >> 16, 
    g: (c & 0x00ff00) >> 8, 
    b: (c & 0x0000ff) 
}; 

您可以通过转移字节后面再从其组件创建一个颜色:

c = (components.r << 16) + (components.g << 8) + (components.b); 

在你的情况下,可以替换components.r (等)与你的实际变量。

3
var dec = (b & 0xff) << 16 + (g & 0xff) << 8 + (r & 0xff); 

(我认为这是对R,G,B值按正确的顺序)

更新

我只是检查浏览器的应用程序和我得到的顺序不对,所以正确的公式浏览器(HTML读+ CSS + JavaScript的)为:

var dec = r << 16 + g << 16 + b; 

假设R,G,b值< = 255

其他API的r,g,b值可能会有不同的顺序。我似乎记得至少有一个顺序颠倒过来(按我的原始答案),但我认为它现在是哪一个。

+0

你可能是正确的关于订单,在这种情况下,我的答案是错误的:( –

+0

正确的顺序在什么?对谁?订单取决于谁的*阅读*的价值。 –

+0

@Nicol - 不,正确的顺序取决于API。我不确定Win32 API,但对于基于浏览器的应用程序(我假设这里正在讨论),我很肯定Blue是三个字节中的高位字节,红色是低位字节 –

0

需要到R 16的左移位,所述的G向左8和或二者的B.看值作为比特和所有将变得清楚:

- [R 255 = 11111111B ģ 255 = 11111111B 乙255 = 11111111B

移位R 16:111111110000000000000000 移位克8-:000000001111111100000000

或成B:111111111111111111111111

便利着想rt到十进制:16777215

1
if (color.substr(0, 1) === '#') { 
    return color; 
} 
var digits = /(.*?)rgb\((\d+), (\d+), (\d+)\)/.exec(color); 
var red = parseInt(digits[2]); 
var green = parseInt(digits[3]); 
var blue = parseInt(digits[4]); 
var rgb = blue | (green << 8) | (red << 16); 
return rgb.toString(10); 
+1

rgb.toString(10)是需要的 –

5

更好的答案(在清晰度方面)是这样的:

'Convert RGB to LONG: 
LONG = B * 65536 + G * 256 + R 

'Convert LONG to RGB: 
B = LONG \ 65536 
G = (LONG - B * 65536) \ 256 
R = LONG - B * 65536 - G * 256 

长,你想使你的长整型(十进制)。 容易吧? 当然,bitshift

+1

我认为位移更清晰。 –

+0

@ DanielA.White可能不这么认为,但我看不出这个问题的答案是如何清晰的。即使我能理解这一点。 –