rgb和hsv的互相转换
来源:互联网 发布:淘宝店铺评分计算器 编辑:程序博客网 时间:2024/04/29 18:13
-
-
-
-
-
-
- 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
- {
-
-
- *s = 0;
- *h = -1;
- return;
- }
-
- if( r == max )
- *h = ( g - b ) / delta;
- else if( g == max )
- *h = 2 + ( b - r ) / delta;
- else
- *h = 4 + ( r - g ) / delta;
-
- *h *= 60;
- 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;
- 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; } }