Hier ist eine Funktion, an der ich gearbeitet habe, um eine Hex-Farbe programmgesteuert um einen bestimmten Betrag aufzuhellen oder abzudunkeln. Geben Sie einfach eine Zeichenfolge wie "3F6D2A"
für die Farbe ( col
) und eine Base10-Ganzzahl ( amt
) ein, damit der Betrag aufgehellt oder abgedunkelt wird. Geben Sie zum Abdunkeln eine negative Zahl ein (dh -20
).
Der Grund für mich, dies zu tun, war, dass all die Lösungen, die ich bisher gefunden habe, das Problem zu komplizieren schienen. Und ich hatte das Gefühl, dass dies mit nur ein paar Codezeilen möglich ist. Bitte lassen Sie mich wissen, wenn Sie Probleme finden oder Anpassungen vornehmen müssen, die dies beschleunigen würden.
function LightenDarkenColor(col, amt) {
col = parseInt(col, 16);
return (((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}
// TEST
console.log( LightenDarkenColor("3F6D2A",40) );
Für die Entwicklung ist hier eine leichter zu lesende Version:
function LightenDarkenColor(col, amt) {
var num = parseInt(col, 16);
var r = (num >> 16) + amt;
var b = ((num >> 8) & 0x00FF) + amt;
var g = (num & 0x0000FF) + amt;
var newColor = g | (b << 8) | (r << 16);
return newColor.toString(16);
}
// TEST
console.log(LightenDarkenColor("3F6D2A", -40));
Und schließlich eine Version für Farben, die am Anfang möglicherweise das "#" haben (oder auch nicht). Plus Anpassung für falsche Farbwerte:
function LightenDarkenColor(col,amt) {
var usePound = false;
if ( col[0] == "#" ) {
col = col.slice(1);
usePound = true;
}
var num = parseInt(col,16);
var r = (num >> 16) + amt;
if ( r > 255 ) r = 255;
else if (r < 0) r = 0;
var b = ((num >> 8) & 0x00FF) + amt;
if ( b > 255 ) b = 255;
else if (b < 0) b = 0;
var g = (num & 0x0000FF) + amt;
if ( g > 255 ) g = 255;
else if ( g < 0 ) g = 0;
return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}
OK, jetzt sind es nicht nur ein paar Zeilen, sondern es scheint viel einfacher zu sein. Wenn Sie das "#" nicht verwenden und nicht nach Farben außerhalb des Bereichs suchen müssen, sind es nur ein paar Zeilen.
Wenn Sie das "#" nicht verwenden, können Sie es einfach in folgenden Code einfügen:
var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);
Ich denke meine Hauptfrage ist, bin ich hier richtig? Umfasst dies nicht einige (normale) Situationen?
quelle
Antworten:
Nun, diese Antwort ist zu einem eigenen Tier geworden. Viele neue Versionen, es wurde lange dumm. Vielen Dank an alle, die zu dieser Antwort beigetragen haben. Aber um es für die Massen einfach zu halten. Ich habe alle Versionen / den Verlauf der Entwicklung dieser Antwort in meinem Github archiviert . Und hier auf StackOverflow mit der neuesten Version von vorne angefangen. Ein besonderer Dank geht an Mike 'Pomax' Kamermans für diese Version. Er gab mir die neue Mathematik.
Diese Funktion (
pSBC
) nimmt eine HEX- oder RGB-Webfarbe an.pSBC
kann es dunkler oder heller schattieren oder mit einer zweiten Farbe mischen und es auch direkt durchlaufen lassen, aber von Hex zu RGB (Hex2RGB) oder RGB zu Hex (RGB2Hex) konvertieren. Alles ohne dass Sie wissen, welches Farbformat Sie verwenden.Dies läuft sehr schnell, wahrscheinlich am schnellsten, insbesondere angesichts der vielen Funktionen. Es war eine lange Zeit in der Herstellung. Sehen Sie die ganze Geschichte auf meinem Github . Wenn Sie den absolut kleinsten und schnellsten Weg zum Schattieren oder Mischen suchen, lesen Sie die unten stehenden Mikrofunktionen und verwenden Sie einen der 2-Liner-Geschwindigkeitsdämonen. Sie eignen sich hervorragend für intensive Animationen, aber diese Version hier ist für die meisten Animationen schnell genug.
Diese Funktion verwendet Log Blending oder Linear Blending. Es wird jedoch NICHT in HSL konvertiert, um eine Farbe richtig aufzuhellen oder abzudunkeln. Daher unterscheiden sich die Ergebnisse dieser Funktion von den viel größeren und viel langsameren Funktionen, die HSL verwenden.
Eigenschaften:
"#AA6622"
oder"#bb551144"
."rgb(123,45,76)"
oder"rgba(45,15,74,0.45)"
."#C41"
wird"#CC4411"
.c0
(von) Farbe oder diec1
(bis) Farbe einen Alpha-Kanal hat, hat die zurückgegebene Farbe einen Alpha-Kanal. Wenn beide Farben einen Alphakanal haben, ist die zurückgegebene Farbe eine lineare Mischung der beiden Alphakanäle unter Verwendung des angegebenen Prozentsatzes (als wäre es ein normaler Farbkanal). Wenn nur eine der beiden Farben einen Alphakanal hat, wird dieses Alpha nur an die zurückgegebene Farbe weitergeleitet. Dies ermöglicht das Mischen / Schattieren einer transparenten Farbe unter Beibehaltung des Transparenzniveaus. Wenn die Transparenzstufen ebenfalls gemischt werden sollen, stellen Sie sicher, dass beide Farben Alphas enthalten. Beim Schattieren wird der Alphakanal gerade durchlaufen. Wenn Sie eine grundlegende Schattierung wünschen, die auch den Alphakanal schattiert, verwenden Siergb(0,0,0,1)
oderrgb(255,255,255,1)
als Ihrec1
(zu) Farbe (oder deren Hex-Äquivalente). Bei RGB-Farben wird der Alphakanal der zurückgegebenen Farbe auf 3 Dezimalstellen gerundet.c0
(von) Farbe; Die zurückgegebene Farbe hat immer das Farbformat derc1
(zu) Farbe, falls vorhanden. Wenn es keinec1
(zu) Farbe gibt, geben Sie sie'c'
alsc1
Farbe ein und sie schattiert und konvertiert diec0
Farbe. Wenn nur eine Konvertierung gewünscht wird, geben Sie diese auch0
als Prozentsatz (p
) ein. Wenn diec1
Farbe weggelassen oder ein Nicht übergebenstring
wird, wird sie nicht konvertiert.pSBCr
kann eine Hex- oder RGB-Farbe übergeben werden und es wird ein Objekt zurückgegeben, das diese Farbinformationen enthält. Es hat die Form: {r: XXX, g: XXX, b: XXX, a: X.XXX}. Wo.r
,.g
und.b
hat Bereich von 0 bis 255. Und wenn es keine Alpha ist:.a
-1. Ansonsten:.a
hat einen Bereich von 0,000 bis 1.000.rgba()
über ,rgb()
wenn eine Farbe mit einem Alphakanal zu übergeben wurdec0
(von) und / oderc1
(to).null
. Ein Beispiel:pSBC(0.5,"salt") == null
Wo, wie es denkt,#salt
eine gültige Farbe ist. Löschen Sie die vier Zeilen, die mit endenreturn null;
, um diese Funktion zu entfernen und sie schneller und kleiner zu machen.true
fürl
(den 4. Parameter), um die lineare Überblendung zu verwenden.Code:
Verwendungszweck:
Das folgende Bild zeigt den Unterschied zwischen den beiden Mischmethoden:
Mikrofunktionen
Wenn Sie wirklich Geschwindigkeit und Größe wollen, müssen Sie RGB und nicht HEX verwenden. RGB ist unkomplizierter und einfacher, HEX schreibt zu langsam und ist in zu vielen Varianten für einen einfachen Zweiliner erhältlich (dh es kann sich um einen 3-, 4-, 6- oder 8-stelligen HEX-Code handeln). Sie müssen auch einige Funktionen opfern, keine Fehlerprüfung, kein HEX2RGB oder RGB2HEX. Außerdem müssen Sie eine bestimmte Funktion (basierend auf dem Funktionsnamen unten) für die Farbüberblendungsmathematik auswählen und wenn Sie Schattierungen oder Überblendungen wünschen. Diese Funktionen unterstützen Alphakanäle. Und wenn beide Eingabefarben Alphas haben, werden sie linear gemischt. Wenn nur eine der beiden Farben ein Alpha hat, wird es direkt an die resultierende Farbe weitergegeben. Im Folgenden sind zwei Liner-Funktionen aufgeführt, die unglaublich schnell und klein sind:
Willst du mehr Infos? Lesen Sie den vollständigen Artikel über Github .
PT
(Ps Wenn jemand die Mathematik für eine andere Mischmethode hat, teile sie bitte mit.)
quelle
tinycolor.darken(color,amount);
function shadeColor2($color, $percent) { $color = str_replace("#", "", $color); $t=$percent<0?0:255; $p=$percent<0?$percent*-1:$percent; $RGB = str_split($color, 2); $R=hexdec($RGB[0]); $G=hexdec($RGB[1]); $B=hexdec($RGB[2]); return '#'.substr(dechex(0x1000000+(round(($t-$R)*$p)+$R)*0x10000+(round(($t-$G)*$p)+$G)*0x100+(round(($t-$B)*$p)+$B)),1); }
8
, fügen10%
Sie hinzu, Sie erhalten,8.8
welche Runden zu9
. Dann9.09%
wegnehmen9
und du bekommst8.1819
. Welche Runden dazu führen8
, ist ein schlechtes Beispiel. Aber es zeigt immer noch , dass Sie nehmen9.09%
von9
und nicht8.8
. Es könnte also einige Zahlen geben, die nicht genau so abrunden wie mein Beispiel hier.Ich habe eine Lösung gefunden, die für mich sehr gut funktioniert:
Beispiel Aufhellen:
Beispiel Verdunkeln:
quelle
R = ((R<255)?R:255).toString(16);
dannR = R.length==1 ? "0"+R : R
für Geschwindigkeit tun . Und ich bin mir nicht sicher, wozu der toUpperCase gut ist?var R = parseInt(color.substring(1, 3), 16) var G = parseInt(color.substring(3, 5), 16) var B = parseInt(color.substring(5, 7), 16) if (R == 0) R = 32; if (G == 0) G = 32; if (B == 0) B = 32;
Hier ist ein supereinfacher Einzeiler, der auf Erics Antwort basiert
Beispiele:
quelle
Dies ist, was ich basierend auf Ihrer Funktion verwendet habe. Ich bevorzuge Schritte über dem Prozentsatz, weil es für mich intuitiver ist.
Beispielsweise unterscheiden sich 20% eines 200-Blau-Werts stark von 20% eines 40-Blau-Werts.
Wie auch immer, hier ist meine Modifikation, danke für deine ursprüngliche Funktion.
quelle
Ich habe Ihre Funktion ausprobiert und es gab einen kleinen Fehler: Wenn ein endgültiger 'r'-Wert nur eine Ziffer ist, wird das Ergebnis wie folgt angezeigt:' a0a0a ', wenn der richtige Wert beispielsweise' 0a0a0a 'ist. Ich habe es nur schnell behoben, indem ich dies anstelle Ihrer Rückgabe hinzugefügt habe:
Vielleicht ist es nicht so schön, aber es macht die Arbeit. Tolle Funktion, übrigens. Genau das, was ich brauchte. :) :)
quelle
Haben Sie über eine rgb> hsl-Konvertierung nachgedacht? dann einfach die Leuchtkraft auf und ab bewegen? das ist der Weg, den ich gehen würde.
Ein kurzer Blick auf einige Algorithmen brachte mir die folgenden Seiten.
PHP: http://serennu.com/colour/rgbtohsl.php
Javascript: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascriptBEARBEITEN Der obige Link ist nicht mehr gültig. Sie können für die git Hub anzuzeigen Seite Quelle oder der Kern
Alternativ könnte eine andere StackOverflow- Frage ein guter Ort sein, um nachzuschauen.
Obwohl dies nicht die richtige Wahl für das OP ist, ist das Folgende eine Annäherung an den Code, den ich ursprünglich vorgeschlagen hatte. (Angenommen, Sie haben RGB / HSL-Konvertierungsfunktionen)
Dies setzt voraus:
hslToRgb
undrgbToHsl
.colorValue
ist eine Zeichenfolge in der Form #RRGGBBWenn es um CSS geht, gibt es eine Syntax für die Angabe von hsl / hsla für IE9 / Chrome / Firefox.
quelle
C # -Version ... Beachten Sie, dass ich Farbzeichenfolgen in diesem Format # FF12AE34 erhalte und die #FF ausschneiden muss.
quelle
int
und zweivars
für denselben Datentyp.Ich wollte eine Farbe auf eine bestimmte Helligkeitsstufe ändern - egal welche Helligkeit die Farbe vorher hatte - hier ist eine einfache JS-Funktion, die gut zu funktionieren scheint, obwohl ich sicher bin, dass sie kürzer sein könnte
quelle
p
hat Reichweite0-100
? Ich weiß nicht einmal, wie man die Helligkeit in RGB richtig definiert, das ist eine HSL-Sache. Ist zum Beispiel#FF00FF
heller als#FF0000
? Wenn ja, würde dies bedeuten, dass Magenta doppelt so hell wie Rot ist. Daher wird der reine Rottest verwendet. Pass in reinem Rot#FF0000
, eingestellt auf 50% Helligkeit, und hier bekommen wir#FF4040
, ist das richtig? Ich würde raten, Rot 50% Helligkeit zu machen, wir würden dunkler werden, da es bereits vollständig hell ist. Wie in#800000
oder 150% Helligkeit#FF8080
. Ist Rosa ein helleres Rot? oder ist rot schon ganz hell?L
Kanal buchstäblich hell. Mein [persönliches mentales] Problem hier ist, dass es für mich#FF0000
völlig hell ist. Und#FF4040
ist heller, aber nicht heller ... für mich bedeutet heller näher an Weiß, wie Pink ist. Und Helligkeit ist, wie viel es hat, und es ist voll rot, so rot, ist voll hell. Daher#FF0000
kann nicht heller gemacht werden .. aber eher .. leichter ... vielleicht bin ich nur ein Freak, lol !! Ich kenne die Farbtheorie wirklich nicht, sooo, ich spreche wirklich nur meine ...Mit der folgenden Methode können Sie den Belichtungswert einer hexadezimalen (Hex) Farbzeichenfolge aufhellen oder abdunkeln:
Übergeben Sie für den letzten Parameterwert in GetHexFromRGB () einen doppelten Wert zwischen -1 und 1 (-1 ist schwarz, 0 ist unverändert, 1 ist weiß):
quelle
Wie einfach Schattenfarbe in PHP?
quelle
Ich habe einen Port der exzellenten xcolor-Bibliothek erstellt, um die jQuery-Abhängigkeit zu entfernen. Es gibt eine Menge Funktionen, darunter das Aufhellen und Abdunkeln von Farben.
Die Konvertierung von Hex in RGB ist eine völlig andere Funktion als das Aufhellen oder Abdunkeln von Farben. Halten Sie die Dinge bitte trocken. Sobald Sie eine RGB-Farbe haben, können Sie in jedem Fall einfach die Differenz zwischen der gewünschten Lichtstärke und der Lichtstärke zu jedem der RGB-Werte hinzufügen:
Weitere Informationen zur Quelle finden Sie unter https://github.com/fresheneesz/xolor .
quelle
Ich wollte schon lange Farbtöne erzeugen können. Hier ist meine JavaScript-Lösung:
quelle
#
Hex-Farben zu akzeptieren . Entschuldigung, wenn es so aussah ... "Zustimmung" ... Ich sah es als Peer Review. Wenn Sie nicht möchten, dass jemand Ihren Code analysiert oder Feedback gibt, entschuldige ich mich.Ihr Ansatz ist in Ordnung :) Ich vereinfache Ihre kürzeste Version ein wenig (zur Sättigungskontrolle siehe hier )
Code-Snippet anzeigen
Und Version mit # und Farbbereichsprüfung
Code-Snippet anzeigen
quelle
Ich habe auch ein einfaches Paket gemacht. Ich habe die Konvexität von IR ^ 3 verwendet, natürlich sind die RGB-Werte in IN ^ 3, was nicht konvex ist, also ist dies nicht wirklich perfekt
Zum Abdunkeln habe ich folgendes verwendet
Und zu erleichtern
Hier ist das Paket https://github.com/MarchWorks/colortone
Demo https://colortone.now.sh/
Mit der Art und Weise, wie ich Dinge tue, wenn Sie ein Verhältnis von -1 übergeben, erhalten Sie Schwarz, Weiß, wenn das Verhältnis 1 ist. Wenn Sie 0 als Verhältnis übergeben, ändert sich die Farbe nicht
quelle
Ich brauchte es in C #, es kann .net-Entwicklern helfen
quelle