Veröffentlicht am :
Makro CREATION_INTERNE

HLS zu RGB Farbkonvertierung

Dieser Code ist auch verfügbar auf: Español Français
Dieses Makro implementiert den HLS_TO_RGB-Algorithmus von Foley und Van Dam, um HLS-Farbwerte in ihre RGB-Äquivalente umzuwandeln. Es nimmt Farbton (H), Helligkeit (L) und Sättigung (S) als Eingabe und gibt die drei Komponenten Rot, Grün, Blau, durch Kommas getrennt, zurück. Das Makro ist vollständig in der SAS©-Makrosprache geschrieben, ohne DATA-Schritte oder Prozeduren zu verwenden.
Datenanalyse

Type : CREATION_INTERNE


Das Makro liest keine Daten. Es führt mathematische Berechnungen basierend auf den Eingabeparametern (h, l, s) durch, um die RGB-Werte zu generieren. Die Parameter werden beim Aufruf des Makros bereitgestellt.

1 Codeblock
Macro
Erklärung :
Definition eines Makros '%hlstorgb' mit drei Parametern: h (Farbton), l (Helligkeit), s (Sättigung). Das Makro verwendet lokale Variablen und Makrosprachenfunktionen (%sysevalf, %eval, %if, %sysfunc), um die entsprechenden Rot- (R), Grün- (G), Blau- (B) Werte zu berechnen. Der Algorithmus passt zunächst die Skalen der Parameter an, berechnet Zwischenwerte (m1, m2) und bestimmt dann jede Farbkomponente (r, g, b) über eine Reihe von Bedingungen. Die endgültigen Werte werden als Ganzzahlen formatiert und als durch Kommas getrennte Zeichenfolge zurückgegeben, die die RGB-Farbe darstellt.
Kopiert!
1/* -----------------------------------------------------------------------
2 Program : HLStoRGB.sas
3 
4 Author : Perry Watts
5 Date : Friday, April 11, 2003
6
7 Path : Pgm\Mac
8 
9 Purpose : Use Foley and Van Dam Procedure HLS_TO_RGB on p. 619
10 to calculate the corresponding RGB value.
11 ------------------------------------------------------------------- */
12 
13 %macro hlstorgb(h,l,s);
14 %local hue light sat m1 m2 rhue ghue bhue r g b rr gg bb;
15 %let hue=%sysevalf(&h - 120);
16 %let light =%sysevalf(&l/255);
17 %let sat=%sysevalf(&s/255);
18 %IF &light le 0.5 %THEN %let m2=%sysevalf(&light*(1+&sat.));
19 %ELSE %let m2=%sysevalf(&light+&sat.-&light*&sat);
20 %let m1 = %sysevalf(2 * &light. - &m2.);
21 %IF &sat eq 0 %THEN %DO;
22 %let r=&l; %let g=&l; %let b=&l;
23 %END;
24 %ELSE %DO;
25 %let rhue=%eval(&hue+120);
26 %IF &rhue gt 360 %THEN %let rhue= %eval(&rhue.-360);
27 %IF &rhue lt 0 %THEN %let rhue= %eval(&rhue.+360);
28 %IF &rhue lt 60 %THEN %let r = %sysevalf((&m1+(&m2-&m1)*&rhue./60)*255);
29 %ELSE %IF &rhue lt 180 %THEN %let r=%sysevalf(255*&m2.);
30 %ELSE %IF &rhue lt 240 %THEN %let r=%sysevalf((&m1+(&m2-&m1)*(240-&rhue)/60)*255);
31 %ELSE %let r=%sysevalf(255*&m1);
32
33 %let ghue=&hue;
34 %IF &ghue gt 360 %THEN %let ghue= %eval(&ghue.-360);
35 %IF &ghue lt 0 %THEN %let ghue= %eval(&ghue.+360);
36 %IF &ghue lt 60 %THEN %let g = %sysevalf((&m1+(&m2-&m1)*&ghue./60)*255);
37 %ELSE %IF &ghue lt 180 %THEN %let g=%sysevalf(255*&m2.);
38 %ELSE %IF &ghue lt 240 %THEN %let g=%sysevalf((&m1+(&m2-&m1)*(240-&ghue)/60)*255);
39 %ELSE %let g=%sysevalf(255*&m1);
40 
41 %let bhue=%eval(&hue-120);
42 %IF &bhue gt 360 %THEN %let bhue= %eval(&bhue.-360);
43 %IF &bhue lt 0 %THEN %let bhue= %eval(&bhue.+360);
44 %IF &bhue lt 60 %THEN %let b = %sysevalf((&m1+(&m2-&m1)*&bhue./60)*255);
45 %ELSE %IF &bhue lt 180 %THEN %let b=%sysevalf(255*&m2.);
46 %ELSE %IF &bhue lt 240 %THEN %let b=%sysevalf((&m1+(&m2-&m1)*(240-&bhue)/60)*255);
47 %ELSE %let b=%sysevalf(255*&m1);
48 %END;
49 %let rr=%sysfunc(putn(&r,3.));
50 %let gg=%sysfunc(putn(&g,3.));
51 %let bb=%sysfunc(putn(&b,3.));
52 &rr.,&gg.,&bb.
53 
54 %mend hlstorgb;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Author : Perry Watts | Date : Friday, April 11, 2003