Here's something I found in my "archive":
program New;
procedure RGBtoHSV(CR, CG, CB: Integer; var H, S, V: Extended);
var
aMax, aMin, Delta: Extended;
R, G, B: Extended;
begin
R := CR / 255.0;
G := CG / 255.0;
B := CB / 255.0;
aMin := MinE(R, MinE(G, B));
aMax := MaxE(R, MaxE(G, B));
delta := aMax - aMin;
V := aMax;
if aMax = 0 then
begin
S := 0;
H := 0;
end
else
begin
S := delta / aMax;
if R = aMax then
H := (G - B) / delta
else
if G = aMax then
H := 2 + (B - R) / delta
else
H := 4 + (R - G) / delta;
H := H / 6;
if H < 0 then
H := H + 1;
end;
H := H * 100;
S := S * 100;
V := V * 100;
end;
procedure HSVtoRGB(H, S, V: Extended; var R, G, B: Integer);
var
i, f, p, q, t: Integer;
begin
if S = 0 then
begin
R := Trunc(V);
G := Trunc(V);
B := Trunc(V);
end;
H := H / 60.0;
i := Trunc(H - 0.499999);
f := Trunc(H - i);
p := Trunc(V * (1 - S));
q := Trunc(V * (1 - S * f));
t := Trunc(V * (1 - S * (1 - f)));
Case i of
0:
begin
R := Trunc(V);
G := t;
B := p;
end;
1:
begin
R := p;
G := Trunc(v);
B := p;
end;
2:
begin
R := p;
G := Trunc(V);
B := t;
end;
3:
begin
R := p;
G := q;
B := Trunc(V);
end;
4:
begin
R := t;
G := p;
B := Trunc(V);
end;
else
begin
R := Trunc(V);
G := p;
B := q;
end;
end;
R := R * 255;
G := G * 255;
B := B * 255;
end;
procedure RGBtoHSL(R, G, B: Extended; var H, S, L : Extended);
var
D, Cmax, Cmin: Single;
begin
R := R / 255;
G := G / 255;
B := B / 255;
Cmax := MaxE(R, MaxE(G, B));
Cmin := MinE(R, MinE(G, B));
L := (Cmax + Cmin) / 2;
if Cmax = Cmin then
begin
H := 0;
S := 0
end
else
begin
D := Cmax - Cmin;
if L < 0.5 then S := D / (Cmax + Cmin)
else S := D / (2 - Cmax - Cmin);
if R = Cmax then H := (G - B) / D
else
if G = Cmax then
H := 2 + (B - R) / D
else
H := 4 + (R - G) / D;
h := h / 6;
if H < 0 then H := H + 1
end;
H := H * 100;
S := S * 100;
L := L * 100;
end;
function HuetoRGB(v1, v2, vH: Extended): Extended;
begin
if vH < 0 then
vH := vH + 1;
if vH > 1 then
vH := vH - 1;
if (6 * vH) < 1 then
Result := (v1 + ( v2 - v1 ) * 6 * vH)
else
if (2 * vH) < 1 then
Result := v2
else
if (3 * vH) < 2 then
Result := (v1 + ( v2 - v1 ) * ( ( 2.0 / 3.0 ) - vH ) * 6)
else
Result := v1;
end;
procedure HSLtoRGB2(H, S, L: Extended; var R, G, B: Integer);
var
temp1, temp2: Extended;
begin
H := H / 100;
S := S / 100;
L := L / 100;
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
temp2 := L * (1.0 + S)
else
temp2 := (L + S) - (S * L);
if H > 1 then
H := H / 6.0;
temp1 := (2.0 * L) - temp2
R := Round(255 * HuetoRGB(temp1, temp2, H + ( 1.0 / 3.0 )));
G := Round(255 * HuetoRGB(temp1, temp2, H));
B := Round(255 * HuetoRGB(temp1, temp2, H - ( 1.0 / 3.0 )));
end;
end;
procedure RGBtoXYZ(CR, CG, CB: Integer; var X, Y, Z: Extended);
var
R, G, B: Extended;
begin
R := CR / 255.0;
G := CG / 255.0;
B := CB / 255.0;
if (R > 0.04045) then
R := Pow(((R + 0.055 ) / 1.055), 2.4)
else
R := R / 12.92;
if (G > 0.04045) then
G := Pow(((G + 0.055 ) / 1.055), 2.4)
else
G := G / 12.92;
if (B > 0.04045) then
B := Pow(((B + 0.055 ) / 1.055), 2.4)
else
B := B / 12.92;
R := R * 100;
G := G * 100;
B := B * 100;
X := (0.412453 * R) + (0.357580 * G) + (0.180423 * B);
Y := (0.212671 * R) + (0.715160 * G) + (0.072169 * B);
Z := (0.019334 * R) + (0.119193 * G) + (0.950227 * B);
end;
procedure XYZtoRGB(X, Y, Z: Extended; var CR, CG, CB: Integer) ;
var
R, G, B: Extended;
begin
X := X / 100.0;
Y := Y / 100.0;
Z := Z / 100.0;
R := (3.240479 * X) + (-1.537150 * Y) + (-0.498535 * Z)
G := (-0.969256 * X) + (1.875992 * Y) + (0.041556 * Z)
B := (0.055648 * X) + (-0.204043 * Y) + (1.057311 * Z)
if ( R > 0.0031308 ) then
R := 1.055 * Pow(R, 1 / 2.4) - 0.055
else
R := 12.92 * R;
if ( G > 0.0031308 ) then
G := 1.055 * Pow(G, 1 / 2.4) - 0.055
else
G := 12.92 * G;
if ( B > 0.0031308 ) then
B := 1.055 * Pow(B, 1 / 2.4) - 0.055
else
B := 12.92 * B;
CR := Trunc(R * 255);
CG := Trunc(G * 255);
CB := Trunc(B * 255);
end;
procedure XYZtoCIELab(X, Y, Z: Extended; var L, a, b: Extended);
begin
X := X / 95.047;
Y := Y / 100.000;
Z := Z / 108.883;
if ( X > 0.008856 ) then
X := Pow(X, 1.0/3.0)
else
X := ( 7.787 * X ) + ( 16.0 / 116.0 );
if ( Y > 0.008856 ) then
Y := Pow(Y, 1.0/3.0)
else
Y := ( 7.787 * Y ) + ( 16.0 / 116.0 );
if ( Z > 0.008856 ) then
Z := Pow(Z, 1.0/3.0)
else
Z := ( 7.787 * Z ) + ( 16.0 / 116.0 );
L := (116.0 * Y ) - 16.0;
a := 500.0 * ( X - Y );
b := 200.0 * ( Y - Z );
end;
procedure CIELabtoXYZ(L, a, b: Extended; var X, Y, Z: Extended);
begin
Y := ( L + 16 ) / 116.0
X := ( a / 500.0 )+ Y
Z := Y - ( b / 200.0 )
if ( Pow(Y, 3) > 0.008856 ) then
Y := Pow(Y, 3)
else
Y := ( Y - (16.0 / 116.0 )) / 7.787;
if ( Pow(X, 3) > 0.008856 ) then
X := Pow(X, 3)
else
X := ( X - (16.0 / 116.0) ) / 7.787;
if ( Pow(Z, 3) > 0.008856 ) then
Z := Pow(Z, 3)
else
Z := ( Z - (16.0 / 116.0) ) / 7.787;
X := 95.047 * X;
Y := 100.000 * Y;
Z := 108.883 * Z;
end;
procedure XYZtoCIELuv (X, Y, Z: Extended; var L, U, V: Extended);
var
refU, refV: Extended;
begin
U := ( 4 * X ) / ( X + ( 15 * Y ) + ( 3 * Z ) )
V := ( 9 * Y ) / ( X + ( 15 * Y ) + ( 3 * Z ) )
Y := Y / 100.0
if ( Y > 0.008856 ) then
Y := Pow(Y, 1/3.0)
else
Y := ( 7.787 * Y ) + ( 16 / 116.0 );
refU := ( 4 * 95.047 ) / ( 95.047 + ( 15 * 100.000 ) + ( 3 * 108.883 ) );
refV := ( 9 * 100.000 ) / ( 95.047 + ( 15 * 100.000 ) + ( 3 * 108.883 ) );
L := ( 116 * Y ) - 16;
U := 13 * L * ( U - refU );
V := 13 * L * ( V - refV );
end;
procedure CIELuvtoXYZ(L, U, V: Extended; var X, Y, Z: Extended);
var
refU, refV: Extended;
begin
Y := ( L + 16 ) / 116.0
if ( Pow(Y, 3) > 0.008856 ) then
Y := Pow(Y, 3)
else
Y := ( Y - (16 / 116.0) ) / 7.787;
refU := ( 4 * 95.047 ) / ( 95.047 + ( 15 * 100.000 ) + ( 3 * 108.883 ) );
refV := ( 9 * 100.000 ) / ( 95.047 + ( 15 * 100.000 ) + ( 3 * 108.883 ) );
U := U / ( 13 * L ) + refU;
V := U / ( 13 * L ) + refV;
Y := Y * 100;
X := - ( 9 * Y * U ) / ( ( U - 4 ) * V - U * V );
Z := ( 9 * Y - ( 15 * V * Y ) - ( V * X ) ) / ( 3 * V );
end;
procedure XYZtoHunterLab(X, Y, Z: Extended; var L, a, b: Extended);
begin
L := 10.0 * sqrt( Y );
a := 17.5 * ( ( ( 1.02 * X ) - Y ) / sqrt( Y ) );
b := 7.0 * ( ( Y - ( 0.847 * Z ) ) / sqrt( Y ) );
end;
procedure HunterLabtoXYZ (L, a, b: Extended; var X, Y, Z: Extended);
begin
Y := L / 10.0;
X := a / 17.5 * L / 10.0;
Z := b / 7.0 * L / 10.0;
Y := Pow(Y, 2);
X := ( X + Y ) / 1.02;
Z := -( Z - Y ) / 0.847;
end;
procedure RGBtoYIQ(R, G, B: Integer; var Y, I, Q: Extended);
begin
Y := (0.299 * R) + (0.587 * G) + (0.114 * B);
I := (0.596 * R) + (-0.275 * G) + (-0.321 * B);
Q := (0.212 * R) + (-0.523 * G) + (0.311 * B);
end;
procedure YIQtoRGB (Y, I, Q: Extended; var R, G, B: Integer);
begin
R := Trunc((1.0 * Y) + (0.956 * I) + (0.621 * Q));
G := Trunc((1.0 * Y) + (-0.272 * I) + (-0.647 * Q));
B := Trunc((1.0 * Y) + (-1.105 * I) + (1.702 * Q));
end;
procedure RGBtoYUV (R, G, B: Integer; var Y, U, V: Extended);
begin
Y := (0.299 * R) + (0.587 * G) + (0.114 * B);
U := (-0.147 * R) + (-0.289 * G) + (0.437 * B);
V := (0.615 * R) + (-0.515 * G) + (-0.100 * B);
end;
procedure YUVtoRGB(Y, U, V: Extended; var R, G, B: Integer);
begin
R := Trunc((1.0 * Y) + (0.0 * U) + (1.140 * V));
G := Trunc((1.0 * Y) + (-0.394 * U) + (-0.581 * V));
B := Trunc((1.0 * Y) + (2.028 * U) + (0.0 * V));
end;
function NiceFloat(Float: Extended): String;
begin
Result := Padr(FloatToStr(Round(Float)), 9);
end;
const
red = 255;
green = 255;
blue = 0;
var
a, b, c: Extended;
d, e, f: Integer;
begin
ClearDebug;
WriteLn('R: '+NiceFloat(red)+' G: '+NiceFloat(green)+' B: '+NiceFloat(blue)+ 'RGB');
RGBtoHSV(red, green, blue, a, b, c);
WriteLn('H: '+NiceFloat(a)+' S: '+NiceFloat(b)+' V: '+NiceFloat(c)+ 'HSV');
RGBtoHSL(red, green, blue, a, b, c);
WriteLn('H: '+NiceFloat(a)+' S: '+NiceFloat(b)+' L: '+NiceFloat(c)+ 'HSL');
RGBtoXYZ(red, green, blue, a, b, c);
WriteLn('X: '+NiceFloat(a)+' Y: '+NiceFloat(b)+' Z: '+NiceFloat(c)+ 'XYZ');
d := Round(a);
e := Round(b);
c := Round(c);
XYZtoCIELab(d, e, f, a, b, c);
WriteLn('L: '+NiceFloat(a)+' a: '+NiceFloat(b)+' b: '+NiceFloat(c)+ 'CIE Lab');
XYZtoHunterLab(d, e, f, a, b, c);
WriteLn('L: '+NiceFloat(a)+' a: '+NiceFloat(b)+' b: '+NiceFloat(c)+'Hunter Lab');
XYZtoCIELuv(d, e, f, a, b, c);
WriteLn('L: '+NiceFloat(a)+' u: '+NiceFloat(b)+' v: '+NiceFloat(c)+ 'Luv');
RGBtoYIQ(red, green, blue, a, b, c);
WriteLn('Y: '+NiceFloat(a)+' I: '+NiceFloat(b)+' Q: '+NiceFloat(c)+ 'YIQ');
RGBtoYUV(red, green, blue, a, b, c);
WriteLn('Y: '+NiceFloat(a)+' U: '+NiceFloat(b)+' V: '+NiceFloat(c)+ 'YUV');
end.