将 RGB 颜色值转换为十进制

Convert a RGB colour value to Decimal

本文关键字:十进制 转换 颜色值 RGB      更新时间:2023-09-26

如何将 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