http://www.diybl.com/course/4_webprogram/asp.net/netjs/20090306/158710.html

double hue2rgb( float p, float q, float rgb )
{
double color;

if ( rgb < 0.f ){
rgb = rgb + 1.f;
}
if ( rgb > 1.f ){
rgb = rgb - 1.f;
}

if ( 6.f * rgb < 1 )
{
color = p + ( q - p ) * 6.0 * rgb;
}
else if ( 2.0 * rgb < 1 )
{
color = q;
}
else if ( 3.0 * rgb < 2 )
{
color = p + ( q - p ) * ( ( 2.0 / 3.0 ) - rgb ) * 6.0;
}
else
{
color = p;
}
return color;
}
void rgb2hls(DWORD rgb, float &hue, float &lum, float &sat)
{
float r, g, b;
float rgb_min, rgb_max, delta;

r = GetRValue( rgb ) / 255.0; //Where RGB values = 0 / 255
g = GetGValue( rgb ) / 255.0;
b = GetBValue( rgb ) / 255.0;

rgb_max = max( r, max( g, b ) );
rgb_min = min( r, min( g, b ) );
delta = rgb_max - rgb_min;

if ( !delta ){
hue = 0.f;
sat = 0.f;
}
else if ( rgb_max == r ){
if ( g >= b ){
hue = 60 * ( g - b ) / delta;
}
else {
hue = 60 * ( g - b ) / delta + 360;
}
}
else if ( rgb_max == g){
hue = 60 * ( b - r ) / delta + 120;
}
else /*if ( rgb_max == b )*/{
hue = 60 * ( r - g ) / delta + 240;
}

lum = ( rgb_max + rgb_min ) / 2.f;

if ( lum == 0.f ){
sat = 0.f;
}
else if ( lum <= 0.5f ){
sat = delta / ( 2 * lum );
}
else {
sat = delta / ( 2 - 2 * lum );
}

}

void hls2rgb(float hue, float lum, float sat, DWORD &rgb)
{
float q, p;
float r, g, b;
float h;
float tr, tg, tb;

if ( sat == 0.f ){
r = hue * 255.f;
g = hue * 255.f;
b = hue * 255.f;
}
else {
if ( lum < 0.5f ){
q = lum * ( 1.f + sat );
}
else {
q = lum + sat - ( lum * sat );
}
p = 2.f * lum - q;

h = hue / 360.f;
//h = hue;

tr = h + 1.f / 3.0f;
tg = h;
tb = h - 1.f / 3.0f;

r = hue2rgb( p, q, tr );
g = hue2rgb( p, q, tg );
b = hue2rgb( p, q, tb );

r *= 255.f;
g *= 255.f;
b *= 255.f;

rgb = RGB( (BYTE)r, (BYTE)g, (BYTE)b );
}
}


Reference:

http://zh.wikipedia.org/wiki/HSL和HSV色彩空间

arrow
arrow
    全站熱搜

    雀悦 發表在 痞客邦 留言(0) 人氣()