DIGILIGHT
color_transform.c
См. документацию.
1 
14 #include <stdint.h>
15 #include "color_transform.h"
16 
17 /* ******************************************************************************
18  * Function rgb_to_hsv
19  * Description: Converts an RGB color value into its equivalen in the HSV color space.
20  * Copyright 2010 by George Ruinelli
21  * The code I used as a source is from http://www.cs.rit.edu/~ncs/color/t_convert.html
22  * Parameters:
23  * 1. struct with RGB color (source)
24  * 2. pointer to struct HSV color (target)
25  * Notes:
26  * - r, g, b values are from 0..255
27  * - h = [0,360], s = [0,255], v = [0,255]
28  * - NB: if s == 0, then h = 0 (undefined)
29  ******************************************************************************/
35 void rgb_to_hsv(rgb_t *src, hsv_t *dst){
36  uint8_t min, max, delta;
37 
38  if(src->r < src->g)
39  min = src->r;
40  else
41  min = src->g;
42  if(src->b < min)
43  min = src->b;
44 
45  if(src->r > src->g)
46  max = src->r;
47  else
48  max = src->g;
49  if(src->b > max)
50  max = src->b;
51 
52  dst->v = max; // v, 0..255
53 
54  delta = max - min; // 0..255, < v
55 
56  if( max != 0 )
57  dst->s = (uint16_t)(delta)*255 / max; // s, 0..255
58  else {
59  // r = g = b = 0 // s = 0, v is undefined
60  dst->s = 0;
61  dst->h = 0;
62  return;
63  }
64 
65  if( src->r == max )
66  dst->h = (src->g - src->b)*(HSV_GRADE/6)/delta; // between yellow & magenta
67  else if( src->g == max )
68  dst->h = (HSV_GRADE/6)*2 + (src->b - src->r)*(HSV_GRADE/6)/delta; // between cyan & yellow
69  else
70  dst->h = (HSV_GRADE/6)*4 + (src->r - src->g)*(HSV_GRADE/6)/delta; // between magenta & cyan
71 
72  if( (int16_t)dst->h < 0 )
73  dst->h += HSV_GRADE;
74 }
75 
81 void hsv_to_rgb(hsv_t *src, rgb_t *dst){
82  uint8_t hi,fr, p, q, t;
83  uint8_t h_pr;
84 
85  src->h %= HSV_GRADE;
86 
87  if(src->s == 0) {
88  /* color is grayscale */
89  dst->r = dst->g = dst->b = src->v;
90  return;
91  }
92 
93  hi = src->h / (HSV_GRADE/6);
94 
95 /*
96  switch(hi) {
97  case 0:
98  h_pr = src->h; break;
99  case 1:
100  h_pr = src->h - (HSV_GRADE/6); break;
101  case 2:
102  h_pr = src->h - (HSV_GRADE/6)*2; break;
103  case 3:
104  h_pr = src->h - (HSV_GRADE/6)*3; break;
105  case 4:
106  h_pr = src->h - (HSV_GRADE/6)*4; break;
107  case 5:
108  h_pr = src->h - (HSV_GRADE/6)*5; break;
109  }
110 */
111  h_pr = src->h - (HSV_GRADE/6) * hi;
112 
113  fr = ( h_pr * 255 ) / (HSV_GRADE/6);
114  p = src->v * ( 255 - src->s ) / 255;
115  q = src->v * ( 255 - ( ( src->s * fr ) / 255 ) ) / 255;
116  t = src->v * ( 255 - ( src->s * ( 255 - fr ) / 255 ) ) / 255;
117 
118  switch(hi) {
119  case 0:
120  dst->r = src->v;
121  dst->g = t;
122  dst->b = p;
123  break;
124  case 1:
125  dst->r = q;
126  dst->g = src->v;
127  dst->b = p;
128  break;
129  case 2:
130  dst->r = p;
131  dst->g = src->v;
132  dst->b = t;
133  break;
134  case 3:
135  dst->r = p;
136  dst->g = q;
137  dst->b = src->v;
138  break;
139  case 4:
140  dst->r = t;
141  dst->g = p;
142  dst->b = src->v;
143  break;
144  case 5:
145  dst->r = src->v;
146  dst->g = p;
147  dst->b = q;
148  break;
149  }
150 }
151 
void rgb_to_hsv(rgb_t *src, hsv_t *dst)
uint16_t h
Оттенок цвета, значения в градусах 0...359.
uint8_t v
Яркость оттенка
uint8_t s
Насыщенность оттенка
Тип для представления цвета в HSV-модели
Тип для представления цвета в RGB-модели
void hsv_to_rgb(hsv_t *src, rgb_t *dst)
типы представления цвета разными способами