2011-04-20 32 views
15

estoy tratando de usar esto para averiguar si un color es claro u oscuroCómo convertir Hex a RGB?

Evaluate whether a HEX value is dark or light

ahora. Se necesita en un int

float calcLuminance(int rgb) 
{ 
     int r = (rgb & 0xff0000) >> 16; 
     int g = (rgb & 0xff00) >> 8; 
     int b = (rgb & 0xff); 

     return (r*0.299f + g*0.587f + b*0.114f)/256; 
} 

Tengo un color hexadecimal sin embargo.

Se ha intentado realizar esta

var color = System.Drawing.ColorTranslator.FromHtml("#FFFFFF"); 
    int rgb = color.R + color.G + color.B; 
    var a = calcLuminance(rgb); 

llegué 0,11725 pensé que tendría que estar en el rango de 0-256 o algo por el estilo.

¿Qué estoy haciendo mal? ¿Debo encubrir R en un int? ¿O estoy solo lejos?

Respuesta

8

Estoy tratando de usar esto para averiguar si un color es claro u oscuro

sólo tiene que utilizar Color.GetBrightness()


[Editar]

Quiero determinar si debo usar blanco o negro para mi texto. Entonces, ¿cualquier cosa ≤ .5 debería usar blanco y> .5 negro?

Hay un numberofways para determinar qué color a utilizar en un fondo dado, ninguno de los cuales son perfectos.

El último enlace en realidad recomienda usar solo negro/blanco, pero eligiendo un punto de corte de 0,73 en vez de 0,5. Creo que deberías ir con eso y cambiarlo si crees que no funciona para ti.

+0

@BlueRaja - Danny Pflughoeft - algo así como este System.Drawing.Color someColor = System.Drawing.Color.FromArgb (color.R, color.G, color.B); float ab = someColor.GetBrightness(); ¿Hay alguna forma de hacerlo sin convertirlo primero a rgb? – chobo2

+3

@ chobo2 Simplemente 'float ab = System.Drawing.ColorTranslator.FromHtml (" # FFFFFF "). GetBrightness();' :) –

+0

@Chobo: Bueno, ¿cómo estás * ingresando * el color en la computadora? El ejemplo que usted dio ** es ** RGB: en '" #FFFFFF "', el primer '" FF "' es el R * (en hexadecimal) *, el segundo '" FF "' es el G, y el tercero '" FF "' es el B. Como dice @lasseespeholt en el comentario anterior, puedes obtener el brillo de tu cadena RGB en una línea. –

0

Los rangos de R, G y B de la estructura Color son 0-255.

para obtener el valor RGB que se espera de su función, se necesita desplazamiento a la izquierda en consecuencia:

int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B; 
2

El problema, como yo lo veo, es el cálculo de rgb. Se agregan los valores juntos lo que le da un número entre 0 y 3 * 255 que claramente no es el valor que su método espera. Usted tendrá que calcular como este

int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B; 

que debe ser equivalente a este (a excepción de la alfa-valor no se utiliza)

int rgb = color.ToArgb(); 

Por último, como se puede ver en Chris Haas respuesta, puede omitir este paso convirtiendo directamente a un int.

1

calcLuminance solo devuelve un porcentaje.

19

Sólo convertir la cadena hexadecimal a un entero:

int color = Convert.ToInt32("FFFFFF", 16); 
+0

Vaya, me upvoted esto porque leí mal la pregunta. Él no está realmente preguntando "Cómo convertir de hexadecimal a RGB", lo que realmente quiere saber es cómo obtener el brillo (luminancia) de un color RGB. –

+1

Tiene dos posibles preguntas diferentes. "Cómo hacer x" y "¿Hay una mejor manera que x". ¡Respondí al primero y tú respondiste el segundo! –

3

Un poco de tema, pero aquí hay un método de extensión para la estructura de Color que he creado para calcular la Luminancia con diferentes algoritmos. Espero que te ayude

public static class ColorExtensions 
{ 
    /// <summary> 
    /// Gets the luminance of the color. A value between 0 (black) and 1 (white) 
    /// </summary> 
    /// <param name="color">The color.</param> 
    /// <param name="algorithm">The type of luminance alg to use.</param> 
    /// <returns>A value between 0 (black) and 1 (white)</returns> 
    public static double GetLuminance(this Color color, LuminanceAlgorithm algorithm = LuminanceAlgorithm.Photometric) 
    { 
     switch (algorithm) 
     { 
      case LuminanceAlgorithm.CCIR601: 
       return (0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B)/255; 

      case LuminanceAlgorithm.Perceived: 
       return (Math.Sqrt(0.241 * Math.Pow(color.R, 2) + 0.691 * Math.Pow(color.G, 2) + 0.068 * Math.Pow(color.B, 2))/255); 

      case LuminanceAlgorithm.Photometric: 
       return (0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255; 
     } 

    } 

    /// <summary> 
    /// The luminances 
    /// </summary> 
    public enum LuminanceAlgorithm 
    { 
     /// <summary> 
     /// Photometric/digital ITU-R 
     /// </summary> 
     Photometric, 

     /// <summary> 
     /// Digital CCIR601 (gives more weight to the R and B components, as preciev by the human eye) 
     /// </summary> 
     CCIR601, 

     /// <summary> 
     /// A perceived luminance 
     /// </summary> 
     Perceived 
    } 
} 
7

Se puede utilizar:

public string GenerateRgba(string backgroundColor, decimal backgroundOpacity) 
{ 
Color color = ColorTranslator.FromHtml(hexBackgroundColor); 
int r = Convert.ToInt16(color.R); 
int g = Convert.ToInt16(color.G); 
int b = Convert.ToInt16(color.B); 
return string.Format("rgba({0}, {1}, {2}, {3});", r, g, b, backgroundOpacity); 
} 

Link To original Post by jeremy clifton on git