可以在将颜色值与阴影系数相乘之前,先将颜色值从sRGB空间转换到线性空间,计算阴影后再转换回sRGB空间。由于sRGB到线性空间的转换大致可以通过对颜色值进行2.2次幂运算来近似,而线性空间到sRGB的转换则可以通过对值进行1/2.2次幂运算来近似。因此,改进后的getShade方法如下:
java
public static Color getShade(Color color, double shade) {
double redLinear = Math.pow(color.getRed() / 255.0, 2.2) shade;
double greenLinear = Math.pow(color.getGreen() / 255.0, 2.2) shade;
double blueLinear = Math.pow(color.getBlue() / 255.0, 2.2) * shade;
int red = (int) (Math.pow(redLinear, 1 / 2.2) * 255);
int green = (int) (Math.pow(greenLinear, 1 / 2.2) * 255);
int blue = (int) (Math.pow(blueLinear, 1 / 2.2) * 255);
return new Color(red, green, blue);
}
注意:这里对颜色值进行了归一化处理(除以255.0),并在最后转换回sRGB空间时重新乘以255以得到正确的颜色值范围。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。