
Сделал преобразование из RGB в HSL (внутреннее преобразование c точностью float, если кому-то надо, может себе вывести):
code_26978.txt
Делаю обратный преобразователь.
Потом буду в FTCG запихивать, для своих нужд

------------ Дoбавленo в 19.52:
А вот с обратным преобразованием:

Add(MainForm,858959,126,112)
{
Width=553
Height=390
Color=2105376
Caption="RGB To HSL"
Position=1
link(onCreate,16015009:doOpen,[])
}
Add(ToRGB,14403412,252,126)
{
link(onResult,3613068:in1,[])
}
Add(ListBox,16297907,644,126)
{
Left=20
Top=20
Width=495
Height=315
Font=[Arial,24,0,0,204]
}
Add(InlineCode,3613068,336,126)
{
@Hint=#10:RGB >> HSL|
WorkPoints=#3:in1|
EventPoints=#4:out1|
VarPoints=#2:H_|2:S_|2:L_|
DataPoints=#2:R_|2:G_|2:B_|
Code=#15:unit HiAsmUnit;|0:|9:interface|13://by Login :)|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|10: R:real;|10: G:real;|10: B:real;|3: |14: var_R:real;|14: var_G:real;|14: var_B:real;|3: |16: var_Min:real;|17: var_Max:real; |16: del_Max:real;|3: |10: H:real;|10: S:real;|10: L:real;|3: |14: Hi:integer;|14: Si:integer;|14: Li:integer;|3: |14: del_R:real;|14: del_G:real;|14: del_B:real;|3: |14: Temp1:real;|14: Temp2:real;|14: Temp3:real;|14: Temp4:real;|3: |3: |9: public|18: out1:THI_Event;|16: R_:THI_Event;|16: G_:THI_Event;|16: B_:THI_Event;|3: |48: procedure in1(var Data:TData; index:word); |44: procedure H_(var Data:TData; index:word);|44: procedure S_(var Data:TData; index:word);|44: procedure L_(var Data:TData; index:word);|3: |5: end;|0:|14:implementation|0:|26:procedure THiAsmClass.in1;|0:|5:begin|0:|27:R := ReadInteger(Data, R_);|27:G := ReadInteger(Data, G_);|27:B := ReadInteger(Data, B_);|0:|19://RGB from 0 to 255|41:var_R := ( R / 255 ); |21:var_G := ( G / 255 );|21:var_B := ( B / 255 );|0:|0:|19://Min. value of RGB|23:if (var_R < var_G) then|9: begin|24: Temp1 := var_R;|7: end|12: else|9: begin|24: Temp1 := var_G;|13: end; |0:|23:if (var_B < Temp1) then|9: begin|26: var_Min := var_B;|7: end|16: else|9: begin|26: var_Min := Temp1;|9: end; |0:|0:|19://Max. value of RGB|23:if (var_R > var_G) then|9: begin|24: Temp2 := var_R;|7: end|12: else|9: begin|24: Temp2 := var_G;|13: end; |0:|23:if (var_B > Temp2) then|9: begin|26: var_Max := var_B;|7: end|16: else|9: begin|26: var_Max := Temp2;|9: end; |0:|0:|0:|59:del_Max := var_Max - var_Min; //Delta RGB value|0:|31:L := ( var_Max + var_Min ) / 2;|0:|73:if ( del_Max = 0 ) then //This is a gray, no chroma...|5:begin|68: H := 0; //HSL results from 0 to 1|11: S := 0;|3:end|0:|4:else|55: //Chromatic data...|5:begin|24: if ( L < 0.5 ) then|10: begin|44: S := del_Max / ( var_Max + var_Min );|8: end|19: else |10: begin|48: S := del_Max / ( 2 - var_Max - var_Min );|9: end;|5: |5: |72: del_R := ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max;|72: del_G := ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max;|72: del_B := ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max;|0:|31: if ( var_R = var_Max ) then|8: begin|22: H := del_B - del_G;|8: end |8: else |8: begin|33: if ( var_G = var_Max ) then|11: begin|42: H := ( 1 / 3 ) + del_R - del_B;|9: end|10: else|12: begin |41: if ( var_B = var_Max ) then |50: H := ( 2 / 3 ) + del_G - del_R; |32: end; |11: end;|7: end;|0:|73://Лимитер есть, но нельзя превышать уровни цветов больше чем в 2 раза.. |20: if ( H < 0 ) then|12: begin|23: H := H + 1;|11: end;|12: |20: if ( H > 1 ) then|12: begin|23: H := H - 1;|11: end;|0:|42://Понизить точность с float до 240 едениц.|24: Hi := round(240 * H);|24: Si := round(240 * S);|24: Li := round(240 * L);|0:|25:_hi_OnEvent(out1, '); |3: |4:end;|0:|14://нижние точки|53:procedure THiAsmClass.H_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Hi);|4:end;|0:|53:procedure THiAsmClass.S_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Si);|4:end;|0:|53:procedure THiAsmClass.L_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Li);|4:end;|0:|0:|4:end.|
link(out1,9542371:in1,[])
link(R_,14403412:R,[(342,114)(310,114)(310,170)(258,170)])
link(G_,14403412:G,[(349,114)(317,114)(317,170)(265,170)])
link(B_,14403412:B,[(356,114)(324,114)(324,170)(272,170)])
AddHint(-27,56,77,13,@Hint)
}
Add(ColorDialog,16015009,196,126)
{
link(onSelect,14403412:doGetRGB,[])
}
Add(Hub,1873164,490,126)
{
OutCount=3
link(onEvent1,15724646:doString,[])
link(onEvent2,5330558:doString,[(522,139)(522,174)])
link(onEvent3,11075453:doString,[(513,146)(513,223)])
}
Add(InlineCode,9542371,406,126)
{
@Hint=#10:HSL >> RGB|
WorkPoints=#3:in1|
EventPoints=#4:out1|
VarPoints=#2:R_|2:G_|2:B_|
DataPoints=#2:H_|2:S_|2:L_|
Code=#15:unit HiAsmUnit;|0:|9:interface|13://by Login :)|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|10: H:real;|10: S:real;|10: L:real;|6: |10: R:real;|10: G:real;|10: B:real;|3: |14: Ri:integer;|14: Gi:integer;|14: Bi:integer;|3: |14: var_1:real;|14: var_2:real;|0:|14: Temp1:real;|14: Temp2:real;|6: |9: public|18: out1:THI_Event;|16: H_:THI_Event;|16: S_:THI_Event;|16: L_:THI_Event;|3: |48: procedure in1(var Data:TData; index:word); |44: procedure R_(var Data:TData; index:word);|44: procedure G_(var Data:TData; index:word);|44: procedure B_(var Data:TData; index:word);|50: function Hue_2_RGB (var v1, v2, vH :real):real;|3: |5: end;|0:|14:implementation|0:|26:procedure THiAsmClass.in1;|0:|5:begin|0:|39:H := (1 / 240) * ReadInteger(Data, H_);|39:S := (1 / 240) * ReadInteger(Data, S_);|39:L := (1 / 240) * ReadInteger(Data, L_);|0:|0:|0:|0:|60:if ( S = 0 ) then //HSL from 0 to 1|9: begin|70: Ri := Round(255 * L) ; //RGB results from 0 to 255|29: Gi := Round(255 * L) ;|29: Bi := Round(255 * L) ;|7: end|4:else|9: begin|28: if ( L < 0.5 ) then |21: begin |35: var_2 := L * ( 1 + S );|19: end |23: else |17: begin|43: var_2 := ( L + S ) - ( S * L );|16: end;|7: |21: |35: var_1 := 2 * L - var_2; |31: Temp1 := H + ( 1 / 3 );|62: Ri := Round(255 * Hue_2_RGB( var_1, var_2, Temp1 )); |56: Gi := Round(255 * Hue_2_RGB( var_1, var_2, H ));|8: |31: Temp2 := H - ( 1 / 3 );|64: Bi := Round(255 * Hue_2_RGB( var_1, var_2, Temp2 )); |8: end;|8: |29:_hi_OnEvent(out1, '); |4:end;|0:|1: |0:|80://------------------------------------------------------------------------------|20://Function Hue_2_RGB|59:function THiAsmClass.Hue_2_RGB (var v1, v2, vH :real):real;|13: |5:begin|23: if ( vH < 0 ) then |9: begin|21: vH := vH + 1; |8: end;|4: |23: if ( vH > 1 ) then |9: begin|19: vH := vH - 1; |8: end;|4: |30: if ( ( 6 * vH ) < 1 ) then|10: begin |44: result := ( v1 + ( v2 - v1 ) * 6 * vH );|10: Exit; |8: end;|4: |30: if ( ( 2 * vH ) < 1 ) then|10: begin |19: result := v2 ;|9: Exit;|8: end;|8: |30: if ( ( 3 * vH ) < 2 ) then|9: begin|60: result := ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 );|9: Exit;|12: end; |4: |13:result := v1;|4:end;|0:|0:|0:|14://нижние точки|53:procedure THiAsmClass.R_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Ri);|4:end;|0:|53:procedure THiAsmClass.G_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Gi);|4:end;|0:|53:procedure THiAsmClass.B_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Bi);|4:end;|0:|0:|4:end.|
link(out1,1873164:doEvent1,[])
link(H_,3613068:H_,[(412,114)(377,114)(377,170)(342,170)])
link(S_,3613068:S_,[(419,114)(384,114)(384,170)(349,170)])
link(L_,3613068:L_,[(426,114)(391,114)(391,170)(356,170)])
AddHint(-27,-40,77,13,@Hint)
}
Add(FormatStr,15724646,539,126)
{
DataCount=1
Mask="R %1"
link(onFString,10400009:doWork2,[])
link(Str1,9542371:R_,[(545,114)(450,114)(450,172)(412,172)])
}
Add(FormatStr,5330558,539,168)
{
DataCount=1
Mask="G %1"
link(onFString,2387884:doWork2,[])
link(Str1,9542371:G_,[(545,163)(419,163)])
}
Add(FormatStr,11075453,539,217)
{
DataCount=1
Mask="B %1"
link(onFString,2387884:doWork3,[(606,223)])
link(Str1,9542371:B_,[(545,208)(426,208)])
}
Add(HubEx,10400009,602,126)
{
link(onEvent,16297907:doAdd,[])
}
Add(HubEx,2387884,602,168)
{
Angle=3
link(onEvent,10400009:doWork3,[])
}