解决方案 »

  1.   

    H(hue) - S(saturation) -
    B == ???
      

  2.   

    HSB!=HSL,HSB=HSV(V或B是明度,不是亮度)max=max(R,G,B)//取RGB中的最大值
    min=min(R,G,B)//取RGB中的最小值
      
    if R = max, H = (G-B)/(max-min)
    if G = max, H = 2 + (B-R)/(max-min)
    if B = max, H = 4 + (R-G)/(max-min)H = H * 60
    if H < 0, H = H + 360V=max(R,G,B)/256
    S=(max-min)/maxH为角度数,S、B表示出来可化为百分数(乘100取整)!
      

  3.   

    // Color.h: interface for the CColor class.
    //颜色类
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_COLOR_H__33D81BED_1B84_4313_B3B0_E2E83767792B__INCLUDED_)
    #define AFX_COLOR_H__33D81BED_1B84_4313_B3B0_E2E83767792B__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000typedef enum 
    {
    COLOR_RGB,
    COLOR_HLS
    }COLOR_FAMILY; //颜色空间class CColor  
    {
    private:
    typedef enum{RED,GREEN,BLUE};
    UCHAR 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 (UCHAR)(m1*255);
    }public:
    CColor();
    virtual ~CColor();
    COLORREF HLS2RGB(DOUBLE Lightness,DOUBLE Saturation,DOUBLE Hue)
    {
    UCHAR red,green,blue;
    if(Saturation==0)
    {
    red=green=blue=(UCHAR)(Lightness*255);
    }
    else
    {
    DOUBLE m1,m2; if(Lightness<=0.5)
    m2=Lightness*(1+Saturation);
    else
    m2=Lightness+Saturation*(1-Lightness);
    m1=2*Lightness-m2;
    red=Value(m1,m2,Hue+120);
    green=Value(m1,m2,Hue);
    blue=Value(m1,m2,Hue-120);
    }
    return RGB(red,green,blue);
    } BOOL RGB2HLS(COLORREF RGBclr,DOUBLE &Lightness,DOUBLE &Saturation,DOUBLE &Hue)
    {
    DOUBLE mn,mx;
    INT major;
    INT Red,Green,Blue; Red= RGBclr && 0x000000FF;
    Green=( RGBclr && 0x0000FF00)>>8;
    Blue=( RGBclr && 0x00FF0000)>>16;
    if(Red<Green)
    {
    mn=Red;mx=Green;major=GREEN;
    }
    else
    {
    mn=Green;mx=Red;major=RED;
    }
    if(Blue<mn)
    {
    mn=Blue;
    }
    else
    {
    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;
    }
    }
    };#endif // !defined(AFX_COLOR_H__33D81BED_1B84_4313_B3B0_E2E83767792B__INCLUDED_)
      

  4.   

    上面的写错了一点点// Color.h: interface for the CColor class.
    //颜色类
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_COLOR_H__33D81BED_1B84_4313_B3B0_E2E83767792B__INCLUDED_)
    #define AFX_COLOR_H__33D81BED_1B84_4313_B3B0_E2E83767792B__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000typedef enum 
    {
    COLOR_RGB,
    COLOR_HLS
    }COLOR_FAMILY; //颜色空间class CColor  
    {
    private:
    typedef enum{RED,GREEN,BLUE};
    UCHAR 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 (UCHAR)(m1*255);
    }public:
    CColor();
    virtual ~CColor();
    COLORREF HLS2RGB(DOUBLE Lightness,DOUBLE Saturation,DOUBLE Hue)
    {
    UCHAR red,green,blue;
    if(Saturation==0)
    {
    red=green=blue=(UCHAR)(Lightness*255);
    }
    else
    {
    DOUBLE m1,m2; if(Lightness<=0.5)
    m2=Lightness*(1+Saturation);
    else
    m2=Lightness+Saturation*(1-Lightness);
    m1=2*Lightness-m2;
    red=Value(m1,m2,Hue+120);
    green=Value(m1,m2,Hue);
    blue=Value(m1,m2,Hue-120);
    }
    return RGB(red,green,blue);
    } BOOL RGB2HLS(COLORREF RGBclr,DOUBLE &Lightness,DOUBLE &Saturation,DOUBLE &Hue)
    {
    DOUBLE mn,mx;
    INT major;
    INT Red,Green,Blue; Red= RGBclr & 0x000000FF;
    Green=( RGBclr & 0x0000FF00)>>8;
    Blue=( RGBclr & 0x00FF0000)>>16;
    if(Red<Green)
    {
    mn=Red;mx=Green;major=GREEN;
    }
    else
    {
    mn=Green;mx=Red;major=RED;
    }
    if(Blue<mn)
    {
    mn=Blue;
    }
    else
    {
    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;
    }
    }
    };#endif // !defined(AFX_COLOR_H__33D81BED_1B84_4313_B3B0_E2E83767792B__INCLUDED_)