Publicado el :
Macro CREACION_INTERNA

Conversión de colores HLS a RGB

Este código también está disponible en: Deutsch Français
Esta macro implementa el algoritmo HLS_TO_RGB de Foley y Van Dam para transformar valores de color HLS a sus equivalentes RGB. Toma como entrada el tono (H), la luminosidad (L) y la saturación (S) y devuelve los tres componentes Rojo, Verde, Azul, separados por comas. La macro está completamente escrita en lenguaje macro SAS©, sin utilizar pasos DATA o procedimientos.
Análisis de datos

Type : CREACION_INTERNA


La macro no lee ningún dato. Realiza cálculos matemáticos basados en los parámetros de entrada (h, l, s) para generar los valores RGB. Los parámetros se proporcionan al llamar a la macro.

1 Bloque de código
Macro
Explicación :
Definición de una macro '%hlstorgb' con tres parámetros: h (tono), l (luminosidad), s (saturación). La macro utiliza variables locales y funciones de macro-lenguaje (%sysevalf, %eval, %if, %sysfunc) para calcular los valores correspondientes de Rojo (R), Verde (G) y Azul (B). El algoritmo ajusta primero las escalas de los parámetros, calcula valores intermedios (m1, m2), y luego determina cada componente de color (r, g, b) a través de una serie de condiciones. Los valores finales se formatean como enteros y se devuelven como una cadena de caracteres separada por comas, representando el color RGB.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : Author : Perry Watts | Date : Friday, April 11, 2003