在javascript中将3字节RGB转换为2字节

在javascript中将3字节RGB转换为2字节,javascript,html,rgb,Javascript,Html,Rgb,如何在javascript中将3字节RGB转换为2字节RGB 例如,我需要这样做: 我试过这个: function shortPixel(pixel){ var r = pixel.r.toString(2).slice(0,5); var g1 = pixel.g.toString(2).slice(0,3); var g2 = pixel.g.toString(2).slice(3,6); var b = pixel.b.toString(2).slice(

如何在javascript中将3字节RGB转换为2字节RGB

例如,我需要这样做:

我试过这个:

function shortPixel(pixel){
    var r = pixel.r.toString(2).slice(0,5);
    var g1 = pixel.g.toString(2).slice(0,3);
    var g2 = pixel.g.toString(2).slice(3,6);
    var b = pixel.b.toString(2).slice(0,5);
    console.log(r+" "+g1+"|"+g2+" "+b);
    console.log(r+g1);
    console.log(g2+b);
    return{
        b1: r+g1,
        b2: g2+b
    }
}
但当我这么做的时候:

app.shortPixel({r:255,g:0,b:255});
2015-08-26 15:47:32.939 scripts.js:417 11111 0| 11111
2015-08-26 15:47:32.939 scripts.js:418 111110
2015-08-26 15:47:32.940 scripts.js:419 11111
Object {b1: "111110", b2: "11111"}
我在b1最低咬位时损失了00

如何解决这个问题

编辑

@Jaromanda X提供的解决方案

function shortPixel(pixel){
        var padit = function(n) {
            return ('0000000' + n.toString(2)).substr(-8);
        }
        var r = padit(pixel.r).slice(0,5);
        var g1 = padit(pixel.g).slice(0,3);
        var g2 = padit(pixel.g).slice(3,6);
        var b = padit(pixel.b).slice(0,5);           
        return{
            b1: b+g1,
            b2: g2+r
        }
    }
但下一个问题是,如何将转换后的像素保存到8位数组中

        var buffer = new ArrayBuffer(2);
        var data = new DataView(buffer);
        data.setUint8(0,r+g1);
        data.setUint8(1,g2+r);
        console.log(new Uint8Array(buffer))

当我这样做时,我得到了
[0,73]
。如何将字符串“1010101”保存为位?我需要将其转换为数字吗?

您错误地假设toString(2)总是输出8个字符-显然它不会(5..toString(2)仅输出101个字符,例如

而不是

pixel.r.toString(2).slice(0,5);

此(左)将所有值填充到(至少)8个字符,substr(-8)仅获取最后8个字符

或者创建一个函数(示例中为padit)来删除重复

function shortPixel(pixel){
    var padit = function(n) {
        return ('0000000' + n.toString(2)).substr(-8);
    }
    var r = padit(pixel.r).slice(0,5);
    var g1 = padit(pixel.g).slice(0,3);
    var g2 = padit(pixel.g).slice(3,6);
    var b = padit(pixel.b).slice(0,5);
    console.log(r+" "+g1+"|"+g2+" "+b);
    console.log(r+g1);
    console.log(g2+b);

    return{
        b1: r+g1,
        b2: g2+b
    }
}
另一种选择

function shortPixel(pixel){
    var padit = function(n) {
        return ('0000000' + n.toString(2)).substr(-8);
    }
    var r = (pixel.r >> 3) << 3;
    var g1 = pixel.g >> 5;
    var g2 = ((pixel.g >> 2) & 7) << 5;
    var b = pixel.b >> 3;
    return{
        b1: padit(r+g1),
        b2: padit(g2+b)
    }
}

或者在shortPixel的替代版本中,直接使用r+g1和g2+b,因为它们是整数

我使用了您的解决方案,但现在我无法将其保存到8位数组中。如果可以,请检查编辑。
function shortPixel(pixel){
    var padit = function(n) {
        return ('0000000' + n.toString(2)).substr(-8);
    }
    var r = (pixel.r >> 3) << 3;
    var g1 = pixel.g >> 5;
    var g2 = ((pixel.g >> 2) & 7) << 5;
    var b = pixel.b >> 3;
    return{
        b1: padit(r+g1),
        b2: padit(g2+b)
    }
}
data.setUint8(0,parseInt(r+g1, 2));