HSV to RGB Converter

Fabi0815

Level-1
Beiträge
37
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

gibts denn hier jemand, der einen Umrechnungsbaustein von HSV ( Farbwinkel, Sättigung, Helligkeit) auf RGB ( Rot, Grün, Blau ) geschrieben hat?

Das wäre doch was für die Oscat lib?

Gruß
 
Wenn du dies bei Google fragst erhältst du jede Menge Treffer mit Codebeispielen, die sich m.E. relativ einfach z.B. in SCL- oder ST-Code umsetzen lassen ...
Wie wäre es so ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier Meine Lösung:
PROGRAM HSVtoRGB
VAR
tHSV_H : REAL;
tHSV_S : REAL;
tHSV_V : REAL;

tRGB_R : REAL;
tRGB_G : REAL;
tRGB_B : REAL;

i : INT;
f : REAL;
p : REAL;
q : REAL;
t : REAL;
END_VAR


VAR_INPUT
iHSV_H : REAL;
iHSV_S : REAL;
iHSV_V : REAL;
END_VAR
VAR_OUTPUT
oRGB : DINT;

oRGB_R : INT;
oRGB_G : INT;
oRGB_B : INT;
END_VAR

(* Copy and Scale Inputs *)
tHSV_H := iHSV_H / 360.0;
tHSV_S := iHSV_S / 100.0;
tHSV_V := iHSV_V / 100.0;


(* Check Max/Min Values *)
IF tHSV_H > 1.0 THEN
tHSV_H := 1.0;
END_IF
IF tHSV_H < 0.0 THEN
tHSV_H := 0.0;
END_IF

IF tHSV_S > 1.0 THEN
tHSV_S := 1.0;
END_IF
IF tHSV_S < 0.0 THEN
tHSV_S := 0.0;
END_IF

IF tHSV_V > 1.0 THEN
tHSV_V := 1.0;
END_IF
IF tHSV_V < 0.0 THEN
tHSV_V := 0.0;
END_IF


i:= FLOOR(X:=(tHSV_H * 6));


f := tHSV_H * 6 - i;
p := tHSV_V * (1- tHSV_S);
q := tHSV_V * (1- f * tHSV_S);
t := tHSV_V * (1- (1-f) * tHSV_S);


CASE i OF
0: tRGB_R := (tHSV_V * 255);
tRGB_G := (t * 255);
tRGB_B := (p * 255);
JMP _cpyValues;

1: tRGB_R := (q * 255);
tRGB_G := (tHSV_V * 255);
tRGB_B := (p * 255);
JMP _cpyValues;

2: tRGB_R := (p * 255);
tRGB_G := (tHSV_V * 255);
tRGB_B := (t * 255);
JMP _cpyValues;

3: tRGB_R := (p * 255);
tRGB_G := (q * 255);
tRGB_B := (tHSV_V * 255);
JMP _cpyValues;

4: tRGB_R := (t * 255);
tRGB_G := (p * 255);
tRGB_B := (tHSV_V * 255);
JMP _cpyValues;

5: tRGB_R := (tHSV_V * 255);
tRGB_G := (p * 255);
tRGB_B := (q * 255);
JMP _cpyValues;

END_CASE

(* Copy calculated Values to the Outside *)
_cpyValues :
oRGB_R := REAL_TO_INT(tRGB_R);
oRGB_G := REAL_TO_INT(tRGB_G);
oRGB_B := REAL_TO_INT(tRGB_B);

oRGB := LREAL_TO_DINT( (EXPT(256,2)*tRGB_R) + (EXPT(256,1)*tRGB_G) + (EXPT(256,0)*tRGB_B) );
 
Zuletzt bearbeitet:
Zurück
Oben