rgb和hsv的互相转换

来源:互联网 发布:淘宝店铺评分计算器 编辑:程序博客网 时间:2024/04/29 18:13
 
  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. }  
原创粉丝点击