2009-04-10 10 views
23

Desidero scurire un colore esistente da utilizzare in un pennello sfumato. Qualcuno potrebbe dirmi come farlo per favore?Come si regola la luminosità di un colore?

C#, NET 2.0, GDI +

Color AdjustBrightness(Color c1, float factor) 
    { 

     float r = ((c1.R * factor) > 255) ? 255 : (c1.R * factor); 
     float g = ((c1.G * factor) > 255) ? 255 : (c1.G * factor); 
     float b = ((c1.B * factor) > 255) ? 255 : (c1.B * factor); 

     Color c = Color.FromArgb(c1.A,(int)r, (int)g, (int)b); 
     return c ; 

    } 

risposta

25

Come un approccio semplice, si può solo fattore i valori RGB:

Color c1 = Color.Red; 
    Color c2 = Color.FromArgb(c1.A, 
     (int)(c1.R * 0.8), (int)(c1.G * 0.8), (int)(c1.B * 0.8)); 

(che dovrebbe oscurare esso o, ad esempio, * 1.25 per illuminare esso)

+4

Questo funziona, ma doesn' In realtà danno valori precisi per i valori di colore percettivi. Suggerirei di dare un'occhiata alla risposta di Richard o del dommer per i dettagli del modello di colore HSL/HSV. – Ant

+5

Devi stare attento se decidi di usare * 1.25 per rendere più luminoso come se il risultato fosse superiore a 255, ma genererebbe un'eccezione. –

16

Converti da RGB a HSV (o HSL), quindi regolare il V (o L) verso il basso e poi convertire indietro.

Mentre System.Drawing.Color fornisce metodi per ottenere la tonalità (H), la saturazione (S) e la luminosità non fornisce molto nel modo di altre conversioni, notevole nulla per creare una nuova istanza da HSV (o valori HSV), ma il la conversione è abbastanza semplice da implementare. Gli articoli di wikipedia danno una conversione decente, iniziando qui: "HSL and HSV".

9

Ecco po 'di codice C# per le conversioni Richard menzionati:

RGB to HSL/HSL to RGB in C#

+0

Il link è rotto. Funziona senza www nell'URL: http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm –

+0

C'è un bug nel codice di conversione. Color.Red (# FF0000) -> hsl -> output: # 808080. Molti altri colori (Color.OrangeRed, Color.Yellow, Color.Green) vengono convertiti senza problemi. – Julo

+1

** FIX **: aggiungi 'if (h> = 6f) h - = 6f; if (h <0f) h + = 6f; 'prima di' h/= 6.0; 'alla funzione' RGB2HSL'. – Julo

19

Si potrebbe anche provare a utilizzare

ControlPaint.Light(baseColor, percOfLightLight) 

ControlPaint.Light

o

ControlPaint.Dark(baseColor, percOfDarkDark) 

ControlPaint.Dark

+1

grazie ... Non sapevo che la classe ControlPaint fosse disponibile – Brad

+1

Nota che queste funzioni hanno un comportamento speciale quando vengono utilizzate sui colori di sistema (come specificato nella documentazione) – MicroVirus

2

Mentre i metodi di cui sopra fanno scurire il colore, ma si adattano il modo tonalità per tanto il risultato non sembra molto buona. La migliore risposta è usare la classe Rich Newman's HSLColor e regolare la luminosità.

public Color Darken(Color color, double darkenAmount) { 
    HSLColor hslColor = new HSLColor(color); 
    hslColor.Luminosity *= darkenAmount; // 0 to 1 
    return hslColor; 
} 
+0

Anche l'attributo Luminosità può essere aumentato. Ad esempio 'hslColor.Luminosity * = 1.2;' La luminosità è un valore compreso tra 0 e 240.Se supera i 240 automaticamente calotta a 240. – Hybris95

+0

La mia comprensione è che il valore di luminosità in HSL non è molto vicino a qualcosa che si potrebbe chiamare "luminosità". Fare qualcosa di più leggero probabilmente lo renderà più luminoso, ma non della stessa quantità per ogni colore. https://en.wikipedia.org/wiki/HSL_and_HSV –

1

È necessario tenere traccia che il valore non si estende al di sotto o al di sopra 0 255

miglior approccio è quello di utilizzare Math.max/Math.min

dim newValue as integer = ... 
'correct value if it is below 0 or above 255 
newValue = Math.Max(Math.Min(newValue,255),0) 
Problemi correlati