Vous avez un peu mal compris, javaScript ne modélise pas la couleur en hexadécimal, pas plus que le système. La notation hexadécimale est juste pour le document lisible par l'homme. En interne, votre système stocke trois valeurs entières. Vous pouvez les interroger et les manipuler directement.
Mais disons simplement que vous voulez manipuler le document réel au lieu des internes du système. Ensuite, il est préférable de reporter votre calcul à une bibliothèque qui le fait pour vous. Vous voyez que le navigateur peut représenter les couleurs de plusieurs façons, vous devrez donc programmer toutes sortes de cas, comme les entrées ad rgb et hsv. Je vous suggère donc d'utiliser quelque chose comme Color.js, cela vous évite beaucoup de maux de tête, car vous n'avez pas besoin d'implémenter vous-même le mélange, l'assombrissement, l'éclaircissement, etc.
Edity:
Au cas où vous voudriez le faire vous-même, ce que je ne recommande pas. Commencez par transformer la représentation hexadécimale en triplets numériques d'entiers ou de nombres à virgule flottante dans la plage 0-1, ce qui facilite le calcul.
Maintenant, pour une manipulation facile des valeurs RVB de conversion de couleur en HSL ou HSB, cela rend les calculs de luminosité triviaux à faire (Wikipedia a des formulations). Il suffit donc d'ajouter ou de soustraire la luminosité ou la luminosité. Pour une simulation de lumière réelle, le calcul est assez facile, il suffit de multiplier la couleur de la lumière par la couleur de base. Ainsi, pour la lumière neutre, c'est simplement:
Résultat = intensité * couleur
Comme Rafael l'a expliqué, formule répétée par canal de couleur. Vous pouvez simuler la lumière colorée en faisant
Résultat = Intensité * LigtColor * Couleur
Pour que ce meilleur convertisse d'abord, il peut être linéaire également. Cela permet une lumière chaude ou froide sur votre zone, ce qui peut apporter une sensation plus naturelle.
Le mélange alpha (superposition de couleurs sur les autres) est tout simplement
Résultat = ColorTop * alpha + ColorBottom * (1-alpha)
Édition finale
Enfin, voici un code qui fait quelque chose par rapport à ce que vous demandez. La raison pour laquelle cela est difficile à comprendre est que son type d'abrégé sous forme en ce moment. Code en direct disponible ici
Image 1 : Résultat du code ci-dessous voir aussi la version live .
{
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, vous devriez demander sur stackoverflow car la plupart de cela peut en fait déjà être trouvé sur stackoverfow.