0

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

任何想法如何将其转换SharedArrayBuffer为正常ArrayBuffer或如何ImageData创建SharedArrayBuffer

4

1 回答 1

1

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

你可以通过调用.slice()你从 SAB 获得的 Uint8ClampedArray 来做到这一点:

const sab = new SharedArrayBuffer( 50 * 50 * 4 );
const arr = new Uint8ClampedArray( sab );
const img = new ImageData( arr.slice(), 50, 50 );

或者,如果您要多次绘制此 SAB 的内容,则创建一次固定的 ArrayBuffer 并用 SAB 的内容填充它:

const sab = new SharedArrayBuffer( 50 * 50 * 4 );
const sab_view = new Uint8ClampedArray( sab );

const ab = new ArrayBuffer(sab.byteLength);
const arr = new Uint8ClampedArray( ab );
const img = new ImageData( arr, 50, 50 );
// later when sab has new content being set
arr.set(sab_view, 0);

活生生的例子 来源

(外包是因为 SharedArrayBuffer 需要 COOP,StackSnippet 不会给我们...)。

于 2021-03-27T05:04:25.210 回答