как передать несколько данных в массиве в качестве передаваемого объекта - PullRequest
0 голосов
/ 16 декабря 2018

для передачи отдельных изображений в рабочий поток. Я делаю что-то вроде следующего:

    var image = ctx.getImageData(0, 0, data.width, data.height)); 

    var tData = new Uint8ClampedArray(data.width*data.height*4); 
    tData.set(image.data);

    let message = {function: "my function", buffer: tData.buffer}

    worker.postMessage(message, [tData.buffer]);

Это прекрасно работает для отдельных изображений, но теперь я хочу отправить переменное количество изображений с помощью цикла.Отправка нескольких массивов разрешена в спецификации (например, worker.postMessage (message, [array1, array2]);), но тогда вы не можете динамически изменять количество изображений.

let imageDataArray=[];

for(let i=0;i<images.length;i++){   

    var tData = new Uint8ClampedArray(data.width*data.height*4); 

    tData.set(images[i].data);

    imageDataArray.push(tData.buffer);
}

let message = {function: "my function", buffer: imageDataArray}

worker.postMessage(message, [imageDataArray]);

, но этопросто не работает правильно, так как тип данных не может быть передан.Есть ли правильный способ сделать это?

Uncaught TypeError: Failed to execute 'postMessage' on 'Worker': Value at index 0 does not have a transferable type.

1 Ответ

0 голосов
/ 16 декабря 2018

Последняя строка должна быть (примечание: квадратные скобки не нужны).

worker.postMessage(message, imageDataArray);

Затем в рабочем доступ к данным осуществляется как

let imageIndex = 0;
let buf = event.data.buffer[imageIndex];
let image = new Uint8Array(buf);

// do something with image
// ....

// return it back
postMessage(event.data, event.data.buffer);

, затем в вызывающей функции оннеобходимо получить доступ к индексу массива

var image = new Uint8ClampedArray(event.data.buffer[imageIndex]);

, затем вы можете использовать его как

let imageData = ctx.getImageData(0, 0, width, height);

imageData.data.set(image);

// write the data to the canvas
ctx.putImageData(imageData, 0, 0);

Не все браузеры поддерживают несколько изображений, поэтому сначала следует проверить совместимость, выполнив фиктивный тест саргумент массива для рабочего.

...