确定颜色的 RYB 补色
Determining the RYB complement of a color
我正在尝试在 RYB space 中获得颜色的色彩和谐。我已成功实现 RGB 和声,但无法使 RYB 和声正常工作。他们离 FAR 远了。
我的程序获取 HEX/HTML 颜色,将其转换为 RGB,将 RGB 转换为 RYB,将 RYB 转换为 HSL,然后通过增加色调从那里执行和谐计算。我使用 https://www.rapidtables.com/convert/color/rgb-to-hsl.html 上的公式将 RYB 转换为 HSL。在该页面上,它给出了将 RGB 转换为 HSL 的公式。我只是使用 RYB 值代替 RGB。下面是我用来将 RGB 转换为 RYB 的公式:
var r = color[0], g = color[1], b = color[2];
// Remove the whiteness from the color.
var w = Math.min(r, g, b);
r -= w;
g -= w;
b -= w;
var mg = Math.max(r, g, b);
// Get the yellow out of the red+green.
var y = Math.min(r, g);
r -= y;
g -= y;
// If this unfortunate conversion combines blue and green, then cut each in
// half to preserve the value's maximum range.
if (b && g) {
b /= 2.0;
g /= 2.0;
}
// Redistribute the remaining green.
y += g;
b += g;
// Normalize to values.
var my = Math.max(r, y, b);
if (my) {
var n = mg / my;
r *= n;
y *= n;
b *= n;
}
// Add the white back in.
r += w;
y += w;
b += w;
// And return back the ryb typed accordingly.
return [r, y, b];
}
在RYB中得到红色的补色时,应该是绿色。在RGB中得到红色的补色时,应该是青色。无论如何,我的程序都会给出青色。
该程序应该给我这个:http://prntscr.com/o16ava
相反,它给了我:http://prntscr.com/o16b08
它无法正常工作,因为正如您在评论中提到的,当您将 ryb 转换为 hsl 时,您将 ryb 视为 rgb。
当您 运行 上面发布的代码具有以下值时:红色 = 255,绿色 = 0,蓝色 = 0
它 returns 值:红色 = 255,黄色 = 0,蓝色 = 0
接受赞美:红色 = 0,黄色 = 255,蓝色 = 255
如果您随后将其传递给旨在将 rgb 转换为 hsl 的函数,它将像您告诉它进行转换一样计算它:红色 = 0,绿色 = 255,蓝色 = 255
这是青色。
您需要将 ryb 转换回 rgb,或者获取旨在将 ryb 转换为 hsl 的函数。
我正在尝试在 RYB space 中获得颜色的色彩和谐。我已成功实现 RGB 和声,但无法使 RYB 和声正常工作。他们离 FAR 远了。
我的程序获取 HEX/HTML 颜色,将其转换为 RGB,将 RGB 转换为 RYB,将 RYB 转换为 HSL,然后通过增加色调从那里执行和谐计算。我使用 https://www.rapidtables.com/convert/color/rgb-to-hsl.html 上的公式将 RYB 转换为 HSL。在该页面上,它给出了将 RGB 转换为 HSL 的公式。我只是使用 RYB 值代替 RGB。下面是我用来将 RGB 转换为 RYB 的公式:
var r = color[0], g = color[1], b = color[2];
// Remove the whiteness from the color.
var w = Math.min(r, g, b);
r -= w;
g -= w;
b -= w;
var mg = Math.max(r, g, b);
// Get the yellow out of the red+green.
var y = Math.min(r, g);
r -= y;
g -= y;
// If this unfortunate conversion combines blue and green, then cut each in
// half to preserve the value's maximum range.
if (b && g) {
b /= 2.0;
g /= 2.0;
}
// Redistribute the remaining green.
y += g;
b += g;
// Normalize to values.
var my = Math.max(r, y, b);
if (my) {
var n = mg / my;
r *= n;
y *= n;
b *= n;
}
// Add the white back in.
r += w;
y += w;
b += w;
// And return back the ryb typed accordingly.
return [r, y, b];
}
在RYB中得到红色的补色时,应该是绿色。在RGB中得到红色的补色时,应该是青色。无论如何,我的程序都会给出青色。 该程序应该给我这个:http://prntscr.com/o16ava 相反,它给了我:http://prntscr.com/o16b08
它无法正常工作,因为正如您在评论中提到的,当您将 ryb 转换为 hsl 时,您将 ryb 视为 rgb。
当您 运行 上面发布的代码具有以下值时:红色 = 255,绿色 = 0,蓝色 = 0
它 returns 值:红色 = 255,黄色 = 0,蓝色 = 0
接受赞美:红色 = 0,黄色 = 255,蓝色 = 255
如果您随后将其传递给旨在将 rgb 转换为 hsl 的函数,它将像您告诉它进行转换一样计算它:红色 = 0,绿色 = 255,蓝色 = 255
这是青色。
您需要将 ryb 转换回 rgb,或者获取旨在将 ryb 转换为 hsl 的函数。