我在空闲时间一直在制作一个图像编辑器,并尝试在这里使用 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;
}
有人能给我一些关于可能导致这种情况的原因的见解吗?我觉得这是我的代码中的一个小错误,但我在任何地方都找不到它。
最佳答案
首先,在 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
Input:
240.0 / 360.0, 1.0, 0.5
Output:
[0, 0, 255.0]
关于java - HSL 到 RGB 转换器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955698/