我如何从客户端(html)拍照并将其保存到服务器端(Python)

时间:2017-10-21 06:53:41

标签: javascript python html

我是python的新手我使用python做了一个应用程序,因为我想使用html和AJAX javascript从我的网络摄像头捕获图像并将其保存到服务器端python。我已经完成了使用客户端HTML捕获图像,但我不知道如何保存并将数据从html客户端传递到服务器端python。如果有人这样做,请你帮我... 先感谢您... My.html:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Get User Media - Photo</title>
</head>
<body>
<button id="take">Take a photo</button><br />
<video id="v"></video>
<canvas id="canvas" style="display:none;"></canvas>

<img src="D:/VoteTest/img.jpg" id="photo" alt="photo">
<script>
    ;(function(){
        function userMedia(){
            return navigator.getUserMedia = navigator.getUserMedia ||
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia ||
            navigator.msGetUserMedia || null;

        }


        // Now we can use it
        if( userMedia() ){
            var videoPlaying = false;
            var constraints = {
                video: true,
                audio:false
            };
            var video = document.getElementById('v');

            var media = navigator.getUserMedia(constraints, function(stream){

                // URL Object is different in WebKit
                var url = window.URL || window.webkitURL;

                // create the url and set the source of the video element
                video.src = url ? url.createObjectURL(stream) : stream;

                // Start the video
                video.play();
                videoPlaying  = true;
            }, function(error){
                console.log("ERROR");
                console.log(error);
            });


            // Listen for user click on the "take a photo" button
            document.getElementById('take').addEventListener('click', function(){
                if (videoPlaying){
                    var canvas = document.getElementById('canvas');
                    canvas.width = video.videoWidth;
                    canvas.height = video.videoHeight;
                    canvas.getContext('2d').drawImage(video, 0, 0);
                    var data = canvas.toDataURL('image/webp');
                    document.getElementById('photo').setAttribute('src', data);
                }
            }, false);



        } else {
            console.log("KO");
        }
    })();
</script>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

我最近刚刚为一个项目做了这件事。您可以使用XHR在表单数据中发送图像:

let formdata = new FormData();
formdata.append("image", data);
let xhr = new XMLHttpRequest();
xhr.open('POST', 'http://yourserver/image', true);
xhr.onload = function () {
    if (this.status === 200)
        console.log(this.response);
    else
        console.error(xhr);
};
xhr.send(formdata);

我无法使用toDataURL转换画布,因此我使用toBlob进行了更简单的转换:

canvas.toBlob(callBackToMyPostFunctionAbove, 'image/jpeg');

以下是带有嵌入式JavaScript和我的Python服务器的示例HTML文件。

HTML&amp;嵌入式JavaScript

JavaScript使用:

  1. getUserMedia启动本地视频流
  2. 鼠标单击图像以启动图像捕获
  3. 用于保存getUserMedia流中图像的画布对象
  4. XHR将文件作为表单数据发送
  5. 代码:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Post an Image test</title>
        <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
    </head>
    <style>
        /* mirror the image */
        video, canvas {
        transform: scale(-1, 1); /*For Firefox (& IE) */
        -webkit-transform: scale(-1, 1); /*for Chrome & Opera (& Safari) */
    }
    </style>
    <body>
    <video id="myVideo" autoplay></video>
    
    <script>
    
        let v = document.getElementById("myVideo");
    
        //create a canvas to grab an image for upload
        let imageCanvas = document.createElement('canvas');
        let imageCtx = imageCanvas.getContext("2d");
    
        //Add file blob to a form and post
        function postFile(file) {
            let formdata = new FormData();
            formdata.append("image", file);
            let xhr = new XMLHttpRequest();
            xhr.open('POST', 'http://localhost:5000/image', true);
            xhr.onload = function () {
                if (this.status === 200)
                    console.log(this.response);
                else
                    console.error(xhr);
            };
            xhr.send(formdata);
        }
    
        //Get the image from the canvas
        function sendImagefromCanvas() {
    
            //Make sure the canvas is set to the current video size
            imageCanvas.width = v.videoWidth;
            imageCanvas.height = v.videoHeight;
    
            imageCtx.drawImage(v, 0, 0, v.videoWidth, v.videoHeight);
    
            //Convert the canvas to blob and post the file
            imageCanvas.toBlob(postFile, 'image/jpeg');
        }
    
        //Take a picture on click
        v.onclick = function() {
            console.log('click');
            sendImagefromCanvas();
        };
    
        window.onload = function () {
    
            //Get camera video
            navigator.mediaDevices.getUserMedia({video: {width: 1280, height: 720}, audio: false})
                .then(stream => {
                    v.srcObject = stream;
                })
                .catch(err => {
                    console.log('navigator.getUserMedia error: ', err)
                });
    
        };
    
    </script>
    </body>
    </html>
    

    这使用adapter.js在不同的浏览器上填充getUserMedia而不进行任何错误检查。

    Python服务器

    以下是使用Flask作为Web服务器的Python示例:

    from flask import Flask, request, Response
    import time
    
    PATH_TO_TEST_IMAGES_DIR = './images'
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return Response(open('./static/getImage.html').read(), mimetype="text/html")
    
    # save the image as a picture
    @app.route('/image', methods=['POST'])
    def image():
    
        i = request.files['image']  # get the image
        f = ('%s.jpeg' % time.strftime("%Y%m%d-%H%M%S"))
        i.save('%s/%s' % (PATH_TO_TEST_IMAGES_DIR, f))
    
        return Response("%s saved" % f)
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0')
    

答案 1 :(得分:0)

如果你在服务器端寻找php,我就是这样做的。

使用jquery:

将图像数据发布到php脚本
var imgData = canvas.toDataURL('image/png');
$.post("https://path-to-your-script/capture.php", {image: imgData},
    function(data) {
        console.log('posted');
});

php脚本将如下:

capture.php

$data = $_POST['image'];

// remove "data:image/png;base64," from image data.
$data = str_replace("data:image/png;base64,", "", $data);

// save to file
file_put_contents("/tmp/image.png", base64_decode($data));