2010-09-14 14 views
5

Tengo un conjunto de datos (perfil espectrográfico) de Longitud de onda (eje x) e Intensidad (eje y, en unidades arbitrarias que pueden tener diferentes rangos ... .)Cómo crear una imagen de pantalla de TColors e intensidades (en Delphi)

Quiero convertir estos datos numéricos a una vista gráfica como se muestra en la parte inferior de la imagen a continuación.

Pero, nunca he hecho nada en Delphi (2010) con Canvas, TImages, mapas de bits, o cualquier otra forma en que pueda obtener esto en la pantalla.

(Obviamente, si puedo convertir mis datos a una fila de píxeles de la imagen, que luego simplemente copiar esa fila tantas veces como sea necesario para mi altura de la imagen deseada.)

¿Puede alguien me punto en la dirección correcta ¿O suministra código de muestra que atraviesa los valores x, y, creando la imagen en color? Espero que mi solución me permita (o el usuario) ajustar los niveles (contraste, brillo).

Gracias de antemano.

alt text

relacionados SO mensajes: Algorithm to convert any positive integer to an RGB value

Convert light frequency to RGB?

Respuesta

2

Bueno, parece a mí como sus longitudes de onda son matices, y su intensidad es otra palabra para el brillo. Obtener los colores correctos sería una tarea realmente simple si solo tuvieras a model that represents colors in terms of hue and brightness y una forma de convertirlo a RGB ... :-)

Mostrar los colores es realmente muy simple. Puede usar un componente TImage estándar en un formulario. Una vez que usted se resuelve qué valor TColor va en una determinada posición, se puede establecer con

image.Canvas.Pixels[x, y] := aColor;

EDITAR: Cómo direccionar la longitud de onda de tono:

Esto es un poco complicado ya la izquierda el lado de la mano de su espectro parece ser el violeta, con el rojo a la derecha. En HSL, el rojo está en la posición 0. Tendrás que invertir tu eje X, entonces el rojo es 0 y el violeta es alto. Puede obtener esto diciendo básicamente value := MAX_VALUE - value;

Luego debe calibrar la línea. Establezca la longitud de onda correspondiente a rojo completo igual a 0, y el extremo azul extremo igual a cualquiera que sea su tono correspondiente. (Si puede convertir una longitud de onda a un TColor y luego un TColor a HSL que no debería ser difícil de calcular.) Ese es su rango, y necesita normalizar todas las longitudes de onda para que quepa en ese rango.

Solo observándolo, me parece que el extremo izquierdo de su espectro de ejemplo está en alrededor de 270 grados de tono en la rueda de colores, lo que equivale a 192 en una escala de 0--255. Así que tome su espectro de rojo a azul - nuevamente, recuerde que el rojo es BAJO, no ALTO - y normalícelo al rango 0--192 (o lo que sea que sea el valor real) y usted tiene su valor H.

Además, si usted tiene algunos colores en el extremo derecho de la línea de color que van más allá completo roja hacia el púrpura un poco, entonces tendrá un matiz negativo, que se envuelve alrededor de la espalda y 255.

+0

De hecho, tengo una función (en la muy buena biblioteca de componentes SDL) que convierte HSI a RGB: procedimiento HSItoRGB (Hue, Sat, Intens: double; var r, g, b: integer); ¿Entonces mi problema ahora es cómo pasar de WaveLength a HSI? – RobertFrank

+0

bastante simple en realidad. Calcula la diferencia entre la longitud de onda 0 y el tono 0, y luego normaliza el eje x a un rango de 0..255, y esa es tu H. Normaliza el eje Y a 0..255, y esa es tu L. S siempre es 255 , para producir los colores brillantes y vibrantes que muestra tu ejemplo. –

+0

¡Gracias, Mason! Todavía no estoy seguro de cómo mapear la longitud de onda (o frecuencia de la luz) a la tonalidad aunque ... – RobertFrank

1

Tiene exactamente lo que necesita en ese Delphi library de efg.
Pero realmente debería leer el artículo sobre Visible Light Spectrum primero: Spectra.
"El propósito de este programa es mostrar los colores RGB en función de la longitud de onda de la luz visible (380 a 780 nm)".

La única modificación que debe agregar es modular la intensidad. Pero como sugirió Mason, pasar por la representación de HSI hace que sea fácil ajustar la intensidad: así que una solución rápida y sucia es, una vez que se obtiene el RGB de la longitud de onda, convertir a HSI, ajustar I que volver a convertir a RGB.