Bazı şeyleri biraz yanlış anladınız, javaScript rengi onaltılık olarak modellemiyor, sistem de yok. Onaltılı gösterim yalnızca okunabilir belge içindir. Dahili olarak sisteminiz üç tamsayı değer depolar. Bunları doğrudan sorgulayabilir ve değiştirebilirsiniz.
Ancak diyelim ki sistem içi yerine gerçek belgeyi değiştirmek istiyorsunuz. Ardından, hesaplamanızı bunu sizin için yapan bir kütüphaneye ertelemek en iyisidir. Tarayıcının renkleri birçok şekilde temsil edebildiğini görüyorsunuz, bu nedenle reklam rgb ve hsv girişleri gibi her türlü durumu programlamanız gerekir. Bu nedenle, Color.js gibi bir şey kullanmanızı öneririm , size çok fazla baş ağrısı kazandırır, çünkü karıştırma, karartma, aydınlatma vb.
Edity:
Bunu kendiniz yapmak istiyorsanız, ben tavsiye etmiyorum. Onaltılık gösterimi, 0-1 aralığında tamsayıların veya kayan nokta sayılarının sayısal üçlülerine dönüştürerek başlayın, bu hesaplamayı kolaylaştırır.
Artık rengin kolayca manipüle edilmesi için RGB değerlerini HSL veya HSB'ye dönüştürmek, parlaklık hesaplamalarını önemsiz hale getirir (Wikipedia'nın formülasyonları vardır). Bu yüzden sadece hafiflik veya parlaklık ekleyin veya çıkarın. Gerçek ışık simülasyonu için hesaplama yeterince kolaydır, sadece açık rengi temel renkle çarpın. Böylece nötr ışık için basitçe:
Sonuç = Yoğunluk * Renk
Rafael'in açıkladığı gibi, formül renk kanalı tarafından tekrarlandı. Yaparak renkli ışığı simüle edebilirsiniz
Sonuç = Yoğunluk * LigtColor * Renk
Bu ilk önce float dönüştürmek için, belki de doğrusal. Bu, bölgenizde daha doğal bir his getirebilecek sıcak veya soğuk ışığa izin verir.
Alfa harmanlama (üst üste renk katmanı)
Sonuç = ColorTop * alfa + ColorBottom * (1-alfa)
Son Düzenleme
Son olarak, sorduğunuza doğru bir şeyler yapan bir kod. Bunun görülmesinin zor olmasının nedeni, şu andaki soyut biçimidir. Canlı kod burada bulunabilir
Resim 1 : Aşağıdaki kod sonucu ayrıca canlı sürüme de bakınız .
{
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, aslında çoğu zaten stackoverfow üzerinde bulunabilir, çünkü stackoverflow sormalısınız.