rgb和hsv的互相转换

 
  1. /******************************************************************************  
  2.  * 下面两个函数实现rgb和hsv的互相转换  
  3.  * r,g,b 的值在 0 到 1 之间  
  4.  * h = [0,360], s = [0,1], v = [0,1]  
  5.  * if s == 0, then h = -1 (undefined)  
  6.  *****************************************************************************/   
  7. void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )   
  8. {   
  9.     float min, max, delta;   
  10.     min = MIN( r, g, b );   
  11.     max = MAX( r, g, b );   
  12.     *v = max;   
  13.     delta = max - min;   
  14.     if( max != 0 )   
  15.         *s = delta / max;    
  16.     else   
  17.     {   
  18.         // r = g = b = 0    
  19.         // s = 0, v 未定义    
  20.         *s = 0;   
  21.         *h = -1;   
  22.         return;   
  23.     }   
  24.            
  25.     if( r == max )   
  26.         *h = ( g - b ) / delta;         // 在 yellow & magenta 之间    
  27.     else if( g == max )   
  28.         *h = 2 + ( b - r ) / delta;     // 在 cyan & yellow 之间    
  29.     else   
  30.         *h = 4 + ( r - g ) / delta;     // 在 magenta & cyan 之间    
  31.        
  32.     *h *= 60;                               // degrees    
  33.     if( *h  0 )   
  34.         *h += 360;   
  35. }   
  36.    
  37. void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )   
  38. {   
  39.     int i;   
  40.     float f, p, q, t;   
  41.     if( s == 0 )   
  42.     {   
  43.         // 灰度    
  44.         *r = *g = *b = v;   
  45.         return;   
  46.     }   
  47.        
  48.     h /= 60;                        // 扇区 0 到 5    
  49.     i = floor( h );   
  50.     f = h - i;    
  51.     p = v * ( 1 - s );   
  52.     q = v * ( 1 - s * f );   
  53.     t = v * ( 1 - s * ( 1 - f ) );   
  54.    
  55.     switch( i )    
  56.     {   
  57.     case 0:   
  58.         *r = v;   
  59.         *g = t;   
  60.         *b = p;   
  61.         break;   
  62.     case 1:   
  63.         *r = q;   
  64.         *g = v;   
  65.         *b = p;   
  66.         break;   
  67.     case 2   
  68.         *r = p;   
  69.         *g = v;   
  70.         *b = t;   
  71.         break;   
  72.     case 3:   
  73.         *r = p;   
  74.         *g = q;   
  75.         *b = v;   
  76.         break;   
  77.     case 4:   
  78.         *r = t;   
  79.         *g = p;   
  80.         *b = v;   
  81.         break;   
  82.     default:    
  83.         *r = v;   
  84.         *g = p;   
  85.         *b = q;   
  86.         break;   
  87.     }   
  88. }  
/****************************************************************************** 
 * 下面两个函数实现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; 
	} 
}
 
 

猜你喜欢

转载自blog.csdn.net/zhengxu25689/article/details/6728882