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
| const
__R = 1/255;
__1T= 1/3;
__2T= 2/3;
procedure HSL2RGB(H, S, L: single; var R, G, B: byte);
function Hue2RGB(v1, v2, vH: single): single;
begin
if vH < 0 then vH := vH + 1;
if vH > 1 then vH := vH - 1;
if (6*vH) < 1 then exit( v1 + (v2-v1) * 6 * vH);
if (2*vH) < 1 then exit( v2 );
if (3*vH) < 2 then exit( v1 + (v2-v1) * ((__2T - vH) * 6));
result := v1;
end;
var
var_1, var_2: single;
begin
if S = 0 then
begin
R := round(L * 255);
G := round(L * 255);
B := round(L * 255);
end
else
begin
if L < 0.5 then
var_2 := L * ( 1+S )
else
var_2 := (L+S) - (S*L);
var_1 := 2 * L - var_2;
R := round(255 * hue2RGB(var_1, var_2, H+__1T));
G := round(255 * hue2RGB(var_1, var_2, H));
B := round(255 * hue2RGB(var_1, var_2, H-__1T));
end;
end;
procedure RGB2HSL(R, G, B: byte; var H, S, L: single);
var var_R, var_G, var_B, del_Max, del_Max2, del_R, del_G, del_B, var_Min, var_Max : single;
begin
var_R := R * __R; //RGB from 0 to 255
var_G := G * __R;
var_B := B * __R;
if var_R > var_G then
begin
if var_B < var_G then
var_Min := var_B
else
var_Min := var_G;
if var_B > var_R then
var_Max := var_B
else
var_Max := var_R;
end
else
begin
if var_B < var_R then
var_Min := var_B
else
var_Min := var_R;
if var_B > var_G then
var_Max := var_B
else
var_Max := var_G
end;
del_Max := var_Max - var_Min; //Delta RGB value
L := (var_Max + var_Min) * 0.5;
if del_Max = 0 then //This is a gray, no chroma...
begin
H := 0;
S := 0;
end
else //Chromatic data...
begin
if L < 0.5 then
S := del_Max / (var_Max + var_Min)
else
S := del_Max / (2 - var_Max - var_Min);
del_Max2 := del_Max*0.5;
del_R := (((var_Max - var_R)/6) + del_Max2) / del_Max;
del_G := (((var_Max - var_G)/6) + del_Max2) / del_Max;
del_B := (((var_Max - var_B)/6) + del_Max2) / del_Max;
if var_R = var_Max then
H := del_B-del_G
else
if var_G = var_Max then
H := __1T + del_R-del_B
else
if var_B = var_Max then
H := __2T + del_G-del_R;
if H < 0 then
H := H + 1;
if H > 1 then
H := H - 1;
end;
end; |
Partager