2013-05-03 24 views
11

Bir degradenin ortasında bir renk hesaplamak mümkün mü?Renk hesapla HEX 2 renk ve yüzde/konum

var color1 = 'FF0000'; 
var color2 = '00FF00'; 

// 50% between the two colors, should return '808000' 
var middle = gradient(color1, color2, 0.5); 

Sadece iki tane hex dizim var ve karşılığında bir tane istiyorum.

+0

Basit lineer cebir problem (ve zaten biliyoruz ki cevabı var çünkü örnek renkleriniz için). Şimdiye kadar neleri kodladın? – Pointy

+0

[Programlı Olarak Açıklaştır veya Onaltılı bir altıgen renk (veya rgb renkleri ve karışım renkleri)] 'nin olası bir kopyası (http://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or- rgb-and-mix-colours) –

cevap

29

Bu çalışması gerekir:

Temelde içerir Onluk dönüştürerek yarıyı bularak, onaltılık geri sonuçlarını dönüştürülmesi ve daha sonra onları birleştirerek.

var color1 = 'FF0000'; 
var color2 = '00FF00'; 
var ratio = 0.5; 
var hex = function(x) { 
    x = x.toString(16); 
    return (x.length == 1) ? '0' + x : x; 
}; 

var r = Math.ceil(parseInt(color1.substring(0,2), 16) * ratio + parseInt(color2.substring(0,2), 16) * (1-ratio)); 
var g = Math.ceil(parseInt(color1.substring(2,4), 16) * ratio + parseInt(color2.substring(2,4), 16) * (1-ratio)); 
var b = Math.ceil(parseInt(color1.substring(4,6), 16) * ratio + parseInt(color2.substring(4,6), 16) * (1-ratio)); 

var middle = hex(r) + hex(g) + hex(b); 
+0

üçüncü argümana dikkat edin -> '0,5', yani color1' ve' color2' –

+0

@KalamarObliwy - Ahh, bunu kaçırdı. Cevap düzeltildi. – techfoobar

+1

Peki bu gerçekten yakın, ancak oran 0 ise, renk siyah, renk 1 olmalıdır. Ayrıca, r.toString vb sıfırlar ile pedleri, onlar yapacak? –

4

Yukarıdaki cevap yorum yapamam, bu yüzden buraya yazmak:

Ben JavaScript alt dize yönteminde parametresine endeks döndürülen dizeye dahil olmadığını öğrendim. Bunun anlamı şudur:

var string = "test"; 
//index: 
alert(string.substring(1,3)); 

//will alert es and NOT est 

Düzenleme: Yani bu olmalıdır:

parseInt(color1.substring(0,2), 16); 
parseInt(color1.substring(2,4), 16); 

ve

parseInt(color1.substring(4,6), 16);