RGB -> HSL - где ошибка?
- From
- Alexey Tomin ()
- To
- All ()
- Date
- 2003-03-14T15:10:22Z
- Area
- RU.ALGORITHMS
From: "Alexey Tomin" <alex@soniir.samara.ru>
День добрый!
Взял из журнала какого-то код для преобразования RGB в HSL.
Работает хорошо, кроме случай R=255, B>>0, G=0 (см. коментарий).
Где подправить надо?
procedure RGBtoHSL(R,G,B: byte; out H,S,L: byte);
var
CMax, CMin: Integer;
RD, GD, BD: Integer;
CDiff, CDiffD2, CSum, CSumD2: Integer;
begin
CMin := Min( R, Min( G, B ));
CMax := Max( R, Max( G, B ));
L := (((CMax + CMin) * HSLMax) + RGBMax) div RGBMaxM2;
if CMax = CMin then begin
S := 0;
H := Undefined;
end else begin
CDiff := CMax - CMin;
CDiffD2 := CDiff div 2;
CSum := CMax + CMin;
CSumD2 := CSum div 2;
if L <= HSLMaxD2 then
S := (CDiff * HSLMax + CSumD2) div CSum
else
S := (CDiff * HSLMax + (RGBMaxM2-cDiff) div 2) div (RGBMaxM2-CDiff);
RD := ((CMax - R) * HSLMaxD6 + CDiffD2) div CDiff;
GD := ((CMax - G) * HSLMaxD6 + CDiffD2) div CDiff;
BD := ((CMax - B) * HSLMaxD6 + CDiffD2) div CDiff;
if R = CMax then
H := BD - GD // ### Здесь ошибка - BD=0, GD=40
else
if G = CMax then
H := HSLMaxD3 + RD - BD
else
H := HSLMaxM2D3 + GD - RD;
CheckRange( H );
end;
end;
--
Алексей.
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)