2010-09-15 17 views
14

Esiste un modo semplice per unire due valori System.Drawing.Color? O devo scrivere il mio metodo per prendere due colori e combinarli?Esiste un modo semplice per unire due valori di System.Drawing.Color?

Se lo faccio, come si può fare?

+2

Combinali come? Se mescoli vernice rossa con vernice blu ottieni vernice viola, ma se guardi una palla blu attraverso il vetro rosso, la palla sembra nera, non viola. Che tipo di miscelazione hai in mente? –

+2

@Eric Lippert: Penso che fosse abbastanza chiaro a tutti che intendeva la fusione alfa. Qualsiasi altro tipo di miscelazione è molto più raro e più specializzato, quindi lo avrebbe menzionato esplicitamente. – Timwi

+6

@Timwi: Non era chiaro per me, quindi non era chiaro a tutti. Forse era chiaro a tutti tranne che a me. –

risposta

27

Ho scritto un metodo di utilità esattamente per questo scopo. :)

/// <summary>Blends the specified colors together.</summary> 
/// <param name="color">Color to blend onto the background color.</param> 
/// <param name="backColor">Color to blend the other color onto.</param> 
/// <param name="amount">How much of <paramref name="color"/> to keep, 
/// “on top of” <paramref name="backColor"/>.</param> 
/// <returns>The blended colors.</returns> 
public static Color Blend(this Color color, Color backColor, double amount) 
{ 
    byte r = (byte) ((color.R * amount) + backColor.R * (1 - amount)); 
    byte g = (byte) ((color.G * amount) + backColor.G * (1 - amount)); 
    byte b = (byte) ((color.B * amount) + backColor.B * (1 - amount)); 
    return Color.FromArgb(r, g, b); 
} 
+1

Questo potrebbe essere un sovraccarico dell'operatore in modo da poter scrivere: 'Color NewColor = Color1 + Color2;' Un articolo che si occupa di questo: http://msdn.microsoft.com/en-us/magazine/cc163737.aspx – JYelton

+1

Si può sempre aggiungere un "questo" solo perché le estensioni sono divertenti. – Blam

+0

@Blam: OK, fatto :) – Timwi

5

Se si desidera unire i colori in un modo che sembra più naturale per l'occhio umano, è consigliabile prendere in considerazione la possibilità di lavorare in un diverso spazio colore in RGB, ad esempio L*a*b*, HSL, HSB.

C'è un ottimo code project article on colour spaces con esempi in C#.

Potrebbe piacerti lavorare con L * a * b *, poiché è stato progettato per linearizzare la percezione delle differenze di colore e dovrebbe quindi produrre sfumature eleganti.

Problemi correlati