java - 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))
);
}
解决方案
当您Float
在任何地方使用 boxed s 时,Math.max(Math.max(a, b), c)
会将参数和拆箱a
,然后执行计算,然后将它们装箱回 a 。b
c
Float
结果将是一个新对象,不等于所有三个a
和。b
c
因此,身份比较max == redDouble
和max == greenDouble
将永远是false
。
去掉盒装的类型,float
到处使用 s ,更快更清晰。
更好的是:永远不要使用任何一种==
或equals
任何一种浮点值。例如,请参阅此处如何使用额外的布尔标志。布尔值不易受到微小舍入误差的影响。
推荐阅读
- kubernetes - Kubernetes - 将静态 IP 路由到多个服务(谷歌云平台)
- android - 使用 api 在 Android 上构建库的传递依赖项
- apache-storm - 如何让 Jstorm 获取 tuplelifecycle 时间
- amazon-web-services - 清除 Kubernetes 集群中的缓存数据
- php - 如果使用变量调用函数,则全局变量为空
- php - Ajax 发布请求正确,但在 IIS 上失败
- javascript - javascript:我想显示原始数据中的图像
- python - Alembic 的 server_default 和 Postgres
- php - 无法读取大于 2GB 的文件
- c# - 空字符串输入验证