22 unsigned char maxValue = 0;
25 if (
static_cast<unsigned int>(
G) > max) {
30 if (
static_cast<unsigned int>(
B) > max) {
35 if (
static_cast<unsigned int>(
G) < min)
38 if (
static_cast<unsigned int>(
B) < min)
41 int delta = max - min;
43 *
S = max ? (510 * delta + max) / (2 * max) : 0;
52 *H = (120 * (
G -
B) + delta) / (2 * delta);
54 *H = (120 * (
G -
B + delta) + delta) / (2 * delta) + 300;
58 *H = 120 + (120 * (
B -
R) + delta) / (2 * delta);
60 *H = 60 + (120 * (
B -
R + delta) + delta) / (2 * delta);
64 *H = 240 + (120 * (
R -
G) + delta) / (2 * delta);
66 *H = 180 + (120 * (
R -
G + delta) + delta) / (2 * delta);
76 if (
S != 0 && H != -1) {
83 unsigned int f = H % 60;
85 unsigned int p =
static_cast<unsigned int>(2 * V * (255 -
S) + 255) / 510;
88 unsigned int q =
static_cast<unsigned int>(2 * V * (15300 -
S * f) + 15300) / 30600;
91 *
R =
static_cast<int>(q);
92 *
G =
static_cast<int>(V);
93 *
B =
static_cast<int>(
p);
96 *
R =
static_cast<int>(
p);
97 *
G =
static_cast<int>(q);
98 *
B =
static_cast<int>(V);
101 *
R =
static_cast<int>(V);
102 *
G =
static_cast<int>(
p);
103 *
B =
static_cast<int>(q);
107 unsigned int t =
static_cast<unsigned int>(2 * V * (15300 - (
S * (60 - f))) + 15300) / 30600;
110 *
R =
static_cast<int>(V);
111 *
G =
static_cast<int>(t);
112 *
B =
static_cast<int>(
p);
115 *
R =
static_cast<int>(
p);
116 *
G =
static_cast<int>(V);
117 *
B =
static_cast<int>(t);
120 *
R =
static_cast<int>(t);
121 *
G =
static_cast<int>(
p);
122 *
B =
static_cast<int>(V);
130#define UNDEFINED_HUE -1
132void RGBToHSV(
float r,
float g,
float b,
float *h,
float *s,
float *
v)
134 float max = qMax(r, qMax(g, b));
135 float min = qMin(r, qMin(g, b));
140 *s = (max - min) / max;
148 float delta = max - min;
151 *h = (g - b) / delta;
152 }
else if (g == max) {
153 *h = 2 + (b - r) / delta;
155 *h = 4 + (r - g) / delta;
165void HSVToRGB(
float h,
float s,
float v,
float *r,
float *g,
float *b)
182 i =
static_cast<int>(floor(h));
185 q =
v * (1 - (s * f));
186 t =
v * (1 - (s * (1 - f)));
223void rgb_to_hls(quint8 red, quint8 green, quint8 blue,
float * hue,
float * lightness,
float * saturation)
225 float r = red / 255.0;
226 float g = green / 255.0;
227 float b = blue / 255.0;
232 float max, min, delta;
250 s = delta / (max + min);
252 s = delta / (2 - max - min);
254 float delta_r, delta_g, delta_b;
256 delta_r = ((max - r) / 6) / delta;
257 delta_g = ((max - g) / 6) / delta;
258 delta_b = ((max - b) / 6) / delta;
261 h = delta_b - delta_g;
263 h = (1.0 / 3) + delta_r - delta_b;
265 h = (2.0 / 3) + delta_g - delta_r;
284 return n1 + (((n2 - n1) * hue) / 60);
288 return n1 + (((n2 - n1) *(240 - hue)) / 60);
293void hls_to_rgb(
float h,
float l,
float s, quint8 * r, quint8 * g, quint8 * b)
304 *r = (quint8)(
hue_value(m1, m2, h + 120) * 255 + 0.5);
305 *g = (quint8)(
hue_value(m1, m2, h) * 255 + 0.5);
306 *b = (quint8)(
hue_value(m1, m2, h - 120) * 255 + 0.5);
310void rgb_to_hls(quint8 r, quint8 g, quint8 b,
int * h,
int * l,
int * s)
312 float hue, saturation, lightness;
314 rgb_to_hls(r, g, b, &hue, &lightness, &saturation);
315 *h = (int)(hue + 0.5);
316 *l = (int)(lightness * 255 + 0.5);
317 *s = (int)(saturation * 255 + 0.5);
320void hls_to_rgb(
int h,
int l,
int s, quint8 * r, quint8 * g, quint8 * b)
323 float lightness = l / 255.0;
324 float saturation = s / 255.0;
326 hls_to_rgb(hue, lightness, saturation, r, g, b);
335void RGBToHSL(
float r,
float g,
float b,
float *h,
float *s,
float *l)
347 if ((*l = (m +
v) / 2.0) <= 0.0) {
352 if ((*s = vm =
v - m) > 0.0) {
353 *s /= (*l <= 0.5) ? (
v + m) :
366 *h = (g == m ? 5.0 + b2 : 1.0 - g2);
368 *h = (b == m ? 1.0 +
r2 : 3.0 - b2);
370 *h = (r == m ? 3.0 + g2 : 5.0 -
r2);
373 *h = fmod(*h, 360.0);
376void HSLToRGB(
float h,
float sl,
float l,
float *r,
float *g,
float *b)
381 v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
388 float fract, vsf, mid1, mid2;
394 sextant =
static_cast<int>(h);
396 vsf =
v * sv * fract;
400 case 0: *r =
v; *g = mid1; *b = m;
break;
401 case 1: *r = mid2; *g =
v; *b = m;
break;
402 case 2: *r = m; *g =
v; *b = mid1;
break;
403 case 3: *r = m; *g = mid2; *b =
v;
break;
404 case 4: *r = mid1; *g = m; *b =
v;
break;
405 case 5: *r =
v; *g = m; *b = mid2;
break;
411void HSIToRGB(
const qreal h,
const qreal s,
const qreal i, qreal *red, qreal *green, qreal *blue)
413 qreal onethird = 1.0/3.0;
414 HSYToRGB(h, s, i, red, green, blue, onethird, onethird, onethird);
416void RGBToHSI(qreal r,qreal g, qreal b, qreal *h, qreal *s, qreal *i)
418 qreal onethird = 1.0/3.0;
419 RGBToHSY(r, g, b, h, s, i, onethird, onethird, onethird);
423void HSYToRGB(
const qreal h,
const qreal s,
const qreal y, qreal *red, qreal *green, qreal *blue, qreal
R, qreal
G, qreal
B)
429 if (h>1.0 || h<0.0){hue=fmod(h, 1.0);}
else {hue=h;}
430 if (s<0.0){sat=0.0;}
else {sat=s;}
432 if (y<0.0){luma=0.0;}
435 qreal segment = 0.166667;
445 qreal max_sat, m, fract, luma_a, chroma, x;
446 if (hue >= 0.0 && hue < (segment) ) {
450 max_sat =
R + (
G*(hue*6) );
451 if (luma<=max_sat){luma_a = (luma/max_sat)*0.5; chroma=sat*2*luma_a;}
452 else {luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5; chroma=sat*(2-2*luma_a);}
455 x = (1-fabs(fmod(fract,2)-1))*chroma;
456 r = chroma; g=x; b=0;
457 m = luma-( (
R*r)+(
B*b)+(
G*g) );
458 r += m; g += m; b += m;
459 }
else if (hue >= (segment) && hue < (2.0*segment) ) {
460 max_sat = (
G+
R) - (
R*(hue-segment)*6);
463 luma_a = (luma/max_sat)*0.5; chroma=sat*(2*luma_a);
465 luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5; chroma=sat*(2-2*luma_a);
469 x = (1-fabs(fmod(fract,2)-1) )*chroma;
470 r = x; g=chroma; b=0;
471 m = luma-( (
R*r)+(
B*b)+(
G*g) );
472 r += m; g += m; b += m;
473 }
else if (hue >= (2.0*segment) && hue < (3.0*segment) ) {
474 max_sat =
G + (
B*(hue-2.0*segment)*6);
476 luma_a = (luma/max_sat)*0.5; chroma=sat*(2*luma_a);
478 luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5; chroma=sat*(2-2*luma_a);
481 x = (1-fabs(fmod(fract,2)-1) )*chroma;
482 r = 0; g=chroma; b=x;
483 m = luma-( (
R*r)+(
B*b)+(
G*g) );
484 r += m; g += m; b += m;
485 }
else if (hue >= (3.0*segment) && hue < (4.0*segment) ) {
486 max_sat = (
G+
B) - (
G*(hue-3.0*segment)*6);
488 luma_a = (luma/max_sat)*0.5; chroma=sat*(2*luma_a);
490 luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5; chroma=sat*(2-2*luma_a);
494 x = (1-fabs(fmod(fract,2)-1) )*chroma;
495 r = 0; g=x; b=chroma;
496 m = luma-( (
R*r)+(
B*b)+(
G*g) );
497 r += m; g += m; b += m;
498 }
else if (hue >= (4.0*segment) && hue < (5*segment) ) {
499 max_sat =
B + (
R*((hue-4.0*segment)*6));
501 luma_a = (luma/max_sat)*0.5; chroma=sat*(2*luma_a);
503 luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5; chroma=sat*(2-2*luma_a);
506 x = (1-fabs(fmod(fract,2)-1) )*chroma;
507 r = x; g=0; b=chroma;
508 m = luma-( (
R*r)+(
B*b)+(
G*g) );
509 r += m; g += m; b += m;
510 }
else if (hue >= (5.0*segment) && hue <= 1.0) {
511 max_sat = (
B+
R) - (
B*(hue-5.0*segment)*6);
513 luma_a = (luma/max_sat)*0.5; chroma=sat*(2*luma_a);
515 luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5; chroma=sat*(2-2*luma_a);
518 x = (1-fabs(fmod(fract,2)-1) )*chroma;
519 r = chroma; g=0; b=x;
520 m = luma-( (
R*r)+(
B*b)+(
G*g) );
521 r += m; g += m; b += m;
541void RGBToHSY(
const qreal r,
const qreal g,
const qreal b, qreal *h, qreal *s, qreal *y, qreal
R, qreal
G, qreal
B)
545 qreal red; qreal green; qreal blue;
546 if (r<0.0){red=0.0;}
else {red=r;}
547 if (g<0.0){green=0.0;}
else {green=g;}
548 if (b<0.0){blue=0.0;}
else {blue=b;}
550 qreal minval = qMin(r, qMin(g, b));
551 qreal maxval = qMax(r, qMax(g, b));
559 luma=(
R*red+
G*green+
B*blue);
561 qreal chroma = maxval-minval;
575 hue = (g-b)/chroma + 6.0;
577 }
else if(maxval==g) {
578 hue = (b-r)/chroma + 2.0;
579 }
else if(maxval==b) {
580 hue = (r-g)/chroma + 4.0;
588 qreal segment = 0.166667;
589 if (hue>1.0 || hue<0.0) {
593 if (hue>=0.0 && hue<segment) {
594 max_sat =
R +
G*(hue*6);
595 }
else if (hue>=segment && hue<(2.0*segment)) {
596 max_sat = (
G+
R) -
R*((hue-segment)*6);
597 }
else if (hue>=(2.0*segment) && hue<(3.0*segment)) {
598 max_sat =
G +
B*((hue-2.0*segment)*6);
599 }
else if (hue>=(3.0*segment) && hue<(4.0*segment)) {
600 max_sat = (
B+
G) -
G*((hue-3.0*segment)*6);
601 }
else if (hue>=(4.0*segment) && hue<(5.0*segment)) {
602 max_sat = (
B) +
R*((hue-4.0*segment)*6);
603 }
else if (hue>=(5.0*segment) && hue<=1.0) {
604 max_sat = (
R+
B) -
B*((hue-5.0*segment)*6);
609 if(max_sat>1.0 || max_sat<0.0){
610 max_sat=(fmod(max_sat,1.0));
614 if (luma <= max_sat) {
615 luma_a = (luma/max_sat)*0.5;
617 luma_a = ((luma-max_sat)/(1-max_sat)*0.5)+0.5;
621 sat = (luma <= max_sat) ? (chroma/ (2*luma_a) ) :(chroma/(2.0-(2*luma_a) ) ) ;
627 if (sat<0.0){sat=0.0;}
628 if (luma<0.0){luma=0.0;}
640void HCIToRGB(
const qreal h,
const qreal c,
const qreal i, qreal *red, qreal *green, qreal *blue)
647 if(i<0.0){intensity = 0.0;}
else{intensity = i;}
648 if (h>1.0 || h<0.0){hue=fmod(h, 1.0);}
else {hue=h;}
649 if(c<0.0){chroma = 0.0;}
else{chroma = c;}
650 const qreal onethird = 1.0/3.0;
655 int fract =
static_cast<int>(hue*6.0);
656 qreal x = (1-fabs(fmod(hue*6.0,2)-1) )*chroma;
658 case 0:r = chroma; g=x; b=0;
break;
659 case 1:r = x; g=chroma; b=0;
break;
660 case 2:r = 0; g=chroma; b=x;
break;
661 case 3:r = 0; g=x; b=chroma;
break;
662 case 4:r = x; g=0; b=chroma;
break;
663 case 5:r = chroma; g=0; b=x;
break;
665 qreal m = intensity-( onethird*(r+g+b) );
666 r += m; g += m; b += m;
673void RGBToHCI(
const qreal r,
const qreal g,
const qreal b, qreal *h, qreal *c, qreal *i)
675 qreal minval = qMin(r, qMin(g, b));
676 qreal maxval = qMax(r, qMax(g, b));
679 qreal intensity = 0.0;
680 intensity=(r+g+b)/3.0;
681 qreal chroma = maxval-minval;
692 hue = (g-b)/chroma + 6.0;
694 }
else if(maxval==g) {
695 hue = (b-r)/chroma + 2.0;
696 }
else if(maxval==b) {
697 hue = (r-g)/chroma + 4.0;
700 sat= 1-(minval/intensity);
708void HCYToRGB(
const qreal h,
const qreal c,
const qreal y, qreal *red, qreal *green, qreal *blue, qreal
R, qreal
G, qreal
B)
713 if (h>1.0 || h<0.0){hue=(fmod((h*2.0), 2.0))/2.0;}
else {hue=h;}
721 int fract =
static_cast<int>(hue*6.0);
722 qreal x = (1-fabs(fmod(hue*6.0,2)-1) )*chroma;
724 case 0:r = chroma; g=x; b=0;
break;
725 case 1:r = x; g=chroma; b=0;
break;
726 case 2:r = 0; g=chroma; b=x;
break;
727 case 3:r = 0; g=x; b=chroma;
break;
728 case 4:r = x; g=0; b=chroma;
break;
729 case 5:r = chroma; g=0; b=x;
break;
731 qreal m = luma-( (
R*r)+(
B*b)+(
G*g) );
732 r += m; g += m; b += m;
739void RGBToHCY(
const qreal r,
const qreal g,
const qreal b, qreal *h, qreal *c, qreal *y, qreal
R, qreal
G, qreal
B)
741 qreal minval = qMin(r, qMin(g, b));
742 qreal maxval = qMax(r, qMax(g, b));
751 chroma = maxval-minval;
765 hue = (g-b)/chroma + 6.0;
767 }
else if(maxval==g) {
768 hue = (b-r)/chroma + 2.0;
769 }
else if(maxval==b) {
770 hue = (r-g)/chroma + 4.0;
774 if (chroma<0.0){chroma=0.0;}
775 if (luma<0.0){luma=0.0;}
777 *h=qBound(0.0,hue,1.0);
782void RGBToYUV(
const qreal r,
const qreal g,
const qreal b, qreal *y, qreal *
u, qreal *
v, qreal
R, qreal
G, qreal
B)
785 qreal luma =
R*r+
G*g+
B*b;
786 qreal chromaBlue = uvmax*( (b - luma) / (1.0-
B) );
787 qreal chromaRed = uvmax*( (r - luma) / (1.0-
R) );
790 *
u = chromaBlue+uvmax;
791 *
v = chromaRed+uvmax;
793void YUVToRGB(
const qreal y,
const qreal
u,
const qreal
v, qreal *r, qreal *g, qreal *b, qreal
R, qreal
G, qreal
B)
796 qreal chromaBlue =
u-uvmax;
797 qreal chromaRed =
v-uvmax;
801 qreal red = y+(chromaRed * (negR / uvmax) );
802 qreal green = y-(chromaBlue * ((
B*negB) / (uvmax*
G)) ) - (chromaRed* ((
R*negR) / (uvmax*
G)));
803 qreal blue = y+(chromaBlue * (negB / uvmax) );
810void LabToLCH(
const qreal l,
const qreal a,
const qreal b, qreal *L, qreal *
C, qreal *H)
812 qreal atemp = (a - 0.5)*10.0;
813 qreal btemp = (b - 0.5)*10.0;
814 *L=qBound(0.0,l,1.0);
815 *
C=sqrt( pow(atemp,2.0) + pow(btemp,2.0) )*0.1;
816 qreal hue = (atan2(btemp,atemp))* 180.0 /
M_PI;
821 hue = fmod(hue, 360.0);
826void LCHToLab(
const qreal L,
const qreal
C,
const qreal H, qreal *l, qreal *a, qreal *b)
828 qreal chroma = qBound(0.0,
C,1.0);
829 qreal hue = (qBound(0.0,H,1.0)*360.0)*
M_PI / 180.0;
830 *l=qBound(0.0,L,1.0);
831 *a=(chroma * cos(hue) ) + 0.5;
832 *b=(chroma * sin(hue) ) + 0.5;
835void XYZToxyY(
const qreal X,
const qreal Y,
const qreal Z, qreal *x, qreal *y, qreal *yY)
844void xyYToXYZ(
const qreal x,
const qreal y,
const qreal yY, qreal *X, qreal *Y, qreal *Z)
850 *Z=((1.0-xb-yb)*yYb)/yb;
856 qreal cyan, magenta, yellow, key = 1.0;
860 if ( cyan < key ) {key = cyan;}
861 if ( magenta < key ) {key = magenta;}
862 if ( yellow < key ) {key = yellow;}
870 cyan = ( cyan - key ) / ( 1.0 - key );
871 magenta = ( magenta - key ) / ( 1.0 - key );
872 yellow = ( yellow - key ) / ( 1.0 - key );
875 *c=qBound(0.0,cyan ,1.0);
876 *m=qBound(0.0,magenta,1.0);
877 *y=qBound(0.0,yellow ,1.0);
878 *k=qBound(0.0,key ,1.0);
889 cyan = ( cyan * ( 1.0 - key ) + key );
890 magenta = ( magenta * ( 1.0 - key ) + key );
891 yellow = ( yellow * ( 1.0 - key ) + key );
893 *c=qBound(0.0,cyan ,1.0);
894 *m=qBound(0.0,magenta,1.0);
895 *y=qBound(0.0,yellow ,1.0);
Eigen::Matrix< double, 4, 2 > S
Eigen::Matrix< double, 4, 2 > R
void hls_to_rgb(float h, float l, float s, quint8 *r, quint8 *g, quint8 *b)
float hue_value(float n1, float n2, float hue)
void LabToLCH(const qreal l, const qreal a, const qreal b, qreal *L, qreal *C, qreal *H)
void XYZToxyY(const qreal X, const qreal Y, const qreal Z, qreal *x, qreal *y, qreal *yY)
void HSYToRGB(const qreal h, const qreal s, const qreal y, qreal *red, qreal *green, qreal *blue, qreal R, qreal G, qreal B)
void RGBToHSV(float r, float g, float b, float *h, float *s, float *v)
void RGBToHSI(qreal r, qreal g, qreal b, qreal *h, qreal *s, qreal *i)
void HCIToRGB(const qreal h, const qreal c, const qreal i, qreal *red, qreal *green, qreal *blue)
void RGBToYUV(const qreal r, const qreal g, const qreal b, qreal *y, qreal *u, qreal *v, qreal R, qreal G, qreal B)
void LCHToLab(const qreal L, const qreal C, const qreal H, qreal *l, qreal *a, qreal *b)
void RGBToHCI(const qreal r, const qreal g, const qreal b, qreal *h, qreal *c, qreal *i)
void rgb_to_hls(quint8 red, quint8 green, quint8 blue, float *hue, float *lightness, float *saturation)
void RGBToHCY(const qreal r, const qreal g, const qreal b, qreal *h, qreal *c, qreal *y, qreal R, qreal G, qreal B)
void HSIToRGB(const qreal h, const qreal s, const qreal i, qreal *red, qreal *green, qreal *blue)
void RGBToHSL(float r, float g, float b, float *h, float *s, float *l)
void RGBToHSY(const qreal r, const qreal g, const qreal b, qreal *h, qreal *s, qreal *y, qreal R, qreal G, qreal B)
void HSVToRGB(float h, float s, float v, float *r, float *g, float *b)
void YUVToRGB(const qreal y, const qreal u, const qreal v, qreal *r, qreal *g, qreal *b, qreal R, qreal G, qreal B)
void hsv_to_rgb(int H, int S, int V, int *R, int *G, int *B)
void CMYToCMYK(qreal *c, qreal *m, qreal *y, qreal *k)
void xyYToXYZ(const qreal x, const qreal y, const qreal yY, qreal *X, qreal *Y, qreal *Z)
void CMYKToCMY(qreal *c, qreal *m, qreal *y, qreal *k)
void HSLToRGB(float h, float sl, float l, float *r, float *g, float *b)
void rgb_to_hsv(int R, int G, int B, int *H, int *S, int *V)
void HCYToRGB(const qreal h, const qreal c, const qreal y, qreal *red, qreal *green, qreal *blue, qreal R, qreal G, qreal B)