Сохранить нарисованный холст в файл для каждого интервала - PullRequest
1 голос
/ 16 января 2020

Ниже приведен фрагмент кода HTML и JS, который пытается захватить изображение с веб-камеры через определенный интервал и сохранить его в виде отдельных файлов на сервере:

<video id="player" controls autoplay></video>
<canvas id="canvas" width=320 height=240></canvas>
<script>
const player = document.getElementById('player');
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const captureButton = document.getElementById('capture');
const constraints = {video: true,};

navigator.mediaDevices.getUserMedia(constraints)
    .then((stream) => {
        player.srcObject = stream;
    });

setInterval(drawevery, 350);

function drawevery(){

    $(document).ready(function() {
        var image = canvas.toDataURL("image/png");
        $.post("server.php", { pimg: image } );
    });

    context.drawImage(player, 0, 0, canvas.width, canvas.height);
}

PHP Код:

<?php
    define('UPLOAD_DIR', 'path/');
    $img = $_POST['pimg'];
    $img = str_replace('data:image/png;base64,', '', $img);
    $img = str_replace(' ', '+', $img);
    $data = base64_decode($img);
    $file = UPLOAD_DIR . uniqid() . '.png';
    $success = file_put_contents($file, $data);
?>

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

Редактировать: Лучшая реализация была бы такой, но она все еще не работает:

function drawevery(){


context.drawImage(player, 0, 0, canvas.width, canvas.height);


     var img = new Image();

     img.onload=function(){       

     var image = canvas.toDataURL("image/png");

     $.post("savePic.php", { pimg: image } );

     }

img.src=canvas.toDataURL();

setTimeout(drawevery, 400);

}
...