c++ - 在 C++ 中将 RGB 转换为 HSL

标签 c++ graphics rgb hsl

目前正在尝试将 RGB 转换为 HSL。无法弄清楚我哪里出错了,但我的 H & S 值显示为 0,这就是问题所在。 这是我所拥有的:

#include <iostream>
#include <cstdlib>
#include <cmath>
float Min( float fR, float fG, float fB )
{
    float fMin = fR;
    if (fG < fMin)
    {
        fMin = fG;
    }
    if (fB < fMin)
    {
        fMin = fB;
    }
    return fMin;
}


float Max( float fR, float fG, float fB)
{
    float fMax = fR;
    if (fG > fMax)
    {
        fMax = fG;
    }
    if (fB > fMax)
    {
        fMax = fB;
    }
    return fMax;
}

void RGBToHSL( int R, int G, int B, int& H, int& S, int& L )
{
    int r = 100.0;
    int g = 100.0;
    int b = 200.0;

    float fR = r / 255.0;
    float fG = g / 255.0;
    float fB = b / 255.0;


    float fCMin = Min(fR, fG, fB);
    float fCMax = Max(fR, fG, fB);


    L = 50 * (fCMin + fCMax);

    if (fCMin = fCMax)
    {
        S = 0;
        H = 0;
        return;

    }
    else if (L < 50)
    {
        S = 100 * (fCMax - fCMin) / (fCMax + fCMin);
    }
    else
    {
        S = 100 * (fCMax - fCMin) / (2.0 - fCMax - fCMin);
    }

    if (fCMax == fR)
    {
        H = 60 * (fG - fB) / (fCMax - fCMin);
    }
    if (fCMax == fG)
    {
        H = 60 * (fB - fR) / (fCMax - fCMin) + 120;
    }
    if (fCMax == fB)
    {
        H = 60 * (fR - fG) / (fCMax - fCMin) + 240;
    }
    if (H < 0)
    {
        H = H + 360;
    }
}

亮度值为 58,这很好,但我希望看到色调值为 240,饱和度值为 47。

如有任何帮助,我们将不胜感激。

谢谢。

最佳答案

如果(fCMin = fCMax)

应该是

如果(fCMin == fCMax)

关于c++ - 在 C++ 中将 RGB 转换为 HSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785905/

相关文章:

java - 再次使用 Draw 与 Repaint

php - 按颜色对图像排序

javascript - rgb 值作为变量

c - 如何生成 24 位 RGB 值 "more gracefully"?

c++ - 无法迭代枚举

c++ - 每层存储超过 1 亿个切片的切片数据

C++11 和 [17.5.2.1.3] 位掩码类型

C++ 重载运算符<<

java - 让用户在Java中用鼠标绘制一个矩形

java - 当我调用 fillRoundRect() 时只有 1 个角是圆的