JavaScript优化版本的ARGB到RGBA数组转换

问题描述 投票:0回答:1

[我想将包含ARGB图像的Uint8Array个字节转换为它的RGBA表示形式,但是例如,我想使用比字节移位更优化的东西。

我现在要做的就是交换字节顺序,即:

let input = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 ];
let expected = [0x22, 0x33, 0x44, 0x11, 0x88, 0x55, 0x66, 0x77 ];

所以简单的情况是:

function argbToRgba(src) {
    let dest = new Uint8Array(src.length)

    for (let i = 0; i < buffer.length; i += 4) {
        let a = src[i]
        let r = src[i + 1]
        let g = src[i + 2]
        let b = src[i + 3]

        dest[i] = r;
        dest[i + 1] = g;
        dest[i + 2] = b;
        dest[i + 3] = a;
    }

    return dest;
}

但是,理想情况下,我想使用字节移位来构建RGBA值(这是微不足道的部分),但是然后我的问题是如何将这样的uint32数字放入dest(必须为Uint8Array,理想情况下,即使是与src相同,也可以进行就地更改)。

[我的意思是,一旦在C中定义了uint32_t rgbaColor,就可以memwrite或将int分配给数组索引,剩下的工作将由溢出完成。但是如何在JS中执行此操作?

javascript colors bit-shift rgba uint8array
1个回答
1
投票

看起来像是在写这篇文章的时候,我发现了DataView的创建,这确实简化了我的工作!

因此可以使用以下方法解决问题:

DataView

也可以使用function argbToRgba(src) { let dest = new Uint8Array(src.length); let srcView = new DataView(src.buffer); let destView = new DataView(dest.buffer); for (let i = 0; i < src.length; i += 4) { let argb = srcView.getUint32(i); let rgba = (argb & 0x00FFFFFF) << 8 | (argb & 0xFF000000) >>> 24; destView.setUint32(i, rgba); } return dest; } 进行内联更改。

© www.soinside.com 2019 - 2024. All rights reserved.