Právě prohlížíš: rgbhsv.h
Zpět do složkyStáhnout
  1. class hsv;
  2. class rgb;
  3. void rgb2hsv(unsigned char r, unsigned char g, unsigned char b, double &h, double &s, double &v);
  4. void hsv2rgb(double h, double s, double v, unsigned char &r, unsigned char &g, unsigned char &b);
  5.  
  6. class rgb {
  7. public:
  8. unsigned char r; // percent
  9. unsigned char g; // percent
  10. unsigned char b; // percent
  11. rgb();
  12. rgb(unsigned char, unsigned char, unsigned char);
  13. rgb(int, int, int);
  14. rgb(const hsv&);
  15. rgb& operator = (const hsv&);
  16. operator hsv();
  17. };
  18. class hsv {
  19. public:
  20. double h; // angle in degrees
  21. double s; // percent
  22. double v; // percent
  23. hsv();
  24. hsv(double, double, double);
  25. hsv(const rgb&);
  26. hsv& operator = (const rgb&);
  27. operator rgb();
  28. };
  29. rgb::rgb()
  30. {
  31. r = 0;
  32. g = 0;
  33. b = 0;
  34. }
  35. rgb::rgb(unsigned char r_i, unsigned char g_i, unsigned char b_i)
  36. {
  37. r = r_i;
  38. g = g_i;
  39. b = b_i;
  40. }
  41. rgb::rgb(int r_i, int g_i, int b_i)
  42. {
  43. r = (unsigned char)r_i;
  44. g = (unsigned char)g_i;
  45. b = (unsigned char)b_i;
  46. }
  47.  
  48. rgb::rgb(const hsv& inp)
  49. {
  50. //takhle to jde taky...
  51. }
  52.  
  53. rgb& rgb::operator= (const hsv& in)
  54. {
  55. /*r = in.h * 0.5; //vypocet!!
  56.  g = 0; //vypocet!!
  57.  b = 250; //vypocet!!*/
  58.  
  59. //rgb2hsv(r,g,b,out.h,out.s,out.v);
  60. hsv2rgb(in.h, in.s, in.v, r, g, b);
  61. return *this;
  62. }
  63.  
  64. rgb::operator hsv()
  65. {
  66. hsv out;
  67. rgb2hsv(r,g,b,out.h,out.s,out.v);
  68. return out;
  69. }
  70.  
  71. hsv::hsv()
  72. {
  73. h = 0;
  74. s = 0;
  75. v = 0;
  76. }
  77. hsv::hsv(double r_i, double g_i, double b_i)
  78. {
  79. h = r_i;
  80. s = g_i;
  81. v = b_i;
  82. }
  83.  
  84. hsv::hsv(const rgb& inp)
  85. {
  86. //takhle to jde taky...
  87. }
  88.  
  89. hsv& hsv::operator= (const rgb& in)
  90. {
  91. /*r = in.h * 0.5; //vypocet!!
  92.  g = 0; //vypocet!!
  93.  b = 250; //vypocet!!*/
  94.  
  95. //rgb2hsv(r,g,b,out.h,out.s,out.v);
  96. rgb2hsv(in.r, in.g, in.b, h, s, v);
  97. return *this;
  98. }
  99.  
  100. hsv::operator rgb()
  101. {
  102. rgb out;
  103. hsv2rgb(h,s,v, out.r,out.g,out.b);
  104. return out;
  105. }
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115. void rgb2hsv(unsigned char r, unsigned char g, unsigned char b, double &h, double &s, double &v)
  116. {
  117. //hsv out;
  118. double min, max, delta;
  119.  
  120. min = r < g ? r : g;
  121. min = min < b ? min : b;
  122.  
  123. max = r > g ? r : g;
  124. max = max > b ? max : b;
  125.  
  126. v = max/((float)255); // v
  127. delta = max - min;
  128. if( max > 0.0 ) {
  129. s = (delta / max); // s
  130. }
  131. else {
  132. // r = g = b = 0 // s = 0, v is undefined
  133. s = 0.0;
  134. h = -1; // its now undefined
  135. return;
  136. }
  137. if( r >= max ) // > is bogus, just keeps compilor happy
  138. h = ( g - b ) / delta; // between yellow & magenta
  139. else
  140. if( g >= max )
  141. h = 2.0 + ( b - r ) / delta; // between cyan & yellow
  142. else
  143. h = 4.0 + ( r - g ) / delta; // between magenta & cyan
  144.  
  145. h *= 60.0; // degrees
  146.  
  147. if( h < 0.0 )
  148. h += 360.0;
  149.  
  150. return;
  151. }
  152.  
  153.  
  154.  
  155.  
  156. void hsv2rgb(double h, double s, double v, unsigned char &r, unsigned char &g, unsigned char &b)
  157. {
  158. double hh, p, q, t, ff;
  159. long i;
  160.  
  161.  
  162. if(s <= 0.0) { // < is bogus, just shuts up warnings
  163. if(h==-1) { // in.h == NAN
  164. r = (unsigned char)v*255;
  165. g = (unsigned char)v*255;
  166. b = (unsigned char)v*255;
  167. return;
  168. }
  169. // error - should never happen
  170. r = (unsigned char)0;
  171. g = (unsigned char)0;
  172. b = (unsigned char)0;
  173. std::cout<<"Some friggin error!\n";
  174. return;
  175. }
  176. hh = h;
  177. if(hh >= 360.0) hh = 0.0;
  178. hh /= 60.0;
  179. i = (long)hh;
  180. ff = hh - i;
  181. p = v * (1.0 - s);
  182. q = v * (1.0 - (s * ff));
  183. t = v * (1.0 - (s * (1.0 - ff)));
  184.  
  185. switch(i) {
  186. case 0:
  187. r = (unsigned char)(v*255);
  188. g = (unsigned char)(t*255);
  189. b = (unsigned char)(p*255);
  190. break;
  191. case 1:
  192. r = (unsigned char)(q*255);
  193. g = (unsigned char)(v*255);
  194. b = (unsigned char)(p*255);
  195. break;
  196. case 2:
  197. r = (unsigned char)(p*255);
  198. g = (unsigned char)(v*255);
  199. b = (unsigned char)(t*255);
  200. break;
  201.  
  202. case 3:
  203. r = (unsigned char)(p*255);
  204. g = (unsigned char)(q*255);
  205. b = (unsigned char)(v*255);
  206. break;
  207. case 4:
  208. r = (unsigned char)(t*255);
  209. g = (unsigned char)(p*255);
  210. b = (unsigned char)(v*255);
  211. break;
  212. case 5:
  213. default:
  214. r = (unsigned char)(v*255);
  215. g = (unsigned char)(p*255);
  216. b = (unsigned char)(q*255);
  217. break;
  218. }
  219. return;
  220. }
  221.  
Parsed using GeSHi 1.0.8.11 at 0.026