2011-01-31 24 views
7

Quiero generar diferentes colores para mis gráficos de líneas:¿Cómo generar diferentes colores de la misma luminancia para el gráfico de líneas en Java?

  • Quiero generar igualmente diferentes colores (para el ojo humano)
  • Yo quiero que sean la misma luminancia (brillo no computarizada)

(esto excluye RGB y HSL, YIQ está cerca, pero no tiene luminancia perfectamente uniforme)

ha usado alguna bibliotecas (en Java) para manejar la generación de esquema de color uniforme?

Ya he pasado unos días sobre este tema, así que espero que algunos de ustedes tengan el mismo problema y lo resuelvan.

Gracias!

Editar: desafortunadamente, no puedo usar los paquetes java.awt en AppEngine (o cualquier cosa que use java.awt.Color).

+0

¿Ha considerado el espacio de color del laboratorio? – Rekin

+0

Sí, parece prometedor. Pero tendría que dedicar más tiempo a eso. Estoy buscando una solución, así que no tengo que pasar más días sobre este tema. – hakunin

+1

Tenga en cuenta que está creando una pesadilla de usabilidad para las personas daltónicas, que utilizan principalmente la luminancia para distinguir entre los tonos rojo-verde en los gráficos y tal. – ddimitrov

Respuesta

2

He aquí una pequeña función que escribí hace un momento de mirar la página de Wikipedia http://en.wikipedia.org/wiki/SRGB_color_space

private int makeARGB(double Y, double x, double y) { 
    // Out of gamut colour 
    int rgb = 0xFF808080; 
    double X = Y * x/y; 
    double Z = Y * (1 - x - y)/y; 
    double rlin = +3.2046 * X + -1.5372 * Y + -0.4986 * Z; 
    double r = gamma(rlin); 
    int ir = (int) (r * 255.0); 
    if (ir >= 0 && ir < 256) { 
    double glin = -0.9689 * X + +1.8758 * Y + +0.0415 * Z; 
    double g = gamma(glin); 
    int ig = (int) (g * 255.0); 
    if (ig >= 0 && ig < 256) { 
     double blin = +0.0557 * X + -0.2040 * Y + +1.0570 * Z; 
     double b = gamma(blin); 
     int ib = (int) (b * 255.0); 
     if (ib >= 0 && ib < 256) { 
     rgb = 0xFF000000 + (ir << 16) + (ig << 8) + (ib << 0); 
     } 
    } 
    } 
    return rgb; 
} 
private double gamma(double l) { 
    if (l < 0.0031308) { 
    return l * 12.92; 
    } else { 
    return 1.055 * Math.pow(l, 1.0/2.4) - 0.055; 
    } 
} 
private BufferedImage createImage() { 
    BufferedImage bm = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB); 
    for (int ix = 0; ix < bm.getWidth(); ++ix) { 
     double astar = ((double) ix)/((double) bm.getWidth()); 
     for (int iy = 1; iy < bm.getHeight(); ++iy) { 
      double bstar = ((double) iy)/((double) bm.getHeight()); 
      int rgb = makeARGB(0.3, astar, bstar); 
      bm.setRGB(ix, iy, rgb); 
     } 

    } 
    return bm; 
} 

se pasa en una luminancia Y y de color coordenadas x, y. xey son nominalmente de 0..1 pero mucho de ese 'espacio' no está en la gama sRGB, por lo que no se corresponde con un color visualizable. Y también es 0..1, intente 0.3..0.5 inicialmente.

Una imagen de ejemplo: gamut with Y=0.3

No sé nada acerca de App Engine de Google, pero es un entero ARGB el tipo de especificación de color que necesita?

+0

Reescribí tu código en Mirah (java con la sintaxis de Ruby) y siempre obtengo 'ff808080' como resultado, sin importar lo que pase. Tuve que reemplazar "0xFF808080" con Long.parseLong ("FF808080", 16) <- ¿Puede ser eso lo que está causando el problema? – hakunin

+0

Así que logré que saliera algunos colores (tenías razón con ese espacio de 0.3..0.5) pero no son muy diferentes (todos son de color amarillo). ¿Puedes publicar un ejemplo de uso para generar un palete collor de N colores? ¡Gracias! – hakunin

+0

Hmm, no es fácil generar N colores porque los bordes de la gama son un trapezoide (ver código actualizado). Tengo 2 sugerencias más: ya sea precomputar una matriz de colores RGB utilizando J2SE estándar (o cualquier otra cosa), usaría HSL pero usted no era adecuado, no estoy seguro de por qué. O bien, calcule muchos colores en el espacio RGB y colóquelos en una colección, ordene por luminancia y tome una porción del tamaño N de la colección (puedo publicar el código para esto si lo desea) –

Cuestiones relacionadas