RGB 和 HSV 互相转换算法

一、简介

        RGB 是我们接触最多的颜色空间,分别为红色(R),绿色(G)和蓝色(B)。HSV 是用色调H,饱和度S,明亮度V来描述颜色的变化,H取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。饱和度S越高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。H表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

二、从RGB转换到HSV

  • 设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数
  • 设 max 等于 r, g, b 中的最大者
  • 设 min 等于 r, g, b 中的最小者

                                   

转换代码如下:


   
   
     
     
     
     
  1. float retmax( float a, float b, float c)//求最大值
  2. {
  3. float max = 0;
  4. max = a;
  5. if( max
  6. max = b;
  7. if( max
  8. max = c;
  9. return max;
  10. }
  11. float retmin( float a, float b, float c)//求最小值
  12. {
  13. float min = 0;
  14. min = a;
  15. if( min>b)
  16. min = b;
  17. if( min>c)
  18. min = c;
  19. return min;
  20. }
  21. //R,G,B参数传入范围( 0~ 100
  22. //转换结果h( 0~ 360),s( 0~ 100),v( 0~ 100)
  23. void rgb_to_hsv( float *h, float *s, float *v, float R, float G, float B)
  24. {
  25. float max = 0, min = 0;
  26. R = R/ 100;
  27. G = G/ 100;
  28. B = B/ 100;
  29. max = retmax(R,G,B);
  30. min = retmin(R,G,B);
  31. *v = max;
  32. if( max == 0)
  33. *s = 0;
  34. else
  35. *s = 1 - ( min/ max);
  36. if( max == min)
  37. *h = 0;
  38. else if( max == R && G>=B)
  39. *h = 60*((G-B)/( max- min));
  40. else if( max == R && G
  41. *h = 60*((G-B)/( max- min)) + 360;
  42. else if( max == G)
  43. *h = 60*((B-R)/( max- min)) + 120;
  44. else if( max == B)
  45. *h = 60*((R-G)/( max- min)) + 240;
  46. *v = *v * 100;
  47. *s = *s * 100;
  48. }

 

三、从HSV转换到RGB

1、转换公式如下:

                                 

2、转换代码如下:


   
   
     
     
     
     
  1. //参数入参范围h(0~360),s(0~100),v(0~100),这里要注意,要把s,v缩放到0~1之间
  2. //转换结果R(0~100),G(0~100),B(0~100),如需转换到0~255,只需把后面的乘100改成乘255
  3. void hsv_to_rgb (int h,int s,int v,float *R,float *G,float *B)
  4. {
  5. float C = 0,X = 0,Y = 0,Z = 0;
  6. int i= 0;
  7. float H=( float)(h);
  8. float S=( float)(s)/ 100.0;
  9. float V=( float)(v)/ 100.0;
  10. if(S == 0)
  11. *R = *G = *B = V;
  12. else
  13. {
  14. H = H/ 60;
  15. i = ( int)H;
  16. C = H - i;
  17. X = V * ( 1 - S);
  18. Y = V * ( 1 - S*C);
  19. Z = V * ( 1 - S*( 1-C));
  20. switch(i){
  21. case 0 : *R = V; *G = Z; *B = X; break;
  22. case 1 : *R = Y; *G = V; *B = X; break;
  23. case 2 : *R = X; *G = V; *B = Z; break;
  24. case 3 : *R = X; *G = Y; *B = V; break;
  25. case 4 : *R = Z; *G = X; *B = V; break;
  26. case 5 : *R = V; *G = X; *B = Y; break;
  27. }
  28. }
  29. *R = *R * 100;
  30. *G = *G * 100;
  31. *B = *B * 100;
  32. }

 

你可能感兴趣的:(C语言,算法,css,html5)