[我想将包含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中执行此操作?
看起来像是在写这篇文章的时候,我发现了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;
}
进行内联更改。