2012-10-14 30 views
1

我有各種十六進制RRGGBBAA顏色作爲熱圖貼圖漸變中的停止值,但我注意到爲某些停止設置不同的Alpha值並不會改變我的代碼中不透明,我總是得到相同的視圖 - 儘管將最後兩個alpha位設置爲00,因爲某些原因,0.0不透明度可以工作。的RRGGBBAA值被寫入這樣的:以十六進制方式更改不透明度不起作用-heat map stop gradient-

0xaa00007f(最後兩個比特,7F應爲0.5的不透明度)

0xaa0000ff(ff爲1.0的不透明度)

的setGradientStops函數,它的停止值是像這樣的 - 這是從熱圖庫,不是我的代碼 -

setGradientStops: function(stops) { 


var ctx = document.createElement('canvas').getContext('2d'); 
var grd = ctx.createLinearGradient(0, 0, 256, 0); 

for (var i in stops) { 
    grd.addColorStop(i, 'rgba(' + 
    ((stops[i] >> 24) & 0xFF) + ',' + 
    ((stops[i] >> 16) & 0xFF) + ',' + 
    ((stops[i] >> 8) & 0x7F) + ',' + 
    ((stops[i] >> 0) & 0x7F) + ')'); 
} 

ctx.fillStyle = grd; 
ctx.fillRect(0, 0, 256, 1); 
this.gradient = ctx.getImageData(0, 0, 256, 1).data; 
} 

回答

1

的問題是,不透明度預計0的範圍內的值 - 1,有你在輸出範圍爲0的值 - 127.我想嘗試...

grd.addColorStop(i, 'rgba(' + 
((stops[i] >> 24) & 0xFF) + ',' + 
((stops[i] >> 16) & 0xFF) + ',' + 
((stops[i] >> 8) & 0xFF) + ',' + 
(((stops[i] >> 0) & 0xFF)/255) + ')'); 

,所以要花位來自代表利用0​​位操作上0xFF的,而不是0x7F的阿爾法(所有的人,而不是幾乎所有的人)的一部分。所以......

0xFF (11111111) & 0xFF (11111111) = 0xFF (11111111) = 255 

不是...

0xFF (11111111) & 0x7F (01111111) = 0x7F (01111111) = 127 

,然後你必須在0範圍的值 - 255,由255分得到這個要求的範圍。

0xFF/255 = 1, 0x7F/255 = 0.498, 0x00/255 = 0 

因此然後0xaa00007fgrd.addColorStop將給予串'rgba(170,0,0,0.498)'