将 RGB 颜色值转换为十进制
Convert a RGB colour value to Decimal
如何将 RGB 颜色值转换为纯小数?
所以我有:RGB(255,255,255(是白色
的其十进制等效值为:16777215
我试过认为它可能只是:
var dec = r*g*b; // but this doesn't work
虽然这行不通。
有人知道从RGB(或rgba(转换为十进制的算法/方程式吗?
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
(等(。
更好的答案(就清晰度而言(是这样的:
'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
LONG 是您要创建的长整数(十进制(。容易吧?当然,位移
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);
我同意位移更清晰,性能可能更好。
也就是说,如果你由于语言支持(例如在电子表格中这样做(而想要一个数学答案,模数%和trunc((或floor((使它变得简单:
当然,假设红绿蓝有 8 位值 (0-255(:
var rgbTotal = red * 65536 + green * 256 + blue;
var R = Math.trunc( rgbTotal / 65536 );
var G = Math.trunc( ( rgbTotal % 65536 ) / 256 );
var B = rgbTotal % 256;
讨论:指出sam的答案,RGB值在顺序方面几乎总是大端序,当然在网页,jpeg和png上也是如此。就我个人而言,我认为最好将红色乘以 65536 而不是蓝色,除非您使用的是需要它的库。
要返回到单独的值:
- 对于 R,只需除以 65536 并截断余数。
- 对于 G,我们通过 mod 65536 丢弃 R,然后除以 256,截断余数(余数为蓝色(。
- 对于 B,我们采用 mod 256,它处理了两个更高的字节。
对于R&G,数字需要被截断以丢弃余数,特定于语言,主要是我们想要整数。在javascript中,Math.trunc((是简单的方法,Math.floor((也可以工作。B 不需要它,因为它是模数的余数——但这也假设我们不需要错误检查,例如来自用户输入,即 B 的值始终是整数 0-255。
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 值顺序。 我似乎记得至少一个顺序颠倒了(根据我最初的答案(,但我认为目前是哪一个。
您需要将 R 左移 16,将 G 左移 8,或两者在 B 中左移。 将值视为位,一切都会变得清晰:
R 255 = 11111111BG 255 = 11111111BB 255 = 11111111B
班次 R 16:111111110000000000000000班次 G 8:000000001111111100000000
或进入 B:111111111111111111111111
转换为十进制:16777215
- 需要帮助编写在不使用toString的情况下将十进制转换为二进制的代码
- 如何将二进制分数转换为十进制
- 将一个十进制数转换成八分之一的分数
- 阻止jQuery Flot将数字转换为十进制
- 无需Javascript内置函数即可将十进制转换为十六进制
- 将数字转换为十进制
- 如何在 JavaScript 中将大十进制值转换为十进制值
- 停止 javascript 自动从十进制转换为字符串
- 如何将负十进制转换为十六进制
- 如何将十进制小时值转换为 hh:mm:ss
- 将 GPS 坐标转换为距离,并以十进制度为单位将距离转换为半径
- 递归“超出最大调用堆栈大小” - 十进制到十六进制转换器
- 将十进制数转换为浮点数并将其截断
- 如何使用 jQuery 将十进制数转换为分数
- 如何在JS中将十进制转换为二进制
- 将十进制转换为十六进制缺少填充的 0
- Javascript将十进制转换为十六进制
- 如何在JavaScript中将RGB十进制转换为十六进制颜色
- parseInt 不将十进制转换为二进制
- 将带符号的十进制转换为用两个's补码