我编写的 HSL 到 RGB 色彩空间函数无法正常工作
HSL to RGB colorspace function that I've written not working properly
我已经编写了一个 HSL 到 RGB 函数,基于我在网上找到的一些教程,主要基于一个名为 Colors 的 Lua 库,但是,它不能正常工作。你能帮我把它弄起来吗运行?
代码如下:
float Hue2RGB(float m1, float m2, float hue)
{
if (hue < 0) { hue += 1; };
if (hue > 1) { hue -= 1; };
if (hue * 6 < 1)
{
return m1 + (m2 - m1) * hue * 6;
}
else if (hue * 2 < 1)
{
return m2;
}
else if (hue * 3 < 2)
{
return m1 + (m2 - m1) * (2 / 3 - hue) * 6;
}
else
return m1;
}
color_RGB HSL2RGB(color_HSL color)
{
color.H = color.H / 360;
float m1, m2;
if (color.L <= 0.5)
{
m2 = color.L * (color.S + 1);
}
else
{
m2 = color.L + color.S - color.L * color.S;
}
m1 = color.L * 2 - m2;
color_RGB return_color;
return_color.R = Hue2RGB(m1, m2, color.H + 1 / 3);
return_color.G = Hue2RGB(m1, m2, color.H);
return_color.B = Hue2RGB(m1, m2, color.H - 1 / 3);
return_color.a = 1.0;
return return_color;
}
我有一个可以正常工作的 RGB 到 HSL,所以我用它来测试这个功能。这是我在调试器中看到的结果:
{R=0.294117659 G=0.0980392247 B=0.125490203 ...}
转换为 HSL
{H=351.600006 S=0.499999970 L=0.196078449 }
再次转换为 RGB:
{R=0.0980392098 G=0.0980392098 B=0.0980392098 ...}
几天来我一直在为这个问题苦苦挣扎,我听说这个网站可以帮助人们。谢谢你。
PS:这是我的另一个函数,RGB 到 HSL。我已经测试了很多次,它可以正常工作:
color_HSL RGB2HSL(color_RGB color)
{
float min = std::fmin(std::fmin(color.R, color.G), color.B);
float max = std::fmax(std::fmax(color.R, color.G), color.B);
float delta = max - min;
float H = 0, S = 0, L = ((min + max) / 2);
if (L > 0 && L < 0.5)
{
S = delta / (max + min);
}
if (L > 0.5 && L < 1)
{
S = delta / (2 - max - min);
}
if (delta > 0)
{
if (max == color.R && max != color.G) { H += (color.G - color.B) / delta; }
if (max == color.G && max != color.B) { H += 2 + (color.B - color.R) / delta; }
if (max == color.R && max != color.R) { H += 4 + (color.R - color.G) / delta; }
H = H / 6;
}
if (H < 0) { H += 1; };
if (H > 1) { H -= 1; };
color_HSL return_color;
return_color.H = H * 360;
return_color.S = S;
return_color.L = L;
return return_color;
}
在 C++(或 C)中,除法运算符的结果不会自动成为浮点值。如果除法和除数都是整数数据类型,那么除法的结果也是整数。除法的至少一侧必须是浮点类型,以获得浮点结果。
有关二进制算术运算转换规则的详细信息,请参阅Arithmetic operators。
1
、2
和3
都是integer literal,所以这个常量的数据类型是整数数据类型(int
)。
总之,1 / 3
的结果是0,2 / 3
的结果是0,1.0 / 3.0
的结果是0.333333
,[=的结果是23=] 是 0.666667
.
请注意,此规则不仅适用于除法 i,也适用于任何其他算术运算。但在例如情况下减法、加法、乘法无关紧要,因为这些运算在应用于(数学上)整数值时会生成(数学上)积分结果。
这意味着,以下表达式不会执行您期望的操作:
m1 + (m2 - m1) * (2 / 3 - hue) * 6
color.H + 1 / 3
因为它们与:
m1 + (m2 - m1) * (0 - hue) * 6
color.H + 0
把整型常量改成浮点常量,解决你的问题。工作函数可能如下所示:
float Hue2RGB(float m1, float m2, float hue)
{
hue = hue < 0 ? hue+1 : hue > 1 ? hue-1 : hue;
if (hue * 6 < 1)
return m1 + (m2 - m1) * hue * 6;
else if (hue * 2 < 1)
return m2;
else if (hue * 3 < 2)
return m1 + (m2 - m1) * (2.0 / 3.0 - hue) * 6;
else
return m1;
}
color_RGB HSL2RGB(color_HSL color)
{
color.H = color.H / 360;
float m2 = color.L <= 0.5 ? color.L * (color.S + 1) : color.L + color.S - color.L * color.S;
float m1 = color.L * 2 - m2;
color_RGB return_color;
return_color.R = Hue2RGB(m1, m2, color.H + 1.0 / 3.0);
return_color.G = Hue2RGB(m1, m2, color.H);
return_color.B = Hue2RGB(m1, m2, color.H - 1.0 / 3.0);
return_color.a = 1.0;
return return_color;
}
我已经编写了一个 HSL 到 RGB 函数,基于我在网上找到的一些教程,主要基于一个名为 Colors 的 Lua 库,但是,它不能正常工作。你能帮我把它弄起来吗运行?
代码如下:
float Hue2RGB(float m1, float m2, float hue)
{
if (hue < 0) { hue += 1; };
if (hue > 1) { hue -= 1; };
if (hue * 6 < 1)
{
return m1 + (m2 - m1) * hue * 6;
}
else if (hue * 2 < 1)
{
return m2;
}
else if (hue * 3 < 2)
{
return m1 + (m2 - m1) * (2 / 3 - hue) * 6;
}
else
return m1;
}
color_RGB HSL2RGB(color_HSL color)
{
color.H = color.H / 360;
float m1, m2;
if (color.L <= 0.5)
{
m2 = color.L * (color.S + 1);
}
else
{
m2 = color.L + color.S - color.L * color.S;
}
m1 = color.L * 2 - m2;
color_RGB return_color;
return_color.R = Hue2RGB(m1, m2, color.H + 1 / 3);
return_color.G = Hue2RGB(m1, m2, color.H);
return_color.B = Hue2RGB(m1, m2, color.H - 1 / 3);
return_color.a = 1.0;
return return_color;
}
我有一个可以正常工作的 RGB 到 HSL,所以我用它来测试这个功能。这是我在调试器中看到的结果:
{R=0.294117659 G=0.0980392247 B=0.125490203 ...}
转换为 HSL
{H=351.600006 S=0.499999970 L=0.196078449 }
再次转换为 RGB:
{R=0.0980392098 G=0.0980392098 B=0.0980392098 ...}
几天来我一直在为这个问题苦苦挣扎,我听说这个网站可以帮助人们。谢谢你。
PS:这是我的另一个函数,RGB 到 HSL。我已经测试了很多次,它可以正常工作:
color_HSL RGB2HSL(color_RGB color)
{
float min = std::fmin(std::fmin(color.R, color.G), color.B);
float max = std::fmax(std::fmax(color.R, color.G), color.B);
float delta = max - min;
float H = 0, S = 0, L = ((min + max) / 2);
if (L > 0 && L < 0.5)
{
S = delta / (max + min);
}
if (L > 0.5 && L < 1)
{
S = delta / (2 - max - min);
}
if (delta > 0)
{
if (max == color.R && max != color.G) { H += (color.G - color.B) / delta; }
if (max == color.G && max != color.B) { H += 2 + (color.B - color.R) / delta; }
if (max == color.R && max != color.R) { H += 4 + (color.R - color.G) / delta; }
H = H / 6;
}
if (H < 0) { H += 1; };
if (H > 1) { H -= 1; };
color_HSL return_color;
return_color.H = H * 360;
return_color.S = S;
return_color.L = L;
return return_color;
}
在 C++(或 C)中,除法运算符的结果不会自动成为浮点值。如果除法和除数都是整数数据类型,那么除法的结果也是整数。除法的至少一侧必须是浮点类型,以获得浮点结果。 有关二进制算术运算转换规则的详细信息,请参阅Arithmetic operators。
1
、2
和3
都是integer literal,所以这个常量的数据类型是整数数据类型(int
)。
总之,1 / 3
的结果是0,2 / 3
的结果是0,1.0 / 3.0
的结果是0.333333
,[=的结果是23=] 是 0.666667
.
请注意,此规则不仅适用于除法 i,也适用于任何其他算术运算。但在例如情况下减法、加法、乘法无关紧要,因为这些运算在应用于(数学上)整数值时会生成(数学上)积分结果。
这意味着,以下表达式不会执行您期望的操作:
m1 + (m2 - m1) * (2 / 3 - hue) * 6
color.H + 1 / 3
因为它们与:
m1 + (m2 - m1) * (0 - hue) * 6
color.H + 0
把整型常量改成浮点常量,解决你的问题。工作函数可能如下所示:
float Hue2RGB(float m1, float m2, float hue)
{
hue = hue < 0 ? hue+1 : hue > 1 ? hue-1 : hue;
if (hue * 6 < 1)
return m1 + (m2 - m1) * hue * 6;
else if (hue * 2 < 1)
return m2;
else if (hue * 3 < 2)
return m1 + (m2 - m1) * (2.0 / 3.0 - hue) * 6;
else
return m1;
}
color_RGB HSL2RGB(color_HSL color)
{
color.H = color.H / 360;
float m2 = color.L <= 0.5 ? color.L * (color.S + 1) : color.L + color.S - color.L * color.S;
float m1 = color.L * 2 - m2;
color_RGB return_color;
return_color.R = Hue2RGB(m1, m2, color.H + 1.0 / 3.0);
return_color.G = Hue2RGB(m1, m2, color.H);
return_color.B = Hue2RGB(m1, m2, color.H - 1.0 / 3.0);
return_color.a = 1.0;
return return_color;
}