Cómo convertir colores entre RGB y HLS (HBS)

Seleccione idioma Seleccione idioma
Id. de artículo: 29240 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

El fragmento de código siguiente convierte los colores RGB (rojo, verde, azul) entre HBS o HLS (matiz, claridad, la saturación de matiz/saturación, brillo,).

Más información

RGBtoHLS() se toma un valor DWORD RGB, se convierte a HLS y almacena los resultados de las variables global H, L y S. HLStoRGB toma los valores actuales de H, L y S y devuelve el valor equivalente en una DWORD RGB. Las variables H, L y S sólo se escriben en por:
  1. RGBtoHLS (inicialización)
  2. Los controladores de barra de desplazamiento
Un punto de referencia para los algoritmos es Foley y van DAM, "Fundamentos de interactivo equipo gráficos", páginas 618-19. Su algoritmo es de punto flotante. CHART implementa un algoritmo integral de menos general (conectado intervalos).

Hay posibles errores de redondeo en este ejemplo. /y ((0.5 + x)) sin punto flotante es ((x + (y/2) phrased) /y), generando un pequeño error de redondeo. Esto hace que muchas de las divisiones siguientes parezca extraño.
   */ 
   #define  HLSMAX   RANGE /* H,L, and S vary over 0-HLSMAX */ 
   #define  RGBMAX   255   /* R,G, and B vary over 0-RGBMAX */ 
                           /* HLSMAX BEST IF DIVISIBLE BY 6 */ 
                           /* RGBMAX, HLSMAX must each fit in a byte. */ 

   /* Hue is undefined if Saturation is 0 (grey-scale) */ 
   /* This value determines where the Hue scrollbar is */ 
   /* initially set for achromatic colors */ 
   #define UNDEFINED (HLSMAX*2/3)

   void  RGBtoHLS(lRGBColor)

   DWORD lRGBColor;
   {
      WORD R,G,B;          /* input RGB values */ 
      BYTE cMax,cMin;      /* max and min RGB values */ 
   WORD  Rdelta,Gdelta,Bdelta; /* intermediate value: % of spread from max

   */ 
      /* get R, G, and B out of DWORD */ 
      R = GetRValue(lRGBColor);
      G = GetGValue(lRGBColor);
      B = GetBValue(lRGBColor);

      /* calculate lightness */ 
      cMax = max( max(R,G), B);
      cMin = min( min(R,G), B);
      L = ( ((cMax+cMin)*HLSMAX) + RGBMAX )/(2*RGBMAX);

      if (cMax == cMin) {           /* r=g=b --> achromatic case */ 
         S = 0;                     /* saturation */ 
         H = UNDEFINED;             /* hue */ 
      }
      else {                        /* chromatic case */ 
         /* saturation */ 
         if (L <= (HLSMAX/2))
            S = ( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin);
         else
            S = ( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) )
               / (2*RGBMAX-cMax-cMin);

         /* hue */ 
      Rdelta = ( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
      Gdelta = ( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
      Bdelta = ( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);

         if (R == cMax)
            H = Bdelta - Gdelta;
         else if (G == cMax)
            H = (HLSMAX/3) + Rdelta - Bdelta;
         else /* B == cMax */ 
            H = ((2*HLSMAX)/3) + Gdelta - Rdelta;

         if (H < 0)
            H += HLSMAX;
         if (H > HLSMAX)
            H -= HLSMAX;
      }
   }
   /* utility routine for HLStoRGB */ 
   WORD HueToRGB(n1,n2,hue)
   WORD n1;
   WORD n2;
   WORD hue;
   {
      /* range check: note values passed add/subtract thirds of range */ 
      if (hue < 0)
         hue += HLSMAX;
 
      if (hue > HLSMAX)
         hue -= HLSMAX;

      /* return r,g, or b value from this tridrant */ 
      if (hue < (HLSMAX/6))
          return ( n1 + (((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6)) );
      if (hue < (HLSMAX/2))
         return ( n2 );
      if (hue < ((HLSMAX*2)/3))
         return ( n1 +    (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6))
   );
      else
         return ( n1 );
   }

   DWORD HLStoRGB(hue,lum,sat)
   WORD hue;
   WORD lum;
   WORD sat;
    {
       WORD R,G,B;                /* RGB component values */ 
      WORD  Magic1,Magic2;       /* calculated magic numbers (really!) */ 

      if (sat == 0) {            /* achromatic case */ 
         R=G=B=(lum*RGBMAX)/HLSMAX;
         if (hue != UNDEFINED) {
            /* ERROR */ 
          }
       }
      else  {                    /* chromatic case */ 
         /* set up magic numbers */ 
         if (lum <= (HLSMAX/2))
            Magic2 = (lum*(HLSMAX + sat) + (HLSMAX/2))/HLSMAX;
         else
            Magic2 = lum + sat - ((lum*sat) + (HLSMAX/2))/HLSMAX;
         Magic1 = 2*lum-Magic2;

         /* get RGB, change units from HLSMAX to RGBMAX */ 
         R = (HueToRGB(Magic1,Magic2,hue+(HLSMAX/3))*RGBMAX +
   (HLSMAX/2))/HLSMAX;
         G = (HueToRGB(Magic1,Magic2,hue)*RGBMAX + (HLSMAX/2)) / HLSMAX;
         B = (HueToRGB(Magic1,Magic2,hue-(HLSMAX/3))*RGBMAX +
   (HLSMAX/2))/HLSMAX;
      }
      return(RGB(R,G,B));
    }
				

Propiedades

Id. de artículo: 29240 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 3.3
La información de este artículo se refiere a:
  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface sobre las siguientes plataformas
    • Microsoft Windows NT Server 3.5
    • Microsoft Windows NT Server 3.51
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows NT Workstation 3.5
    • Microsoft Windows NT Workstation 3.51
    • Microsoft Windows NT Workstation 4.0 Developer Edition
Palabras clave: 
kbmt kbhowto KB29240 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 29240

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com