Ich hab mich vor einiger Zeit mal mit Farbmodellen beschäftigt.
Hier ist eine Prozedur, die von
RGB nach HSB umrechnet.
Am Farbton (Hue) kannst Du festmachen, zu welchem Farbbereich eine Farbe gehört.
Allerdings, wie schon von Sir T. bemerkt, mag das subjektive Empfinden andere Eindrücke vermitteln.
Wenn z.B. die Helligheit (brightness) auf 0 steht ist, sieht die Farbe immer schwarz aus.
Delphi-Quellcode:
type
// Rgb + Hsb Werte von Farben
TRgbHsb=
Record
case integer
of
1: (red,green,blue,hue,saturation,brightness:integer);
2: (a:
array[0..5]
of integer);
end;
{------------------------------------------------------------------------------}
{ RGBToHSB }
{ Ermittelt aus den rot, grün, blau Werten in rgbhsb die korrespondierenden }
{ HSB Werte und stellt diese in die entsprechenden Felder in rgbhsb }
{------------------------------------------------------------------------------}
PROCEDURE RGBToHSB(
var rgbhsb:TRgbHsb);
var min,max,mid,imin,imax,imid,xhue:integer;
//------------------------------------------------------------------------------
PROCEDURE GetMinMax;
const midindex:
array[0..2,0..2]
of integer=((0,2,1),(2,1,0),(1,0,2));
var i:integer;
begin
with rgbhsb
do begin
min:=red;
max:=red;
imax:=0;
imin:=0;
for i:=1
to 2
do begin
if a[i]>max
then begin
max:=a[i];
imax:=i;
end;
if a[i]<min
then begin
min:=a[i];
imin:=i;
end;
end;
imid:=midindex[imin,imax];
mid:=a[imid];
end;
end;
//------------------------------------------------------------------------------
begin
with rgbhsb
do begin
if (red=green)
and (red=blue)
then begin
hue:=0;
saturation:=0;
brightness:=Round(red*100/255);
end else begin
GetMinMax;
saturation:=Round(100-100*min/max);
//Round((max-min)*100/max);
brightness:=Round(max*100/255);
hue:=imax*120+360;
xhue:=Round(((1-(max-mid)/(max-min))*60));
if ((imax+1)
mod 3)=imid
then inc(hue,xhue)
else dec(hue,xhue);
hue:=hue
mod 360;
end;
end;
end;