2008-10-21 19 views
14

Existe una manera fácil de convertir entre modelos de color en Java (RGB, HSV y Lab).Generación de paletas de colores de espectro

Suponiendo modelo de color RGB:

  • ¿Cómo calculo negro cuerpo paleta de colores del espectro? Quiero usarlo para una tabla de mapa de calor.
  • ¿Qué hay del espectro de longitud de onda única?

Editar: me encontré con que la clase ColorSpace se puede usar para realizar conversiones entre RGB/CIE y muchos otros modelos de color.

+0

Gracias, todas las respuestas son buenas. Seleccioné el que refleja el enfoque que realmente utilicé (gradiente negro-rojo-amarillo-blanco) – ddimitrov

+0

algunos QA relacionados míos que vale la pena mirar: [valores RGB del espectro visible] (http://stackoverflow.com/a/22681410/2521214) y [Índice de color de Star BV a color RGB aparente] (http://stackoverflow.com/a/22630970/2521214) – Spektre

Respuesta

2

Puede construir dicha paleta utilizando el modelo de color HSV. Eso es fácil una vez que tenga el código HSV a RGB en su lugar y juegue con los números durante algunos minutos.

Sin embargo, creo que no vale la pena agregar el código a su proyecto solo para generar una pequeña paleta.

Es mucho más fácil y menos trabajo extraer las paletas que necesita de un archivo y agregarlas como una matriz estática.

Photoshop le permite editar paletas y viene con una bonita paleta de cuerpo negro como un ajuste preestablecido.

Simplemente puede guardarlos como un archivo .act. El archivo en sí es simplemente un archivo de 256 colores en 3 bytes (el orden es leído, verde, azul, 8 bits por canal).

4

Tal vez no estoy entendiendo su pregunta, pero realmente no se puede generar un verdadero espectro de cuerpo negro a partir de un dispositivo de salida RGB. La gama de colores limitada sería un problema, al menos. Si todo lo que desea es algo que visualmente se asemeje a un espectro de cuerpo negro, eso es probablemente mucho más fácil.

Como aproximación, rampa de (R, G, B) (0,0,0) a (255,0,0), luego a (255,255,0), luego a (255,255,255). Eso te daría la transición de rojo apagado a naranja, a amarillo, a blanco.

Si quieres algo más científico, el artículo de Wikipedia sobre black body radiation tiene algunas parcelas de color frente a la temperatura. Una vez que descubra las coordenadas CIE, puede traducirlas a RGB en su espacio de color favorito.

Editar: encontrado algunas otras referencias en línea: What color is the Sun? What color is a blackbody?

+0

Lo siento, quise decir una proyección de BBS en el espacio de color del monitor (el tipo de gradiente que es utilizado para heatmaps). Los enlaces son interesantes – ddimitrov

20

Java se ha incorporado a la conversión RGB HSB. Cada vez que necesito una paleta rápida de colores en Java acabo de hacer esto:

public Color[] generateColors(int n) 
{ 
    Color[] cols = new Color[n]; 
    for(int i = 0; i < n; i++) 
    { 
     cols[i] = Color.getHSBColor((float) i/(float) n, 0.85f, 1.0f); 
    } 
    return cols; 
} 

Está un corte rápido y sucio (que sería ajustar los números 'mágicos' para su aplicación), pero para mi sencilla usos que genera una bonita y agradable paleta brillante.

+1

Gracias. Esto resuelve mis necesidades de la paleta de colores del arco iris. – ddimitrov

+4

2 años después, esto también me ayudó. Gracias. –

-1

Esta es una buena manera de hacer un cuadrado de color HSL en AS3.

/** 
* Generate a BitmapData HSL color square (n x n) of hue 
* At a low n dimension you get cool blocky color palettes (e.g. try n=10) 
*/ 
function generateColorSquare(n:uint, hue:uint):BitmapData 
      { 
       var bd:BitmapData = new BitmapData(n, n, false, 0xFFFFFF); 
       for (var i:uint=n*n; i > 0; i--) 
       { 
        bd.setPixel(i % n, Math.floor(i/n), HSBColor.convertHSBtoRGB(hue, i/(n*n), (1/n) * (i % n))); 
       } 
       return bd; 
      } 
0

Puede generar este espectro de color https://i.stack.imgur.com/ktLmt.jpg

usando el siguiente código:

public void render(Screen screen) { 
    int green = 255; 
    int red = 0; 

    for (int i = 0; i <= 255 * 2; i++) { 
     int rate = i/255; 

     screen.fillRect((x + (i * width)/6), y, width, height, new Color(red, green, 0)); 

     red += 1 - rate; 
     green -= rate; 
    } 
} 
Cuestiones relacionadas