Sie haben die Dinge ein wenig missverstanden, JavaScript modelliert Farbe nicht als hexadezimal, das System auch nicht. Die hexadezimale Notation gilt nur für das vom Menschen lesbare Dokument. Intern speichert Ihr System drei ganzzahlige Werte. Sie können diese direkt abfragen und bearbeiten.
Angenommen, Sie möchten das eigentliche Dokument anstelle von Systeminternalen bearbeiten. Dann ist es am besten, Ihre Berechnung auf eine Bibliothek zu verschieben, die dies für Sie erledigt. Sie sehen, dass der Browser Farben auf viele Arten darstellen kann, sodass Sie alle Arten von Fällen wie Ad-RGB- und HSV-Eingaben programmieren müssen. Daher schlage ich vor, dass Sie etwas wie Color.js verwenden , das Ihnen viel Kopfschmerzen erspart, da Sie das Mischen, Abdunkeln, Aufhellen usw. nicht selbst implementieren müssen.
Edity:
Falls Sie dies selbst tun möchten, was ich nicht empfehle. Beginnen Sie damit, die Hexarepräsentation in numerische Tripletts von ganzen Zahlen oder Gleitkommazahlen im Bereich von 0 bis 1 umzuwandeln. Dies erleichtert die Berechnung.
Für eine einfache Manipulation der Farbkonvertierung von RGB-Werten in HSL oder HSB sind Helligkeitsberechnungen daher trivial (Wikipedia hat Formulierungen). Addieren oder subtrahieren Sie also einfach Helligkeit oder Helligkeit. Für eine echte Lichtsimulation ist die Berechnung einfach genug, multiplizieren Sie einfach die Lichtfarbe mit der Grundfarbe. Für neutrales Licht ist es einfach:
Ergebnis = Intensität * Farbe
Wie Rafael erklärte, wiederholte sich die Formel nach Farbkanal. Sie können farbiges Licht simulieren, indem Sie dies tun
Ergebnis = Intensität * LigtColor * Farbe
Damit dies am besten zuerst in Float konvertiert werden kann, möglicherweise auch linear. Dies ermöglicht warmes oder kaltes Licht in Ihrer Umgebung, das ein natürlicheres Gefühl hervorrufen kann.
Alpha-Blending (Farbschicht übereinander) ist einfach
Ergebnis = ColorTop * alpha + ColorBottom * (1-alpha)
Endgültige Bearbeitung
Schließlich ist hier ein Code, der etwas für das tut, was Sie fragen. Der Grund, warum dies schwer zu erkennen ist, ist, dass es momentan eine Art abstrakte Form hat. Live-Code hier verfügbar
Bild 1 : Ergebnis des Codes unten siehe auch Live-Version .
{
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
var Color = function(r, g, b) {
this.r = r;
this.g = g;
this.b = b;
}
Color.prototype.asHex = function() {
return "#" + ((1 << 24) + (this.r << 16) + (this.g << 8) + this.b).toString(16).slice(1);
}
Color.prototype.asRGB = function() {
return 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';
}
Color.prototype.blendWith = function(col, a) {
r = Math.round(col.r * (1 - a) + this.r * a);
g = Math.round(col.g * (1 - a) + this.g * a);
b = Math.round(col.b * (1 - a) + this.b * a);
return new Color(r, g, b);
}
Color.prototype.Mul = function(col, a) {
r = Math.round(col.r/255 * this.r * a);
g = Math.round(col.g/255 * this.g * a);
b = Math.round(col.b/255 * this.b * a);
return new Color(r, g, b);
}
Color.prototype.fromHex = function(hex) {
// http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
hex = hex.substring(1,7)
var bigint = parseInt(hex, 16);
this.r = (bigint >> 16) & 255;
this.g = (bigint >> 8) & 255;
this.b = bigint & 255;
}
ctx.font = "16px Arial";
ctx.fillText("Manual Alpha Blend", 18, 20);
var a = new Color(220, 0, 150);
var b = new Color();
b.fromHex('#00C864');
//Alpha blend
ctx.fillStyle = a.asHex();
ctx.fillRect(25, 25, 100, 100);
ctx.fillStyle = '#FFFFFF';
ctx.fillText(a.asHex(), 30, 45);
ctx.fillStyle = b.asRGB()
ctx.fillRect(50, 50, 100, 100);
ctx.fillStyle = '#FFFFFF';
ctx.fillText(a.asHex(), 55, 145);
var bl = a.blendWith(b, 0.3);
ctx.fillStyle = bl.asRGB();
ctx.fillRect(50, 50, 75, 75);
ctx.fillStyle = '#FFFFFF';
ctx.fillText(bl.asHex(), 55, 70);
// lighten 1
ctx.fillStyle = '#000000';
ctx.fillText('Neutral Light', 200, 20);
var c = new Color(100, 100, 100);
var purelight= new Color(255, 255, 255);
ctx.fillStyle = c.asRGB();
ctx.fillRect(200, 25, 100, 100);
var bl = c.Mul(purelight,1.2);
ctx.fillStyle = bl.asRGB();
ctx.fillRect(225, 50, 100, 100);
var bl = c.Mul(purelight, 0.8);
ctx.fillStyle = bl.asRGB();
ctx.fillRect(250, 75, 100, 100);
// lighten 2
ctx.fillStyle = '#000000';
ctx.fillText('Yellowish Light', 400, 20);
var c = new Color(100, 100, 100);
var yellowlight= new Color(255, 255, 220);
var bl = c.Mul(yellowlight,1.0);
ctx.fillStyle = bl.asRGB();
ctx.fillRect(400, 25, 100, 100);
var bl = c.Mul(yellowlight,1.2);
ctx.fillStyle = bl.asRGB();
ctx.fillRect(425, 50, 100, 100);
var bl = c.Mul(yellowlight, 0.8);
ctx.fillStyle = bl.asRGB();
ctx.fillRect(450, 75, 100, 100);
}
}
PS Sie sollten nach Stackoverflow fragen, da das meiste davon tatsächlich bereits in Stackoverfow zu finden ist.