Wie erstelle ich bei einem RGB-Wert einen Farbton (oder Farbton)?

124

168, 0, 255Wie erstelle ich bei einem RGB-Wert Farbtöne (heller machen) und Schattierungen (dunkler machen) der Farbe?

DenaliHardtail
quelle

Antworten:

153

Unter verschiedenen Optionen zum Schattieren und Tönen:

  • Multiplizieren Sie für Farbtöne jede Komponente mit 1/4, 1/2, 3/4 usw. ihres vorherigen Werts. Je kleiner der Faktor, desto dunkler der Farbton.

  • Berechnen Sie für Farbtöne (255 - vorheriger Wert), multiplizieren Sie diesen mit 1/4, 1/2, 3/4 usw. (je größer der Faktor, desto heller der Farbton) und addieren Sie diesen zum vorherigen Wert (jeweils angenommen) .component ist eine 8-Bit-Ganzzahl.

Beachten Sie, dass Farbmanipulationen (wie Farbtöne und andere Schattierungen) in linearem RGB durchgeführt werden sollten . Es ist jedoch unwahrscheinlich, dass RGB-Farben, die in Dokumenten angegeben oder in Bildern und Videos codiert sind, in linearem RGB vorliegen. In diesem Fall muss eine sogenannte inverse Übertragungsfunktion auf jede der Komponenten der RGB-Farbe angewendet werden. Diese Funktion variiert mit dem RGB-Farbraum. Im sRGB-Farbraum (der angenommen werden kann, wenn der RGB-Farbraum unbekannt ist) entspricht diese Funktion beispielsweise in etwa der Erhöhung jeder sRGB-Farbkomponente (von 0 bis 1) auf eine Potenz von 2,2. (Beachten Sie, dass "lineares RGB" kein RGB-Farbraum ist.)

Siehe auch den Kommentar von Violet Giraffe zur "Gammakorrektur".

Peter O.
quelle
20
Ich habe es ausprobiert und es hat super funktioniert. Ich dachte, es wäre hilfreich, Beispiele für die Formeln zu schreiben. Original (r, g, b); Shade (rs, gs, bs): rs = r * 0.25, gs = g * 0.25, bs = b * 0.25(das ist eine ziemlich dunkle Schatten); Tint (RT, GT, bt): rt = r + (0.25 * (255 - r)), gt = g + (0.25 * (255 - g)), bt = b + (0.25 * (255 - b))(das ist eine ziemlich leichte Tönung). Ich habe es als Teil eines coolen Arrays gemacht, das viele Farbtöne erzeugt hat und es hat großartig funktioniert. Hoffentlich hilft das. Danke Peter.
Thomas
1
Du hast einen Fehler gemacht. Es ist umgekehrt.
Francesco Menzani
Sind Sie sicher, dass diese Manipulation keine Gammakorrektur berücksichtigen darf?
Violette Giraffe
1
@VioletGiraffe: Sie machen einen guten Punkt mit Gammakorrektur. Siehe meine Bearbeitung. (Dies ersetzt einen gelöschten Kommentar von mir von vor 22 Stunden.)
Peter O.
97

Einige Definitionen

  • Ein Farbton wird durch "Abdunkeln" eines Farbtons oder "Hinzufügen von Schwarz" erzeugt.
  • Ein Farbton wird durch "Aufhellen" eines Farbtons oder "Hinzufügen von Weiß" erzeugt.

Erstellen eines Farbtons oder eines Farbtons

Abhängig von Ihrem Farbmodell gibt es verschiedene Methoden, um eine dunklere (schattierte) oder hellere (getönte) Farbe zu erstellen:

  • RGB::

    • Schattieren:

      newR = currentR * (1 - shade_factor)
      newG = currentG * (1 - shade_factor)
      newB = currentB * (1 - shade_factor)
      
    • Zum Abtönen:

      newR = currentR + (255 - currentR) * tint_factor
      newG = currentG + (255 - currentG) * tint_factor
      newB = currentB + (255 - currentB) * tint_factor
      
    • Allgemeiner ist die Farbe, die zum Überlagern einer Farbe RGB(currentR,currentG,currentB)mit einer Farbe RGBA(aR,aG,aB,alpha)führt ,:

      newR = currentR + (aR - currentR) * alpha
      newG = currentG + (aG - currentG) * alpha
      newB = currentB + (aB - currentB) * alpha
      

    wo (aR,aG,aB) = black = (0,0,0)zum Schattieren und (aR,aG,aB) = white = (255,255,255)zum Abtönen

  • HSVoder HSB:

    • Zum Schattieren: Senken Sie das Value/ Brightnessoder erhöhen Sie dasSaturation
    • Zum Tönen: Verringern Saturationoder erhöhen Sie das Value/Brightness
  • HSL::
    • Zum Beschatten: Senken Sie die Lightness
    • Zum Tönen: Erhöhen Sie die Lightness

Es gibt Formeln zum Konvertieren von einem Farbmodell in ein anderes. Gemäß Ihrer ersten Frage können Sie, wenn Sie sich in befinden RGBund das HSVModell beispielsweise zum Schattieren verwenden möchten, einfach in konvertieren HSV, die Schattierung durchführen und zurück in konvertieren RGB. Zu konvertierende Formeln sind nicht trivial, können aber im Internet gefunden werden. Abhängig von Ihrer Sprache ist es möglicherweise auch als Kernfunktion verfügbar:

Modelle vergleichen

  • RGB hat den Vorteil, dass es wirklich einfach zu implementieren ist, aber:
    • Sie können Ihre Farbe nur relativ schattieren oder tönen
    • Sie haben keine Ahnung, ob Ihre Farbe bereits getönt oder schattiert ist
  • HSVoder HSBist etwas komplex, weil Sie mit zwei Parametern spielen müssen, um das zu bekommen, was Sie wollen ( Saturation& Value/ Brightness)
  • HSL ist aus meiner Sicht das Beste:
    • unterstützt von CSS3 (für Webapp)
    • einfach und genau:
      • 50% bedeutet einen unveränderten Farbton
      • >50% bedeutet, dass der Farbton heller ist (Farbton)
      • <50% bedeutet, dass der Farbton dunkler ist (Schatten)
    • Mit einer bestimmten Farbe können Sie feststellen, ob sie bereits getönt oder schattiert ist
    • Sie können eine Farbe relativ oder absolut tönen oder schattieren (indem Sie einfach das LightnessTeil austauschen ).

JBE
quelle
1
Ich glaube an hier "Ein Farbton wird durch" Verdunkeln "eines Farbtons erzeugt. Mit Farbton meinen Sie die Farbe. Denn wenn Sie von einem Farbton wie bei HSL / HSV sprechen, führt das Ändern des Farbtons zu einer anderen Farbe, nicht zu einem Farbton. Der Farbton (0-360 °) allein kann nicht dunkler / heller werden. Um einen Farbton zu erhalten, müssten die SL / SV-Werte geändert werden. Diese Definition könnte jemanden irreführen, zu glauben, dass eine Änderung des Farbtons eine dunklere / hellere Farbe erzeugt.
Akinuri
Die Farbversion funktioniert nur für Farbbereiche ab 0. Addieren Sie die Hälfte Ihres Farbbereichs zum Farbkanalwert, rechnen Sie dann nach und subtrahieren Sie diesen Bereich erneut. Wenn Ihre Farbe signiert ist und Sie die Berechnung durchführen können, ohne etwas aufgrund eines Überlaufs zu zerstören, funktioniert dies wie beabsichtigt.
t0b4cc0
3

Ich experimentiere gerade mit Leinwand und Pixeln ... Ich finde, dass diese Logik für mich besser funktioniert.

  1. Verwenden Sie dies, um die Grauheit (Luma?) Zu berechnen.
  2. aber sowohl mit dem vorhandenen Wert als auch mit dem neuen 'Farbton'-Wert
  3. Berechnen Sie die Differenz (ich stellte fest, dass ich nicht multiplizieren musste)
  4. add, um den 'Farbton'-Wert auszugleichen

    var grey =  (r + g + b) / 3;    
    var grey2 = (new_r + new_g + new_b) / 3;
    
    var dr =  grey - grey2 * 1;    
    var dg =  grey - grey2 * 1    
    var db =  grey - grey2 * 1;  
    
    tint_r = new_r + dr;    
    tint_g = new_g + dg;   
    tint_b = new_b _ db;
    

oder etwas ähnliches...

Blair
quelle