您的位置:首页 > 其它

rgb和hsv的互相转换

2011-08-29 12:24 344 查看
/******************************************************************************
* 下面两个函数实现rgb和hsv的互相转换
* r,g,b 的值在 0 到 1 之间
* h = [0,360], s = [0,1], v = [0,1]
* if s == 0, then h = -1 (undefined)
*****************************************************************************/
void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{
float min, max, delta;
min = MIN( r, g, b );
max = MAX( r, g, b );
*v = max;
delta = max - min;
if( max != 0 )
*s = delta / max;
else
{
// r = g = b = 0
// s = 0, v 未定义
*s = 0;
*h = -1;
return;
}

if( r == max )
*h = ( g - b ) / delta; // 在 yellow & magenta 之间

else if( g == max )
*h = 2 + ( b - r ) / delta; // 在 cyan & yellow 之间

else
*h = 4 + ( r - g ) / delta; // 在 magenta & cyan 之间

*h *= 60; // degrees

if( *h 0 )
*h += 360;
}

void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{
int i;
float f, p, q, t;
if( s == 0 )
{
// 灰度
*r = *g = *b = v;
return;
}

h /= 60; // 扇区 0 到 5

i = floor( h );
f = h - i;
p = v * ( 1 - s );
q = v * ( 1 - s * f );
t = v * ( 1 - s * ( 1 - f ) );

switch( i )
{
case 0:
*r = v;
*g = t;
*b = p;
break;
case 1:
*r = q;
*g = v;
*b = p;
break;
case 2
*r = p;
*g = v;
*b = t;
break;
case 3:
*r = p;
*g = q;
*b = v;
break;
case 4:
*r = t;
*g = p;
*b = v;
break;
default:
*r = v;
*g = p;
*b = q;
break;
}
}

/******************************************************************************
* 下面两个函数实现rgb和hsv的互相转换
* r,g,b 的值在 0 到 1 之间
* h = [0,360], s = [0,1], v = [0,1]
* if s == 0, then h = -1 (undefined)
*****************************************************************************/
void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{
float min, max, delta;
min = MIN( r, g, b );
max = MAX( r, g, b );
*v = max;
delta = max - min;
if( max != 0 )
*s = delta / max;
else
{
// r = g = b = 0
// s = 0, v 未定义
*s = 0;
*h = -1;
return;
}

if( r == max )
*h = ( g - b ) / delta;         // 在 yellow & magenta 之间
else if( g == max )
*h = 2 + ( b - r ) / delta;     // 在 cyan & yellow 之间
else
*h = 4 + ( r - g ) / delta;     // 在 magenta & cyan 之间

*h *= 60;                               // degrees
if( *h  0 )
*h += 360;
}

void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{
int i;
float f, p, q, t;
if( s == 0 )
{
// 灰度
*r = *g = *b = v;
return;
}

h /= 60;						// 扇区 0 到 5
i = floor( h );
f = h - i;
p = v * ( 1 - s );
q = v * ( 1 - s * f );
t = v * ( 1 - s * ( 1 - f ) );

switch( i )
{
case 0:
*r = v;
*g = t;
*b = p;
break;
case 1:
*r = q;
*g = v;
*b = p;
break;
case 2
*r = p;
*g = v;
*b = t;
break;
case 3:
*r = p;
*g = q;
*b = v;
break;
case 4:
*r = t;
*g = p;
*b = v;
break;
default:
*r = v;
*g = p;
*b = q;
break;
}
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: