如何使用HSL到RGB转换功能
How to Use HSL to RGB Conversion Function
感觉我在这里错过了一些非常简单的东西,但我无法从 HSL 到 RGB 颜色转换的答案中发布的公式起作用。有问题的函数是:
function hslToRgb(h, s, l){
var r, g, b;
if(s == 0){
r = g = b = l; // achromatic
}else{
function hue2rgb(p, q, t){
if(t < 0) t += 1;
if(t > 1) t -= 1;
if(t < 1/6) return p + (q - p) * 6 * t;
if(t < 1/2) return q;
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
return p;
}
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
}
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}
我相信,我的问题是关于输入什么作为我的"h"参数。通常,在 CSS 或 Photoshop 中使用 HSL 时,色调值是介于 0 和 360 之间的数字,但此函数调用的值介于 0 和 1 之间。有人可以向我解释一下,例如,如何将 240 的色调值转换为 0 到 1 之间的等效值,以便我可以将其代入此公式?我尝试将 240 除以 360,但这不起作用。
看起来原始算法是错误的。根据维基百科,你可以获得独立于色调的色度和亮度调整(因此类似的b值),但其他任何事情都需要更多的数学 - 特别是模。看起来该算法不能很好地处理该特定转换,特别是考虑到它期望色调在 [0, 1] 范围内。请尝试以下算法:
// expected hue range: [0, 360)
// expected saturation range: [0, 1]
// expected lightness range: [0, 1]
var hslToRgb = function(hue, saturation, lightness){
// based on algorithm from http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB
if( hue == undefined ){
return [0, 0, 0];
}
var chroma = (1 - Math.abs((2 * lightness) - 1)) * saturation;
var huePrime = hue / 60;
var secondComponent = chroma * (1 - Math.abs((huePrime % 2) - 1));
huePrime = Math.floor(huePrime);
var red;
var green;
var blue;
if( huePrime === 0 ){
red = chroma;
green = secondComponent;
blue = 0;
}else if( huePrime === 1 ){
red = secondComponent;
green = chroma;
blue = 0;
}else if( huePrime === 2 ){
red = 0;
green = chroma;
blue = secondComponent;
}else if( huePrime === 3 ){
red = 0;
green = secondComponent;
blue = chroma;
}else if( huePrime === 4 ){
red = secondComponent;
green = 0;
blue = chroma;
}else if( huePrime === 5 ){
red = chroma;
green = 0;
blue = secondComponent;
}
var lightnessAdjustment = lightness - (chroma / 2);
red += lightnessAdjustment;
green += lightnessAdjustment;
blue += lightnessAdjustment;
return [Math.round(red * 255), Math.round(green * 255), Math.round(blue * 255)];
};
它可能在一些边缘情况下失败,但这些应该是简单的修复
相关文章:
- 如何分解jQuery"toggle”;函数转换为separate“;显示“;以及“;隐藏“;功能
- 将自定义Google Sheets功能转换为附加组件
- 是否有将基于字符串的JSON转换为Mongoose Schema对象实例的本地功能
- 这个javascript代码有什么错误,它有将数字转换为单词的功能
- 修复Javascript代码以将文本中的所有Youtube链接转换为Youtube ID功能
- 是否有一种功能齐全的范式语言可以转换为JavaScript
- 将复选框转换为图像,需要添加拖动功能才能更改图像
- 下拉菜单转换为单选按钮,不再触发特定功能
- 如何将这些代码和我的想法转换为功能思维(Clojure)
- 将 SVG 转换为图像时画布到 URL 功能出现问题
- 将现有的jQuery从点击功能转换为延迟自动显示
- JavaScript 温度转换功能将不起作用
- 如何使用HSL到RGB转换功能
- 尝试删除电子邮件形式的PHP重定向功能并将其转换为弹出消息
- 将 jQuery 和 CSS3 滚动效果从功能垂直滚动转换为所需水平滚动的问题
- Json Object不能使用parse.com云功能Android强制转换为Float
- 在另一个函数中添加Google转换功能
- 麻烦与javascript测量转换功能.“如果. .其他如果. .else"
- 日期转换功能在Firefox中不起作用
- Sencha Touch Model字段转换功能失败