Publié le :
Macro CREATION_INTERNE

Conversion de couleurs HLS vers RGB

Ce code est également disponible en : Deutsch Español
Cette macro implémente l'algorithme HLS_TO_RGB de Foley et Van Dam pour transformer des valeurs de couleur HLS en leurs équivalents RGB. Elle prend en entrée la teinte (H), la luminosité (L) et la saturation (S) et retourne les trois composantes Rouge, Vert, Bleu, séparées par des virgules. La macro est entièrement écrite en langage macro SAS©, sans faire appel à des étapes DATA ou des procédures.
Analyse des données

Type : CREATION_INTERNE


La macro ne lit aucune donnée. Elle effectue des calculs mathématiques basés sur les paramètres d'entrée (h, l, s) pour générer les valeurs RGB. Les paramètres sont fournis lors de l'appel de la macro.

1 Bloc de code
Macro
Explication :
Définition d'une macro '%hlstorgb' avec trois paramètres : h (teinte), l (luminosité), s (saturation). La macro utilise des variables locales et des fonctions de macro-langage (%sysevalf, %eval, %if, %sysfunc) pour calculer les valeurs Rouge (R), Vert (G), Bleu (B) correspondantes. L'algorithme ajuste d'abord les échelles des paramètres, calcule des valeurs intermédiaires (m1, m2), puis détermine chaque composante de couleur (r, g, b) via une série de conditions. Les valeurs finales sont formatées en entiers et retournées sous forme de chaîne de caractères séparée par des virgules, représentant la couleur RGB.
Copié !
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;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Author : Perry Watts | Date : Friday, April 11, 2003