为什么这个 Javascript RGB 到 HSL 代码不起作用?
function rgbToHsl(r, g, b){
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];
}
编辑:当我运行 rgbToHsl(126,210,22)
时,它给了我 [ .24, .81 , .45 ],这是橙色的 HSL。
I found this RGB to HSL script over at http://www.mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript. I can't find any other small decent ones. The issue is that this code doesn't even really work. Would anybody know why? (I don't know a bit of color math, but maybe it's returning the complementary?)
function rgbToHsl(r, g, b){
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];
}
Edit: when I run rgbToHsl(126,210,22)
it's giving me [ .24, .81, .45 ], which is the HSL for an orange color.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
生成的 HSV 数组必须解释为三个部分。对于某些程序,如果要将 HSV 表示为整数,请将“H”值乘以 360,将“S”和“V”值乘以 100。为绿色阴影 RGB[126, 210, 22] 是 HSV [87, 81, 45] 的整数。如果您愿意,您可以更改该函数以返回此类整数:
[编辑]也就是说,它仍然给我一些亮度(“L”或“V”)相当太暗的东西; Gimp 说 HSV 值应该是 [90, 80, 82],或者小数形式 [.20, .80, .82]。
[另一个编辑] 嗯,一个问题可能是 HSL 和 HSV 是不同的方案......仍在四处寻找。
好吧,如果有人想要 RGB 到 HSV(例如您在 Gimp 中看到的),这里有一个版本:
编辑请注意,有几条评论表明
Math.round() 可能会比
Math.floor()
给出更好的答案。The resulting HSV array has to be interpreted as three fractions. For some programs, if you want to express HSV as integers, you multiply the "H" value by 360 and the "S" and "V" values by 100. The HSV value you quote for your green shade RGB[126, 210, 22] is HSV [87, 81, 45] in integers. You could change the function to return such integers if you want to:
[edit] that said, it's still giving me something with a brightness ("L" or "V") that's considerably too dark; Gimp says that the HSV value should be [90, 80, 82], or in fractional terms [.20, .80, .82].
[another edit] well one problem could be that HSL and HSV are different schemes ... still looking around.
OK in case anybody wants RGB to HSV (like you'd see in Gimp for example) here's a version of that:
edit note that a couple comments suggest that
Math.round()
might give better answers thanMath.floor()
, if anybody wants to experiment.简短但精确
看起来你的代码没问题(但它返回hue=0.24 - 将其乘以360度以获得角度整数值) - 但是尝试这个较短的代码(更多:hsl2rgb,rgb2hsv,hsv2rgb 和 sl22sv):
我开发了 S_HSL wiki 公式(由绿色边框标记) - 其中 MAX=max(r, g,b) 和 MIN=min(r,g,b) - 在上面的代码中我做了一些改进并制作 分析表明结果是正确的。这使我能够在最后得到相当短的代码
Short but precise
It looks that your code is ok (but it returns hue=0.24 - multiply this by 360 degree to get angle integer value) - however Try this shorter one ( more: hsl2rgb, rgb2hsv, hsv2rgb and sl22sv):
I develop S_HSL wiki formulas (marked by green border) - where MAX=max(r,g,b) and MIN=min(r,g,b) - and in above code I make some improvements and make analysis which shows that results are correct. This allows me to get quite short code at the end
下面的函数将
RGB
颜色转换为色调饱和度亮度颜色,如 Photoshop 颜色选择器,结果范围为:我仍然不明白为什么人们使用术语
HSV
(色相饱和度值)而不是HSB
(色相饱和度亮度),无论如何,这是一个术语问题,结果是相同的用法示例:
Function below converts
RGB
color into Hue Saturation Brightness color like Photoshop color picker, results are in the ranges:I still don't understand why people use the term
HSV
(Hue Saturation Value) instead ofHSB
(Hue Saturation Brightness), anyway it's a matter fo terminology, the results are the sameUsage example:
您必须更改为 hsl 格式,就像
hsl(155,100%,30%)
一样,可以在 HTML 中使用。You have to change to the hsl format just like
hsl(155,100%,30%)
, that can be use in HTML.