Angenommen, ich habe eine Hintergrundfarbe, über die ein "Band" in einer anderen Volltonfarbe läuft. Jetzt möchte ich, dass das Farbband teilweise transparent ist, damit einige Details durchgehen, aber das Farbband über dem Hintergrund immer noch die "gleiche Farbe" hat.
Gibt es eine Möglichkeit, für eine bestimmte Deckkraft / Alpha <100% der Farbbandfarbe (leicht) zu bestimmen, welche RGB-Werte mit ihrer Farbe mit 100% Deckkraft über dem Hintergrund identisch sein müssen?
Hier ist ein Bild. Hintergrund ist rgb(72, 28, 97)
, Band rgb(45, 34, 70)
. Ich möchte ein rgba(r, g, b, a)
für das Band, damit es mit dieser Volltonfarbe identisch erscheint.
Antworten:
Farbmischung ist nur eine lineare Interpolation pro Kanal, oder? Die Mathematik ist also ziemlich einfach. Wenn Sie RGBA1 über RGB2 haben, ist das effektive visuelle Ergebnis RGB3:
… Wo der Alpha-Kanal zwischen 0,0 und 1,0 liegt.
Sanity Check: Wenn das Alpha 0 ist, ist RGB3 dasselbe wie RGB2? Ja. Wenn das Alpha 1 ist, ist RGB3 dasselbe wie RGB1? Ja.
Wenn Sie nur die Hintergrundfarbe und die endgültige Farbe gesperrt haben, gibt es eine große Anzahl von RGBA-Farben (unendlich, im Gleitkommaraum), die die Anforderungen erfüllen könnten. Sie müssen also entweder die Farbe des Balkens oder die gewünschte Deckkraft auswählen und den Wert des anderen ermitteln.
Auswahl der Farbe basierend auf Alpha
Wenn Sie RGB3 (die endgültige gewünschte Farbe), RGB2 (die Hintergrundfarbe) und A1 (wie viel Deckkraft Sie möchten) kennen und nur nach RGB1 suchen, können wir die Gleichungen folgendermaßen neu anordnen:
Es gibt einige Farbkombinationen, die theoretisch möglich, aber angesichts des Standard-RGBA-Bereichs unmöglich sind. Wenn der Hintergrund beispielsweise rein schwarz ist, die gewünschte wahrgenommene Farbe rein weiß ist und das gewünschte Alpha 1% beträgt, benötigen Sie:
… Ein superhelles Weiß 100 × heller als jedes andere.
Auswahl des Alphas anhand der Farben
Wenn Sie RGB3 (die endgültige gewünschte Farbe), RGB2 (die Hintergrundfarbe) und RGB1 (die Farbe, deren Deckkraft Sie variieren möchten) kennen und Sie nur nach A1 suchen, können wir die neu anordnen Gleichungen also:
Wenn diese unterschiedliche Werte ergeben, können Sie die Übereinstimmung nicht genau festlegen, aber Sie können die Alphas mitteln, um so nah wie möglich zu kommen. Zum Beispiel gibt es keine Deckkraft auf der Welt, mit der Sie Grün über Rot setzen können, um Blau zu erhalten.
quelle
r1
,g1
undb1
auch nicht bekannt?Ich habe ein WENIGER Mixin mit Phrogz 'Antwort gemacht. Sie geben ein:
Hier ist der Code:
Verwendung wie folgt:
Funktioniert offensichtlich nicht für unmögliche Kombinationen (wie von Phrogz erwähnt), was bedeutet, dass nur ein geringes Maß an Transparenz unterstützt wird. Sehen Sie, wie Sie damit umgehen.
quelle
Dank Phrogz 's und ephemer ist toll Antworten, hier ist eine SASS Funktion , dass automatisch die beste äquivalent RGBA Farbe berechnet.
Sie rufen es mit der gewünschten Farbe und dem vorhandenen Hintergrund auf und es berechnet die beste (dh transparenteste) äquivalente RGBA-Farbe, die das gewünschte Ergebnis innerhalb von ± 1/256 jeder RGB-Komponente liefert (aufgrund von Rundungsfehlern):
Ich habe es gerade gegen eine Reihe von Kombinationen getestet (alle Bootswatch-Themen) und es ist ein Vergnügen, sowohl für Dunkel-bei-Licht- als auch für Hell-bei-Dunkel-Ergebnisse.
PS: Wenn Sie eine bessere Genauigkeit als ± 1/256 in der resultierenden Farbe benötigen, müssen Sie wissen, welche Art von Rundungsalgorithmus-Browsern beim Mischen von RGBA-Farben angewendet werden (ich weiß nicht, ob dies standardisiert ist oder nicht), und eine geeignete hinzufügen Bedingung zum Bestehenden
@while
, so dass es weiter zunimmt,$alpha
bis es die gewünschte Präzision erreicht.quelle
transparentify()
: stylus-lang.com/docs/bifs.html#transparentifytop-bottom-alpha ... die ich entdeckt habe, nachdem ich sie manuell auf StylusAus der Antwort von @Phrogz:
So:
So:
Beachten Sie einen beliebigen Wert von auswählen können
a1
, und dies wird die entsprechenden Werte findenr1
,g1
undb1
erforderlich. Wenn Sie beispielsweise ein Alpha von 1 auswählen, benötigen Sie RGB1 = RGB3, aber wenn Sie ein Alpha von 0 auswählen, wird (offensichtlich) keine Lösung gefunden.quelle
Um die Antwort von @ Tobia zu erweitern und die Deckkraft eher wie transparent zu spezifizieren:
quelle