PS的HSL控制算法是什么

PS的HSL控制算法是什么,请教高手
我在网上搜到这些:Photoshop中HSL调节滤镜的原理。一个RGB格式的图片,通过HSL颜色格式,可以将图片的整体色调进行调节。比如我们要调节 Hue色调值,增加50。首先,取出每个点的RGB颜色值,转换为HSL,将得到的Hue值加上50,然后转换到RGB颜色,覆盖原来点的颜色。就这样,将所有的点都做一回合的互转,就能够将整个图片的色调进行调整。

所以做了一个DEMO测试,DEMO上三个滑块:H,S,L,H的范围:[-180, 180], S和L的范围[0, 200],
1.取得滑块三个值m_H,m_S, m_L
2.取出每个点的RGB颜色值,转换为HSL,为HSor,SSor, LSor
HSor += m_H;
SSor = (SSor*m_L/100.0f);
LSor = (LSor*m_S/100.0f);
<自己估计这里算法控制不对,求指点>
3.转换回RGB. 

结果滑动渐变不对,求高手指点,
以下为自己的RGB和HSL转换代码
C/C++ code

void RgbWithHsl_Hgy::RgbToHsl_Hgy(void)
{
    double mn, mx; 
    int       major;

    if (red < green)
    {
        mn = red; 
        mx = green;
        major = Green;
    }
    else
    {
        mn = green;
        mx = red; 
        major = Red;
    }

    if (blue < mn)
    {
        mn = blue;
    }
    else if (blue > mx)
    {
        mx = blue;
        major = Blue;
    }

    if (mn == mx) 
    {
        lightness    = mn/255;
        saturation   = 0;
        hue          = 0; 
    }   
    else 
    { 
        lightness = (mn+mx) / 510;

        if (lightness <= 0.5)
        {
            saturation = (mx-mn) / (mn+mx); 
        }
        else
        {
            saturation = (mx-mn) / (510-mn-mx);
        }

        switch (major)
        {
        case Red:
            hue = (green-blue) * 60 / (mx-mn) + 360; 
            break;

        case Green: 
            hue = (blue-red) * 60  / (mx-mn) + 120;  
            break;

        case Blue : hue = (red-green) * 60 / (mx-mn) + 240;
            break;
        }

        if (hue >= 360)
        {
            hue = hue - 360;
        }
    }
}

unsigned char Value(double m1, double m2, double h)
{
    while (h >= 360) 
    {
        h -= 360;
    }
    while (h < 0) 
    {
        h += 360;
    }

    if (h < 60) 
    {
        m1 = m1 + (m2 - m1) * h / 60;   
    }
    else if (h < 180) 
    {
        m1 = m2;
    }
    else if (h < 240) 
    {
        m1 = m1 + (m2 - m1) * (240 - h) / 60;  
    }

    return (unsigned char)(m1 * 255);
}

void RgbWithHsl_Hgy::HslToRgb_Hgy(void)
{
    if (saturation == 0)
    {
        red = green = blue = (unsigned char) (lightness*255);
    }
    else
    {
        double m1, m2;

        if (lightness <= 0.5)
        {
            m2 = lightness + lightness * saturation;  
        }
        else       
        {
            m2 = lightness + saturation - lightness * saturation;
        }

        m1 = 2 * lightness - m2;   

        red   = Value(m1, m2, hue + 120);   
        green = Value(m1, m2, hue);
        blue  = Value(m1, m2, hue - 120);
    }
}



越详细越好,谢谢。求高手.

------解决方案--------------------
楼主牛人!!多给点分吧。。
------解决方案--------------------
祝你好运
------解决方案--------------------
顶一下,接分了...
------解决方案--------------------
看这里
http://blog.****.net/ringphone/article/details/5191809