Como converter cores entre RGB e HLS (HBS)

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 29240
Sumário
O fragmento de código abaixo converte cores entre RGB (vermelho, verde, azul) e HLS/HBS (matiz, claridade, saturação/matiz, brilho, saturação).
Mais Informações
RGBtoHLS() tem um valor DWORD RGB, converte-o para HLS e armazena os resultados no que global H, L e S. HLStoRGB leva os valores atuais de H, L e S e retorna o valor equivalente de um DWORD RGB. O que H, L e S só é gravadas para por:
  1. RGBtoHLS (inicialização)
  2. Os manipuladores de barra de rolagem
Um ponto de referência para os algoritmos é Foley e VAN mãe, "Conceitos básicos de interativo computador gráficos", páginas 618-19. Seu algoritmo está em ponto flutuante. GRÁFICO implementa um menos algoritmo integral do geral (conectada intervalos).

Há possíveis erros de arredondamento em todo este exemplo. /y ((0.5 + x)) sem ponto flutuante é ((x + (y/2) phrased) /y), produzindo uma pequena ida - desativar erro. Isso faz muitas divisões seguintes aparência estranha.
   */    #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));    }				
3,00 3.10 3,50 4.00 cor RGB HLS HBS win16sdk

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 29240 - Última Revisão: 11/21/2006 15:33:13 - Revisão: 3.3

Microsoft Windows Software Development Kit 3.1, Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbhowto KB29240 KbMtpt
Comentários