首页 > 解决方案 > rgb 到色调转换不正确

问题描述

我正在尝试在 Java 中将 rgb 颜色转换为 hsl,我搜索了许多解释如何将 rgb 转换为 hsl 的代码,我现在可以使用饱和度和亮度,但色调值不正确

我现在正在尝试将 rgb 转换为 hsl 然后再返回。

我使用的 RGB 值是

红色:54 绿色:43 蓝色:21

我得到的 hsl 值是

色调:260 饱和度:44 亮度:15

我尝试在https://www.rapidtables.com/convert/color/rgb-to-hsl.html将 rgb 值转换为 hsl

我得到的价值观是

色调: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))
        );
    }

标签: javargbhuehsl

解决方案


当您Float在任何地方使用 boxed s 时,Math.max(Math.max(a, b), c)会将参数和拆箱a,然后执行计算,然后将它们装箱回 a 。bcFloat

结果将是一个新对象,不等于所有三个a和。bc

因此,身份比较max == redDoublemax == greenDouble将永远是false

去掉盒装的类型,float到处使用 s ,更快更清晰。

更好的是:永远不要使用任何一种==equals任何一种浮点值。例如,请参阅此处如何使用额外的布尔标志。布尔值不易受到微小舍入误差的影响。


推荐阅读