Wie kann ich feststellen, dunkler oder heller Farbe Variante einer bestimmten Farbe?

StackOverflow https://stackoverflow.com/questions/97646

  •  01-07-2019
  •  | 
  •  

Frage

eine Quelle Farbe eines Farbtons durch das System oder Benutzer angegeben wird, würde ich einen einfachen Algorithmus, wie ich eine helle oder dunkler arbeiten Varianten der ausgewählten Farbe verwenden kann. Ähnlich wie bei Windows Live Messenger verwendet Effekte für die Schnittstelle den Benutzer Styling.

Die Sprache ist C # mit .NET 3.5.

Als Reaktion auf Kommentar: Farbe Format (Alpha) RGB. Mit Werten als Bytes oder schwimmt.

Markierung Antwort: Für den Rahmen meiner Verwendung (ein paar einfachen UI-Effekte), die Antwort, die ich als angenommen bin Kennzeichnung ist eigentlich die einfachste für diesen Kontext. Allerdings habe ich auch Stimmen zu den komplexeren und präzise Antworten, aufgegeben. Jeder erweiterte Farboperationen zu tun und dieses Thema in Zukunft zu finden, sollte auf jeden Fall diejenigen überprüfen. Dank SO. :)

War es hilfreich?

Lösung

Sie einfach die RGB-Werte durch die Menge multiplizieren Sie die Höhe ändern möchten. Wenn eine der Farben bereits in dem Max-Wert ist, dann kann man nicht macht es eine helles (mit HSV Mathe sowieso.)

Dies gibt genau die gleiche Ergebnis mit viel weniger Mathe als HSV-Schale und dann V. Modifizieren Dies ergibt das gleiche Ergebnis wie zu HSL Schalten und dann L ändern, solange Sie nicht wollen, Sättigung zu verlieren beginnen.

Andere Tipps

XNA gibt es die Color.Lerp statische Methode , die als Differenz zwischen zwei Farben tut dies.

Lerp ist eine mathematische Operation zwischen zwei Schwimmer, die den Wert des ersten durch ein Verhältnis der Differenz zwischen ihnen ändern.

Hier ist eine Erweiterung Methode, um es zu einem float zu tun:

public static float Lerp( this float start, float end, float amount)
{
    float difference = end - start;
    float adjusted = difference * amount;
    return start + adjusted;
}

So dann eine einfache Lerp zwischen zwei Farben RGB mit wäre:

public static Color Lerp(this Color colour, Color to, float amount)
{
    // start colours as lerp-able floats
    float sr = colour.R, sg = colour.G, sb = colour.B;

    // end colours as lerp-able floats
    float er = to.R, eg = to.G, eb = to.B;

    // lerp the colours to get the difference
    byte r = (byte) sr.Lerp(er, amount),
         g = (byte) sg.Lerp(eg, amount),
         b = (byte) sb.Lerp(eb, amount);

    // return the new colour
    return Color.FromArgb(r, g, b);
}

Ein Beispiel dieser anzuwenden wäre so etwas wie:

// make red 50% lighter:
Color.Red.Lerp( Color.White, 0.5f );

// make red 75% darker:
Color.Red.Lerp( Color.Black, 0.75f );

// make white 10% bluer:
Color.White.Lerp( Color.Blue, 0.1f );

HSV (Farbton / Sättigung / Value) auch HSL genannt (Farbton / Sättigung / Helligkeit) ist nur eine andere Farbdarstellung.

Mit dieser Darstellung zu verwenden ist es einfacher, die Helligkeit einzustellen. So konvertiert von RGB nach HSV, erhellen des 'V', dann in RGB konvertieren zurück.

Im Folgenden finden Sie einige C-Code zu konvertieren

void RGBToHSV(unsigned char cr, unsigned char cg, unsigned char cb,double *ph,double *ps,double *pv)
{
double r,g,b;
double max, min, delta;

/* convert RGB to [0,1] */

r = (double)cr/255.0f;
g = (double)cg/255.0f;
b = (double)cb/255.0f;

max = MAXx(r,(MAXx(g,b)));
min = MINx(r,(MINx(g,b)));

pv[0] = max;

/* Calculate saturation */

if (max != 0.0)
    ps[0] = (max-min)/max;
else
    ps[0] = 0.0; 

if (ps[0] == 0.0)
{
    ph[0] = 0.0f;   //UNDEFINED;
    return;
}
/* chromatic case: Saturation is not 0, so determine hue */
delta = max-min;

if (r==max)
{
    ph[0] = (g-b)/delta;
}
else if (g==max)
{
    ph[0] = 2.0 + (b-r)/delta;
}
else if (b==max)
{
    ph[0] = 4.0 + (r-g)/delta;
}
ph[0] = ph[0] * 60.0;
if (ph[0] < 0.0)
    ph[0] += 360.0;
}

void HSVToRGB(double h,double s,double v,unsigned char *pr,unsigned char *pg,unsigned char *pb)
{
int i;
double f, p, q, t;
double r,g,b;

if( s == 0 )
{
    // achromatic (grey)
    r = g = b = v;
}
else
{
    h /= 60;            // sector 0 to 5
    i = (int)floor( h );
    f = h - i;          // factorial part of h
    p = v * ( 1 - s );
    q = v * ( 1 - s * f );
    t = v * ( 1 - s * ( 1 - f ) );
    switch( i )
    {
    case 0:
        r = v;
        g = t;
        b = p;
    break;
    case 1:
        r = q;
        g = v;
        b = p;
    break;
    case 2:
        r = p;
        g = v;
        b = t;
    break;
    case 3:
        r = p;
        g = q;
        b = v;
    break;
    case 4:
        r = t;
        g = p;
        b = v;
    break;
    default:        // case 5:
        r = v;
        g = p;
        b = q;
    break;
    }
}
r*=255;
g*=255;
b*=255;

pr[0]=(unsigned char)r;
pg[0]=(unsigned char)g;
pb[0]=(unsigned char)b;
}

Reiche Newman diskutiert HSL-Farb in Bezug auf .NET System.Drawing.Color auf seinem Blog und sogar bietet eine HSLColor Klasse , die für Sie die ganze Arbeit tut. Konvertieren Sie Ihre System.Drawing.Color zu einem HSLColor, addieren / subtrahieren Werte gegen die Helle, und konvertieren zurück zu System.Drawing.Color für den Einsatz in Ihrer Anwendung.

Sie können Ihre Farbe in den HSL-Farbraum konvertieren, manipulieren, um sie dort und konvertieren, um Ihren Farbraum der Wahl zurück (wahrscheinlich das ist, RGB)

Hellere Farben einen höheren L-Wert haben, je dunkler, ein niedrigere.

Hier sind die relevanten Sachen und alle Gleichungen:

http://en.wikipedia.org/wiki/HSL_color_space

Eine andere Methode ist, einfach Ihre Farbe mit weißem oder schwarzem interpolieren. Dadurch wird auch die Farbe ein bisschen entsättigt, aber es ist billiger zu berechnen.

Ich habe die ControlPaint.Dark () und .Light () in System.Windows.Forms verwendet.

Ich vermute, Sie RGB mit Byte-Werten verwenden (0 bis 255), wie das ist überall sehr verbreitet.

Für hellere, den Mittelwert der RGB-Werte mit der RGB-Weiß. Oder eine gewisse Kontrolle darüber, wie viel Aufhellung zu haben, sie in einem gewissen Verhältnis mischen. Lassen Sie f von 0,0 bis 1,0 variieren, dann:

Rnew = (1-f)*R + f*255
Gnew = (1-f)*G + f*255
Bnew = (1-f)*B + f*255

Für dunklere, verwenden Sie den RGB von schwarz -., Die alle Nullen sind, macht die Mathematik leichter

I Details auslassen, wie das Ergebnis wieder in Bytes umwandelt, was wahrscheinlich würden Sie tun mögen.

Wenn Sie RGB-Farben verwenden, würde ich diese Farbe Paramater Transformation HSL (Farbton, Sättigung, Helligkeit), die Leichtigkeit Parameter modifiziert und dann in RGB-Transformation zurück. Google um und Sie werden eine Menge Codebeispiele zu finden, wie diese Farbdarstellung Transformationen (RGB zu HSL und umgekehrt) zu tun.

Das ist, was ich schnell gefunden: http://bytes.com/forum/thread250450.html

Angenommen, Sie die Farbe als RGB bekommen, zuerst wandelt es in HSV (Farbton, Sättigung, Wert) Farbraum. Dann erhöhen / verringern Sie den Wert heller / dunkler Farbton der Farbe zu erzeugen. Dann wandelt zurück zu RGB.

Wenn Sie Ihre Farben im RGB-Format (oder vermutlich CMYK), können Sie die ziemlich grobe Methode zur Erhöhung des Werts jeder Komponente der Farbe verwenden. Zum Beispiel in HTML-Farben werden als drei zweistellige Hex-Zahlen dargestellt. # Ff0000 geben Ihnen einen leuchtend rot, die dann durch eine Erhöhung der Werte der G und B componenets um den gleichen Betrag, wie # ff5555 blendet werden (gibt einen helleren rot). Vermutlich für Farbton, Sättigung und Helligkeit (HSL) Farben, können Sie nur die L-Komponente erhöhen, aber ich kann nicht mit Sicherheit sagen; Ich bin weniger vertraut mit diesem Farbraum.

Wie ich allerdings sagen, ist diese Methode ziemlich grob. Aus meinen Erinnerungen an Live Messenger, es klingt wie Sie versuchen, Steigungen zu tun, das ist wirklich ganz einfach in Windows Presentation Foundation angewandt werden kann (WPF, Teil von .NET 3.0). WPF unterstützt viele unterschiedliche Arten von Gradienten-brush, einschließlich linearen und radialen Gradienten.

Ich kann empfehlen Adam Nathans Buch Windows Presentation Foundation Unleashed als eine gute und gründliche Einführung in WPF.

HTH

Jede Farbabweichungen sind besser in HSL / HSV getan.

Ein guter Test ist zwischen zwei äquivalenten Werten in RGB-Raum und HSL Raum zu interpolieren. Die Rampe in HSL Raum sieht aus wie eine natürliche Entwicklung. Im RGB-Raum sieht es in der Regel ziemlich unnatürlich. HSL-Karten zu unserer visuellen Farbraumwahrnehmung viel besser als RGB.

Die Idee, HSV oder einem anderen Farbraum konvertieren scheint gut, und kann für eine präzise Farb Arbeit, aber für normale Zwecke der Fehler bei der Arbeit in RGB möglicherweise nicht ausreichen, um die Materie notwendig sein. Auch kann es ein Schmerz zu behandeln Grenzfälle sein: RGB ist ein quaderförmiger Raum, während HSV nicht. Wenn mit Byte-Werten arbeiten, können Sie viele-zu-eins haben und One-to-many-Zuordnungen zwischen den Räumen. Dies kann oder kann nicht ein Problem auf der Anwendung abhängig sein. YMMV

Die Website stellt fest, dass Sie die verwenden können Control Klasse innerhalb des BCL C # System.Windows.Forms-Namespace.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top