Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将HSL转换为RGB时出现问题_Algorithm_Rgb_Hsl - Fatal编程技术网

Algorithm 将HSL转换为RGB时出现问题

Algorithm 将HSL转换为RGB时出现问题,algorithm,rgb,hsl,Algorithm,Rgb,Hsl,我试图将HSL值转换为RGB,但我得到了奇怪的结果,如果色调值约为180,则生成的RGB为负值,具体取决于亮度值 我的实施: public class HSLtoRGB { private static float hueToRGB(float m1, float m2, float h) { if(h < 0) { h += 1.0f; } else if(h > 1.0f) { h -= 1.

我试图将HSL值转换为RGB,但我得到了奇怪的结果,如果色调值约为180,则生成的RGB为负值,具体取决于亮度值

我的实施:

public class HSLtoRGB {
    private static float hueToRGB(float m1, float m2, float h) {
        if(h < 0) {
            h += 1.0f;
        } else if(h > 1.0f) {
            h -= 1.0f;
        }

        if((h * 6) < 1) {
            return m1 + (m2 - m1) * 6 * h;
        } else if((h * 2) < 1) {
            return m2;
        } else if((h * 3) < 2) {
            return m1 + (m2 - m1) * ((2 / 3) - h) * 6;
        } else {
            return m1;
        }
    }

    public static void main(String[] args) {
        float h = 180.0f / 360.0f;
        float s = 100.0f / 100.0f;
        float l =  38.0f / 100.0f;
        float r = 0;
        float g = 0;
        float b = 0;

        if(s == 0.0) {
            r = g = b = l;
        } else {
            float m2 = l < 0.5 ? l * (1 + s) : (l + s) - (l * s);
            float m1 = (l * 2) - m2;

            r = hueToRGB(m1, m2, h + (1.0f / 3.0f));
            g = hueToRGB(m1, m2, h);
            b = hueToRGB(m1, m2, h - (1.0f / 3.0f));
        }

        System.out.printf("%.2f %.2f %.2f -> %.2f %.2f %.2f",
                          h, s, l,
                          r, g, b);
    }
}
我遵循并检查了许多其他公式以获得上述公式,包括CSS3文档中的公式:

HOW TO RETURN hsl.to.rgb(h, s, l): 
   SELECT: 
      l<=0.5: PUT l*(s+1) IN m2
      ELSE: PUT l+s-l*s IN m2
   PUT l*2-m2 IN m1
   PUT hue.to.rgb(m1, m2, h+1/3) IN r
   PUT hue.to.rgb(m1, m2, h    ) IN g
   PUT hue.to.rgb(m1, m2, h-1/3) IN b
   RETURN (r, g, b)

HOW TO RETURN hue.to.rgb(m1, m2, h): 
   IF h<0: PUT h+1 IN h
   IF h>1: PUT h-1 IN h
   IF h*6<1: RETURN m1+(m2-m1)*h*6
   IF h*2<1: RETURN m2
   IF h*3<2: RETURN m1+(m2-m1)*(2/3-h)*6
   RETURN m1
如何将hsl.TO.rgb(h、s、l)返回:
选择:

l看来罪魁祸首是这样的:

return m1 + (m2 - m1) * ((2 / 3) - h) * 6;
您正在进行整数除法
2/3
,它将等于
0
。A至:


似乎为我修好了。它以相等的蓝/绿
0.76
返回,这对于色调180(青色)是有意义的。

完美!谢谢你,我花了太长的时间去梳理我的头发,以为我的算法实现错了……是的,有时候只需要另一双眼睛。很高兴提供帮助。这里有一个比维基百科和CSS3中描述的更简单的替代解决方案:
return m1 + (m2 - m1) * ((2 / 3) - h) * 6;
return m1 + (m2 - m1) * ((2.0f / 3.0f) - h) * 6;