1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
//---------------------------------------------------------------------------
#include "ColorSpacesConversions.h"
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
void HSLfromRGB(unsigned char* cHSL,unsigned char* cRGB)
{
unsigned char iR=cRGB[0];
unsigned char iG=cRGB[1];
unsigned char iB=cRGB[2];
float fR = ((float)iR)/255;
float fG = ((float)iG)/255;
float fB = ((float)iB)/255;
float fL,fH,fS;
char iL,iH,iS;
float minRGB=min(fR,min(fG,fB));
float maxRGB=max(fR,max(fG,fB));
float deltaRGB=maxRGB - minRGB;
float deltaR = (((maxRGB-fR)/6)+(deltaRGB/2))/deltaRGB;
float deltaG = (((maxRGB-fG)/6)+(deltaRGB/2))/deltaRGB;
float deltaB = (((maxRGB-fB)/6)+(deltaRGB/2))/deltaRGB;
fL = (minRGB+maxRGB)/2;
if(deltaRGB==0)
fH=fS=0;
else
{
if(fL<0.5)
fS = deltaRGB/(minRGB+maxRGB);
else
fS = deltaRGB/(2.0-minRGB-maxRGB);
if(fR==maxRGB)
fH = deltaB - deltaG;
else if(fG==maxRGB)
fH = (1.0/3)+deltaR-deltaB;
else if (fB==maxRGB)
fH = (2.0/3)+deltaG-deltaR;
else
fH = 0;
if(fH<0)
fH+=1;
if(fH>1)
fH-=1;
}
iH=(unsigned char)(fH*255);
iS=(unsigned char)(fS*255);
iL=(unsigned char)(fL*255);
cHSL[0]=iH;
cHSL[1]=iS;
cHSL[2]=iL;
}
float SubFunForRGBfromHSL(float v1,float v2,float v3)
{
float vH=v3;
if(vH<0)
vH+=1;
if(vH>1)
vH-=1;
if((6*vH)<1.0)
return v1+(v2-v1)*6*vH;
if((2*vH)<1)
return v2;
if((3*vH)<2.0)
return v1+(v2-v1)*((2.0/3)-vH)*6;
return v1;
}
void RGBfromHSL(unsigned char* cRGB,unsigned char* cHSL)
{
unsigned char iH=cHSL[0];
unsigned char iS=cHSL[1];
unsigned char iL=cHSL[2];
float fH = ((float)iH)/255;
float fS = ((float)iS)/255;
float fL = ((float)iL)/255;
float v1,v2;
float fR,fG,fB;
char iR,iG,iB;
if(fS==0)
{
fR=fL;
fG=fL;
fB=fL;
}
else
{
if (fL<0.5)
v2=fL*(1.0+fS);
else
v2=(fL+fS)-(fS*fL);
v1=2*fL-v2;
fR=SubFunForRGBfromHSL(v1,v2,fH+(1.0/3));
fG=SubFunForRGBfromHSL(v1,v2,fH);
fB=SubFunForRGBfromHSL(v1,v2,fH-(1.0/3));
}
iR=(unsigned char)(fR*255);
iG=(unsigned char)(fG*255);
iB=(unsigned char)(fB*255);
cRGB[0]=iR;
cRGB[1]=iG;
cRGB[2]=iB;
}
//---------------------------------------------------------------------------
|