将 SharedArrayBuffer 转换为普通的 ArrayBuffer

问题描述

我正在尝试从基于 ImageDataUint8ClampedArray 创建一个新的 SharedArrayBuffer,因为 ImageData 构造函数不接受基于 Uint8ClampedArray SharedArrayBuffer 我必须以某种方式将其转换为普通的 ArrayBuffer

知道如何将 SharedArrayBuffer 转换为普通的 ArrayBuffer 或如何使用 ImageData 创建 SharedArrayBuffer 吗?

解决方法

您必须将该数据复制到上下文将完全拥有的自己的缓冲区中。

您只需在 SAB 的 Uint8ClampedArray 上调用 .slice() 即可:

if( window.SharedArrayBuffer ) {
  const buf = new SharedArrayBuffer( 50 * 50 * 4 );
  const arr = new Uint8ClampedArray( buf );
  const img = new ImageData( arr.slice(),50,50 );
  const { width,height } = img;
  console.log( { width,height,data: img.data.slice(0,20) } );
}
else {
  console.error( "Your browsers doesn't support SharedArrayBuffer in this context." );
}