Minecraft模组RGB转HSB提亮十六进制颜色方法异常排查
代码问题分析
你的实现存在两个核心bug,直接导致非红色颜色输出异常:
- 错误的RGB参数预处理:
Color.RGBtoHSB方法要求传入的r、g、b参数为0255区间的整数,方法内部会自行完成归一化计算。你提前将通道值除以255转为01区间的浮点数,再强转int传入方法:只有通道值恰好为255时,计算结果为1.0f,强转后得到1;其余0~254的通道值计算结果均小于1,强转int后直接变为0。如果待处理颜色的三个通道值都小于255,传入转换方法的r、g、b参数全为0,此时饱和度计算结果为0,色相会被默认赋值为0(对应红色),这就是非满亮度的蓝、绿色最终输出红色的根本原因。 - 丢失Alpha透明度通道:Minecraft文本颜色采用ARGB存储格式,最高8位为透明度值。
Color.getHSBColor生成的颜色对象默认透明度为255(完全不透明),直接调用hashCode()取颜色值会覆盖原颜色的透明度,导致半透明文本渲染异常。
修正后代码
public static int renderColorToHSB(int color, float saturation, float brightness) { float[] hsv = new float[3]; // 提取原颜色的Alpha通道 int alpha = (color >> 24) & 255; // 直接提取0~255区间的RGB整数值,不提前做浮点归一化 int r = (color >> 16) & 255; int g = (color >> 8) & 255; int b = color & 255; // 传入符合方法要求的整数RGB值做HSB转换 Color.RGBtoHSB(r, g, b, hsv); // 直接通过HSBtoRGB方法获取RGB颜色值,避免Color对象的额外开销 int rgb = Color.HSBtoRGB(hsv[0], saturation, brightness); // 将原Alpha通道拼回结果,保留原透明度 return (alpha << 24) | (rgb & 0x00ffffff); }
使用说明
调用格式与原方法完全一致,传入的饱和度、亮度参数需保持在0.0f~1.0f区间内,即可在不改变原颜色色相、不丢失透明度的前提下调整颜色的饱和度和亮度。
内容的提问来源于stack exchange,提问作者Xemnes
相关产品推荐
相关产品推荐

