我编写的HSL到RGB色彩空间功能无法正常工作

时间:2019-02-27 09:20:26

标签: c++ colors rgb color-space hsl

我已经在网上找到了一些教程,并且主要基于一个名为 Colors 的Lua库,已经编写了从HSL到RGB的函数,但是它不能正常工作。您能帮我启动并运行它吗?

代码如下:

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;
    }

1 个答案:

答案 0 :(得分:0)

在C ++(或C)中,除法运算符的结果并非自动为浮点值。如果被除数和除数都具有整数数据类型,则除法结果也将是整数。至少,除法的一侧必须是浮点类型,以获得浮点结果。 有关二进制算术运算的转换规则的详细信息,请参见Arithmetic operators

123integer literal,所以此常量的数据类型是整数数据类型(int)。

总而言之,虽然1 / 3的结果为0,而2 / 3的结果为0,但1.0 / 3.0的结果为0.333333,而{{1}的结果}是2.0 / 3.0

请注意,此规则不仅适用于除法运算,我也适用于任何其他算术运算。但在例如减,加,乘无所谓,因为将这些运算应用于(数学)积分值时,会生成(数学)积分结果。

这意味着,以下表达式无法达到您的期望:

0.666667
m1 + (m2 - m1) * (2 / 3 - hue) * 6

因为它们与以下内容相同:

color.H + 1 / 3
m1 + (m2 - m1) * (0 - hue) * 6

将积分常数更改为浮点常数,即可解决您的问题。工作功能可能如下所示:

color.H + 0