我一直在空闲时间制作图像编辑器,并尝试在此处使用HSL到RGB转换公式:HSL to RGB color conversion但是我遇到了错误。
每当我运行我的程序时,转换不能正常工作,使rgb保持意想不到的灰色。这是一些示例输出数据:
HSL:0.0,0.0,1.0
RGB:255.0,255.0,255.0
HSL:214.0,0.73,0.5
RGB:128.0,128.0,128.0
HSL:214.0,0.74,0.5
RGB:128.0,128.0,128.0
HSL:214.0,0.75,0.5
RGB:128.0,128.0,128.0
HSL:214.0,0.76,0.5
RGB:128.0,128.0,128.0
HSL:214.0,0.76,0.5
RGB:128.0,128.0,128.0
以下是我的代码。它全部用Java编写。
public double[] hslToRgb(double h, double s, double l){
System.out.println("HSL: " + h + ", " + s + ", " + l);
double r = -1;
double b = -1;
double g = -1;
if(s == 0){
r = l;
b = l;
g = l;
}else{
double q = 1 < 0.5 ? l * (1 + s) : l + s - 1 * s;
double p = 2 * l - q;
r = hueToRgb(p, q, h + (1 / 3));
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h - (1/ 3));
}
r = Math.round(r * 255);
b = Math.round(b * 255);
g = Math.round(g * 255);
System.out.println("RGB: " + r + ", " + g + ", " + b);
double[] rgb = {r, g, b};
return rgb;
}
private double hueToRgb(double p, double q, double t){
if(t < 0){
t++;
}
if(t > 1){
t--;
}
if(t < 1 / 6){
return p + (q - p) * 6 * t;
}
if(t < 1 / 2){
return q;
}
if(t < 2 / 3){
return p + (q - p) * ((2 / 3) - t) * 6;
}
return p;
}
有人可以给我一些关于可能导致这种情况的见解吗?我觉得这是我的代码中的一个小错误,但我无法在任何地方找到它。
答案 0 :(得分:2)
首先,在double q = 1 < 0.5 ...
行中,它应该是字母EL l
,而不是两个地方的数字1
。
double q = 1 < 0.5 ? l * (1 + s) : l + s - 1 * s;
^ ----- change from 1 to l ---- ^
其次,你必须非常小心算术,它在Java中的工作方式与JavaScript不同。如果您有1 / 3
之类的代码,因为两者都是整数,结果将是一个整数,这意味着您得到0
而不是0.3333...
。为了防止使用整数除法,所有分区都需要使用至少一个浮点类型:
if(t < 1.0 / 6){
^^^ change from 1 to 1.0
return p + (q - p) * 6 * t;
}
if(t < 1.0 / 2){
^^^ change from 1 to 1.0
return q;
}
if(t < 2.0 / 3){
^^^ change from 2 to 2.0
return p + (q - p) * ((2.0 / 3) - t) * 6;
^^^ change from 2 to 2.0
}
此外:
r = hueToRgb(p, q, h + (1.0 / 3));
^^^ change from 1 to 1.0
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h - (1.0 / 3));
^^^ change from 1 to 1.0
最后,在您复制的代码中,h,s和l的值都应该介于0和1之间。因此,214的H在您的示例中无效 - 您需要将其除以360第一
以下是应用了更改的工作代码示例:http://ideone.com/QbXyYi
输入:
240.0 / 360.0, 1.0, 0.5
输出:
[0, 0, 255.0]