2011-11-04 32 views
6

En C#, ¿cómo podría generar la siguiente imagen mediante programación?¿Generar tabla de colores por programación?

http://deathmatchgame.files.wordpress.com/2010/07/color_picker.png

estoy bien consciente de cuánto tiempo se tardaría en proceso. Esta bien. El rendimiento no es la máxima prioridad en este momento.

Editar Tenga en cuenta que no estoy interesado en la región correcta de la imagen que solo muestra un degradado de escala de grises.

+1

Graphics.DrawImage() es bastante rápido. No es necesario generar esta imagen en tiempo de ejecución, solo necesita conocer el mapeo inverso de posición a color. –

Respuesta

3

Desde el aspecto de es una carta de colores HSL. El siguiente código generaría una matriz de 2d colores que debería corresponder a lo que hay en la imagen. He dejado la implementación de FromHSL depende de usted, así como la forma de obtener de esta matriz a una imagen real:

const int size = 1000; 
const double ratio = 1.0/size; 
const double saturation = 1.0; 
Color[,] colors = new Color[size,size]; 
for (int i = 0; i < size; i++) 
{ 
    double lightness = 1.0 - i*ratio; 
    for (int j = 0; j < size; j++) 
    { 
     double hue = j*ratio; 
     colors[i, j] = FromHSL(hue, saturation, lightness); 
    } 
} 
4

Esta imagen es una HSL (no VHS, blanco es S = 0 en HSV) espacio de color, con S al 100%, H en el eje horizontal y L en el eje vertical. (El gradiente de la escala de grises es S = 0). Puede usar las conversiones en http://www.bobpowell.net/RGBHSB.htm y simplemente iterar sobre todos los píxeles en su rectángulo.

Como una simple paleta de cuentagotas, esto le da colores totalmente saturados (y grises, con el bit a la derecha).

El selector de color de Windows, por comparación, coloca S en el eje vertical (con L = 50%) en el cuadrado grande, lo que resulta gris en la parte inferior con un control deslizante separado para L. Esto es menos útil como cuentagotas paleta. Otra forma de selector de color comúnmente vista es un círculo con matiz alrededor del círculo y saturación como radio (generalmente esto pone blanco en el centro, usando HSV con V = 100, y un deslizador separado para el valor)

Cuestiones relacionadas