rgb到色调转换不正确

bybem2ql  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(417)

我正在尝试在java中将rgb颜色转换为hsl,我已经搜索了许多解释如何将rgb转换为hsl的代码,我现在有了饱和度和亮度,但是色调值不正确
我现在正在尝试将rgb转换为hsl,然后再转换回来。
我使用的rgb值是
红色:54绿色:43蓝色:21
我得到的hsl值是
色调:260饱和度:44明度:15
我试着把rgb值转换成hslhttps://www.rapidtables.com/convert/color/rgb-to-hsl.html
我得到的价值观是
色调:40饱和度:44.0明度:14.7
有人知道我在把rgb转换成hsl的过程中做错了什么吗?这是我的密码

public static Map<String, Integer> rgbToHsl(Integer red, Integer green, Integer blue){
        Float redDouble = ((float)red) / 255.0f;
        Float greenDouble = ((float)green) / 255.0f;
        Float blueDouble = ((float)blue) / 255.0f;

        Float max = Math.max(Math.max(redDouble, greenDouble), blueDouble);
        Float min = Math.min(Math.min(redDouble, greenDouble), blueDouble);

        Float chroma = max - min;
        Float hue = chroma == 0.0f ? 0.0f : 
            (max == redDouble ? (greenDouble - blueDouble) / chroma : 
            (max == greenDouble ? 2f + (blueDouble - redDouble) / chroma : 
            4f + (redDouble - greenDouble) / chroma));

        Float lightness = (max + min) * 0.5f;
        Float saturation = chroma == 0.0f ? 0.0f : (lightness > 0.5f ? chroma / (2.0f - max - min) : chroma / (max + min));

        return Map.ofEntries(
            Map.entry("hue", (int) Math.round(hue * 60)),
            Map.entry("saturation", (int) Math.round(saturation * 100)),
            Map.entry("lightness", (int) Math.round(lightness * 100))
        );
    }
aelbi1ox

aelbi1ox1#

对于色调值,如果红色是最大值,则忘记按模数6进行转换。
根据intellij向我展示的内容,它不相信max==reddouble,即使它们的打印值看起来相同。因此,色调的嵌套逻辑计算错误的部分。我建议您编写一些逻辑,以确定是否要将白色、红色、绿色或蓝色作为字符串,然后使用带有新颜色字符串的开关块作为触发器来决定返回哪个值。这将是更长的,但可能更可读以及。虽然我是三元运算符的粉丝,但嵌套它们可能会很麻烦。

4smxwvx5

4smxwvx52#

当你使用盒装 Float 到处都是 Math.max(Math.max(a, b), c) 将取消对参数的装箱 a , b 以及 c ,然后执行计算,然后将它们放回 Float .
结果将是一个新的对象,不等于所有三个对象 a , b 以及 c .
因此,身份比较 max == redDouble 以及 max == greenDouble 永远都是 false .
消除盒装类型,使用 float 到处都是,既快又清。
更好的是:两个都不要用 == 或者 equals 任何类型的浮点值。例如,请参见此处如何使用其他布尔标志。布尔函数不易受到微小舍入误差的影响。

相关问题