2015-12-04 71 views
3

我正在使用Vivagraph JS庫來渲染一些圖。JavaScript將RGB整數轉換爲十六進制

我想改變該節點的顏色這樣

nodeUI.color = 0xFFA500FF;

^這是一個隨機例子。不低於

爲RGB相應的十六進制值,我從服務器RGB值獲得儘可能這樣

rgb = [229,64,51]

數組如何轉換RGB上述文件檔案化管理的十六進制類型值?

由於

+0

'0xFFA500FF'這是什麼值,你如何從'rgb(229,64,51)'得到它,因爲它的'hex'值是'#E54033' – void

+2

如果[this](http:// stackoverflow .com/questions/5623838/rgb-to-hex-and-hex-to-rgb)(< - 一個鏈接)是你所追求的,那麼你真的應該在問這裏之前先用它搜索它。如果沒有,那麼你有什麼嘗試? – Roope

+0

@ Roope - 如果你願意的話,你可以把它標記爲複製品。 – RobG

回答

1

根據這裏在代碼中的註釋:https://github.com/anvaka/VivaGraphJS/blob/master/demos/other/webglCustomNode.html

值0xFFA500FF是一個32位值,該值包括Alpha通道,所以忽略alpha通道它相當於RGB(255,165,0) 。

一些從32位十六進制轉換爲24位rgb和後面的函數如下,這些註釋足以解釋它們是如何工作的。

/* @param {number} v - value to convert to RGB values 
 
** @returns {Array} - three values for equivalent RGB triplet 
 
**      alpha channel is ingored 
 
** 
 
** e.g. from32toRGB(0xaec7e8) // 255,165,0 
 
*/ 
 
function from32toRGB(v) { 
 
    var rgb = ('0000000' + v.toString(16)) // Convert to hex string with leading zeros 
 
      .slice(-8)  // Get last 8 characters 
 
      .match(/../g) // Split into array of character pairs 
 
      .splice(0,3) // Get first three pairs only 
 
      .map(function(v) {return parseInt(v,16)}); // Convert each value to decimal 
 
    return rgb; 
 
} 
 

 
/* @param {Array} rgbArr - array of RGB values 
 
** @returns {string}  - Hex value for equivalent 32 bit color 
 
**       Alpha is always 1 (FF) 
 
** 
 
** e.g. fromRGBto32([255,165,0]) // aec7e8FF 
 
** 
 
** Each value is converted to a 2 digit hex string and concatenated 
 
** to the previous value, with ff (alpha) appended to the end 
 
*/ 
 
function fromRGBto32(rgbArr) { 
 
    return rgbArr.reduce(function(s, v) { 
 
    return s + ('0' + v.toString(16)).slice(-2); 
 
    },'') + 'ff' 
 
} 
 

 
// Tests for from32toRGB 
 
    [0xFFA500FF, 0xaec7e8ff,0,0xffffffff].forEach(function(v) { 
 
    document.write(v.toString(16) + ' : ' + from32toRGB(v) + '<br>') 
 
    }); 
 

 
document.write('<br>'); 
 

 
// Tests for fromRGBto32 
 
    [[255,165,0],[174,199,232], [0,0,0], [255,255,255]].forEach(function(rgbArr) { 
 
    document.write(rgbArr + ' : ' + fromRGBto32(rgbArr) + '<br>'); 
 
    });

注意,在分配:

odeUI.color = 0xFFA500FF 

十六進制值0xFFA500FF被立即轉換成十進制11454440.向fromRGBto32將結果轉換爲一個數字,可以被分配到odeUI.color,使用parseInt:

parseInt(fromRGBto32([229,64,51]), 16); 

或者如果您想要對其進行硬編碼,只需在前面添加'0x'即可。

如果你有一個像「RGB(229,64,51)」,你可以通過獲取的數字,轉換爲十六進制字符串和連接將其轉換爲十六進制值的字符串:

var s = 'rgb = [229,64,51]'; 
 
var hex = s.match(/\d+/g); 
 

 
if (hex) { 
 
    hex = hex.reduce(function(acc, value) { 
 
    return acc + ('0' + (+value).toString(16)).slice(-2); 
 
    }, '#') 
 
} 
 

 
document.write(hex + '<br>'); 
 

 
// Append FF to make 32 bit and convert to decimal 
 
// equivalent to 0xe54033ff 
 
document.write(parseInt(hex.slice(-6) + 'ff', 16)); // 0xe54033ff -> 3846190079