19,468
社区成员
发帖
与我相关
我的任务
分享
//
void HSL2RGB(int hue,double saturation, double lightness,BYTE &red,BYTE &green,BYTE &blue)
{
if(saturation==0)
{
red=green=blue=(BYTE)(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 = ByteValue(m1,m2,hue+120);
green= ByteValue(m1,m2,hue);
blue = ByteValue(m1,m2,hue-120);
}
}
typedef enum {Red, Green, Blue};
BOOL RGB2HLS(BYTE red,BYTE green,BYTE blue,int &hue,double &saturation, double &lightness)
{
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=240;// ?? 0;
}
else
{
lightness=(mn+mx)/510; // 2*255
if(lightness <= 0.5) saturation=(double)(mx-mn)/(double)(mn+mx);
else saturation=(double)(mx-mn)/(double)(510-mn-mx);
switch(major)
{
case Red:
hue=(int)((green-blue)*60/(mx-mn)+360);
break;
case Green:
hue=(int)((blue-red)*60/(mx-mn)+120);
break;
case Blue:
hue=(int)((red-green)*60/(mx-mn)+240);
break;
}
if(hue >= 360) hue -= 360;
}
if(mn==0 && mx==255) return TRUE;
else return FALSE;
}
//
BYTE ByteValue(double m1, double m2, double hue)
{
if( hue>360 ) hue -= 360;
else if( hue<0 ) hue += 360;
//
if ( hue<60 ) m1=m1+(m2-m1)*hue/60;
else if( hue<180 ) m1=m2;
else if( hue<240 ) m1=m1+(m2-m1)*(240-hue)/60;
//
return (BYTE)(m1*255);
}