Я пытаюсь играть с задержкой веб-камеры на канал в JavaScript, и мой текущий код работает медленно. Вы можете увидеть демо-версию hereЭффективное манипулирование пикселями с использованием javascript Canvas
Мой подход к задержке создает массив из 12 элементов для хранения пикселей (элементы холста), а затем перемещает содержимое из одного кадра в другой путем копирования пикселей (используя вызовы getImageData и putImageData). Поскольку я расщепляющие цветовые каналы, моя функция обновления выглядит следующим образом:
function update() {
if (localMediaStream) {
// Update history
for (var i = hs - 1; i > 0; i--) {
var ctxCurr = history[i].getContext('2d');
var ctxPrev = history[i - 1].getContext('2d');
try {
ctxCurr.putImageData(ctxPrev.getImageData(0, 0, w, h), 0, 0);
} catch (err) {
console.log(err);
}
}
// Write the most recent webcam frame
var ctx0 = history[0].getContext('2d');
ctx0.drawImage(video, 0, 0, w, h);
// Get pixel data for most recent,halfway and last frames in history
var r = history[0].getContext('2d').getImageData(0, 0, w, h).data;
var g = history[hs/2].getContext('2d').getImageData(0, 0, w, h).data;
var b = history[hs - 1].getContext('2d').getImageData(0, 0, w, h).data;
// Get a frame and it's pixels
var imageData = ctx0.getImageData(0, 0, w, h);
var data = imageData.data;
// Write the r,g,b channels using the offset frames for green and blue channels
for (var i = 0; i < data.length; i += 4) {
data[i] = r[i];
data[i + 1] = g[i + 1];
data[i + 2] = b[i + 2];
}
rgb.putImageData(imageData, 0, 0);
}
}
Я предполагаю, что я мог бы пропустить, используя красный канал, так как последний кадр уже имеет эту информацию. Есть ли более быстрый способ манипулировать/записывать данные пикселов (кроме getImageData()
и putImageData()
) или быстрее подходит к тому, чего я пытаюсь достичь?
Спасибо Зак! drawImage - большой импульс по сравнению с putImageData/getImageData –
Я обновил код, и он работает на приличной скорости даже на моем Android. Еще раз спасибо! –