颜色 - 将rgb转换为字节数组

时间:2017-12-28 12:41:03

标签: javascript node.js

我想将颜色代码从rgb(示例输入为255,255,255)转换为类似[ 0xFF, 0xFF, 0xFF ]的字节数组。

我该怎么做呢?

我的第一次尝试是,拆分RGB-Sections并将其解析为HEX Color并将其转换为整数:

this.addColor = function addColor(buffer, color) {
    var parts = color.split(',');
    var red = parts[0].toString(16);
    var green = parts[1].toString(16);
    var blue = parts[2].toString(16);

    buffer.writeByte(parseInt("0x" + (red.length == 1 ? "0" + red : red, 16)));
    buffer.writeByte(parseInt("0x" + (green.length == 1 ? "0" + green : green, 16)));
    buffer.writeByte(parseInt("0x" + (blue.length == 1 ? "0" + blue : blue, 16)));
};

原始如下,但我想动态制作:

buffer.writeByte('f'); // These Char says "its a foreground color"
buffer.writeByte(0xFF); // Red
buffer.writeByte(0xFF); // Green
buffer.writeByte(0xFF); // Black

结果将输出为fÿÿÿ

3 个答案:

答案 0 :(得分:0)

由于buffer.writeByte()期望字节值为整数值,因此您只需将字符串中的值解析为假设十进制格式的整数。十六进制在此处不起作用,直到您希望稍后使用十六进制格式将字节值表示为字符串。

this.addColor = function addColor(buffer, color) 
{
    var parts = color.split(',');

    for (var i=0; i<parts.length; i++) 
    {
      var itemAsString = parts[i];
      buffer.writeByte(parseInt(itemAsString, 10));
    }
};

提供更详细的解释。您的原始代码

buffer.writeByte('f'); // These Char says "its a foreground color"
buffer.writeByte(0xFF); // Red
buffer.writeByte(0xFF); // Green
buffer.writeByte(0xFF); // Black

也可以写成

buffer.writeByte('f'); // These Char says "its a foreground color"
buffer.writeByte(255); // Red
buffer.writeByte(255); // Green
buffer.writeByte(255); // Black

这在语义上是相同的。因此,您不需要在任何地方使用十六进制,只需将字符串解析为整数即可。

更强大的版本,处理多于或少于三个传递的参数。

this.addColor = function addColor(buffer, color) 
{
    var parts = color.split(',');

    var maxBytes = Math.min(parts.length, 3);    
    for (var i=0; i < maxBytes; i++) 
    {
      var itemAsString = parts[i];
      buffer.writeByte(parseInt(itemAsString, 10));
    }

    // Write 0 bytes for missing parts
    for (var i=parts.length; i < 3; i++) 
    {
      buffer.writeByte(0);
    }

};

答案 1 :(得分:0)

不确定您在buffer中撰写的内容,但如果您只想将decimal array转换为hex string array

您可以尝试:

arr.map(n=>'0x' + n.toString(16))

现在,巡回数组可以来自字符串"255,255,255",可以将其按,分割,也可以根据需要进行分类。如果要从字符串中拆分,则需要先解析。 (parseInt(n).toString(16))休息你需要根据需要实施。

示例代码:

var arr = [255, 230, 255];

var hexArr = arr.map(n=>'0x' + n.toString(16));

console.log(hexArr);

答案 2 :(得分:-1)

这个问题非常令人困惑。您需要在要解决问题的步骤中更具体。在第一段中,你说你希望最终解决方案是一个字节数组,但是在第二段你说你想要RGB到HEX但是想要整数?

你发布的输出是:fÿÿÿ。嗯,要获得此输出,然后您不希望从RGB转换为HEX到整数而不是您想要RGB到HEX到ASCII(FF =ÿ)。

你可以这样做(它有效,我已经在jsfiddle上测试过):

var parts = color.split(',');
var red = parts[0];
var green = parts[1];
var blue = parts[2];

// converts from integer to hex

var red = "0x"+ tohex(red);
var green = "0x" + tohex(green);
var blue = "0x" + tohex(blue);

// converts form hex to ascii

red = String.fromCharCode(red);
green = String.fromCharCode(green);
blue = String.fromCharCode(blue);                                   
var output= red+green+blue;

// if the input (in this case you name it color) is: 255,255,255 you will get as output: ÿÿÿ

function tohex(rgb) {               
  if (rgb == 0) return "00"; // if the input is "0"
    rgb = rgb.length < 2 ? "0" + rgb : rgb // RGB format validation
    return rgb.toString(16);
} 

这样简化:

var parts = color.split(',');
var red = parts[0];
var green = parts[1];
var blue = parts[2];

var red = String.fromCharCode("0x"+ tohex(red));
var green = String.fromCharCode("0x" + tohex(green));
var blue = String.fromCharCode ("0x" + tohex(blue));
var output= red+green+blue;

// if the input (in this case you name it color) is: 255,255,255 you will get as output: ÿÿÿ

function tohex(rgb) {               
  if (rgb == 0) return "00"; // if the input is "0"
    rgb = rgb.length < 2 ? "0" + rgb : rgb // RGB format validation
    return rgb.toString(16);
} 

希望它有所帮助!