2011-11-04 3 views
6

En C#, comment pourrais-je générer l'image suivante par programme?Générer par programme un nuancier?

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

Je suis bien conscient de combien de temps cela prendrait au processus. C'est très bien. La performance n'est pas la priorité absolue pour le moment.

Édition Notez que je ne suis pas intéressé par la bonne région de l'image qui affiche uniquement un dégradé de niveaux de gris.

+1

Graphics.DrawImage() est assez rapide. Vous n'avez pas besoin de générer cette image lors de l'exécution, vous devez seulement connaître la correspondance inverse de la position à la couleur. –

Répondre

3

c'est un tableau de couleurs HSL. Le code ci-dessous générerait un tableau de couleurs 2d qui devrait correspondre à ce qu'il y a dans l'image. J'ai quitté la mise en œuvre de FromHSL à vous, ainsi que la façon d'obtenir de ce tableau à une image réelle:

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

Cette image est un HSL (non HSV, blanc est S = 0 dans HSV) espace de couleur, avec S à 100%, H sur l'axe horizontal, et L sur l'axe vertical. (Le dégradé de niveaux de gris est S = 0) Vous pouvez utiliser les conversions au http://www.bobpowell.net/RGBHSB.htm et simplement parcourir tous les pixels de votre rectangle.

En tant que palette de pipette simple, vous obtenez des couleurs complètement saturées (et des gris, avec le bit de droite).

Le sélecteur de couleurs Windows, à titre de comparaison, met S sur l'axe vertical (avec L = 50%) dans le grand carré, ce qui entraîne gris en bas avec un curseur séparé pour L. Ceci est moins utile comme une pipette palette. Une autre forme de sélecteur de couleur couramment vue est un cercle avec une teinte autour du cercle et une saturation en rayon (généralement en blanc, en utilisant HSV avec V = 100, et un curseur séparé pour la valeur)

Questions connexes