gpt4 book ai didi

java - HSL 到 RGB 转换器不工作

转载 作者:行者123 更新时间:2023-11-30 08:48:25 25 4
gpt4 key购买 nike

我一直在空闲时间制作图像编辑器,并尝试在此处使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com