将 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
- C++:二进制到十进制w/转换过程的外观
- 十六进制到十进制转换的未清理答案
- 如何在C++中将二进制编码十进制转换为 int
- 以正确的顺序从十进制转换为二进制
- Arduino 十六进制到十进制转换
- 使用指数将十进制转换为二进制
- 从十进制转换为 BCD
- 使用堆栈将字符串格式的十进制转换为双精度
- 混乱将十进制转换为C 中的十六进制
- 使用位操作员将十进制转换为八十位
- 将长 64 位十进制转换为二进制
- 将十进制转换为十六进制,找不到我的逻辑错误
- 试图制作一个将十进制转换为二进制和ASCII C++的表
- 将字符串中的十进制转换为二进制时出错
- 用正确的位大小在c++中将十进制转换为二进制
- 在编译时将十进制转换为十六进制
- 为什么将十进制转换为二进制的递归方法比迭代、使用和返回字符串更快
- 将十进制转换为 32 位二进制
- 以最佳方式将十进制转换为二进制
- 使用分而治之的二进制到十进制转换