js调用本地摄像头截图并用ajax上传至后台服务器完成交互

3 篇文章 0 订阅
2 篇文章 0 订阅

下面我来给大家讲述一下如何用js调用本地摄像头,截图并上传,完成交互,一步到位, 我给大家做了一个小示例,亲测有效, 在Chrome 和 Firefox 还有 Edge 和 360 等多数主流浏览器中均能使用,其中经过测试, 这些浏览器在本地运行环境中都没有问题。但是上传到服务器上运行的时候,Firefox 和 Edge依旧是完美运行, 但是在新版Chrome和360中为了保护隐私安全需要为https的安全协议才能允许打开摄像头。
下面我就直接上代码了。
主要就用到自己写的一个jsvideoPort.js,我会详细说明。

html5页面如下:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>js调用本地摄像头截图并用ajax上传至后台服务器完成交互</title>
    <link rel="stylesheet" href="style.css">
    <script src="js/jquery-1.11.3.min.js"></script>
    <script src="js/videoPort.js"></script>
</head>
<body>
    <div class="uploadimg-group">
        <img src="" id="uploadimg">
        <button class="loadbtn">上传图片</button>
        <button class="uploadbtn">发送</button>
    </div>
    <div class="video_port" id="video_port">
        <video id="video" width="400" height="300"></video>
        <canvas id="vi_canver" width="400" height="300" hidden></canvas>
        <p class="picturebtn">
            <button id="screenshots" class="screenshots">截取图像</button>
            <span class="myshu"></span>
            <button id="close" class="closecamera">关闭摄像头</button>
        </p>
    </div>
</body>
</html>

videoPort.js如下:

$(document).ready(function(){
    // 这里设置一个全局变量, 作为图像base64
    var imgdata = null;
    $('.loadbtn').click(function(){
        jQuery('.video_port').show();
        function $(elem) {
            return document.querySelector(elem);
        };

        var canvas = document.getElementById("vi_canver");
        var context = canvas.getContext("2d");
        var video = $('#video'),
            screen = $('#screenshots'),
            close = $('#close'),
            mediaStream;

        //打开摄像头主要用到下面的getUserMedia方法,用来将获取到的媒体流传入video标签中
        navigator.mediaDevices.getUserMedia({
            video: true
        }).then(function(stream) {
            // 这里面写成功的回调函数
            console.log(stream);
            mediaStream = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];
            video.src = (window.URL || window.webkitURL).createObjectURL(stream);
            video.play();
        }).catch(function(error) {
            // 这里是失败的回调
            console.log(error);
        })
        // 这里截取图片的原理为截取video画面中的当前帧,然后使用canvas中drawImage方法将内容绘至canvas中
        screen.addEventListener('click', function() {
            context.drawImage(video, 0, 0, 400, 300);
            var type = 'jpeg';
            //在这里我直接将canvas中的内容转化为base64格式,传入到需要显示的img中
            imgdata = canvas.toDataURL(type)
            jQuery("#uploadimg").attr("src",imgdata);
        }, false);
        // 关闭摄像头
        close.addEventListener('click', function() {
            mediaStream && mediaStream.stop();
            jQuery('.video_port').hide();
        }, false);
    });

    // 这是一个转换base64的一个方法
    function convertBase64UrlToBlob(urlData){

        var bytes=window.atob(urlData.split(',')[1]);        //去掉url的头,并转换为byte

        //处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
        }

        return new Blob( [ab] , {type : 'image/jpeg'});
    }

    $('.uploadbtn').click(function(){
        //这里用formDate对象向后端传输文件完成交互
        var formDate = new FormData();
        formDate.append('image', convertBase64UrlToBlob(imgdata));
        $.ajax({
            type: 'POST',
            url: 'url',
            data: formDate,
            contentType: false,
            processData: false,
            success: function(data){
                alert(data.data);
            },
            error: function(data){
                alert('error');
            }
        })
    })

})

最后再附上最终效果图和css(害羞…..)
这里写图片描述

*{
    margin: 0;
    padding:0;
}
body{
    background: #999;
}
.video_port{
    position: absolute;
    top: 0;
    left: 0;
    display: none;
    z-index: 99999;
}
.uploadimg-group{
    position: absolute;
    top:0;
    left: 500px;
    width: 402px;
}
.uploadimg-group img{
    width:400px;
    height:300px;
    border:1px solid #e1e1e1;
    display: block;
}
.uploadimg-group button{
    display: block;
    width:100%;
    margin-top: 0.83vw;
    text-align: center;
    color: #fff !important;
    line-height: 2.6vw;
    height: 2.6vw;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    -webkit-border-radius: 8px;
    -moz-border-radius: 8px;
    border-radius: 8px;
    background: #676b6b;
    font-size: 1.25vw;
    font-family: "Microsoft JhengHei";
    font-weight:bold;
    -webkit-transition: 0.3s;
    -moz-transition: 0.3s;
    -ms-transition: 0.3s;
    -o-transition: 0.3s;
    transition: 0.3s;
    border: 0;
    outline: none;
    box-shadow: inset 0 0.3rem 0.2rem rgba(255, 255, 255, 0.2), inset 0 -0.3rem 0.2rem rgba(0, 0, 0, 0.2), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2);
    text-shadow: 0 0.05rem rgba(0, 0, 0, 0.8), 0 0.3rem 0.4rem rgba(0, 0, 0, 0.2), 0 -0.2rem 0.4rem rgba(255, 255, 255, 0.2);
    cursor: pointer;
}
.uploadimg-group button:hover{
    *zoom: 1;
    filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF000000', endColorstr='#FF000000');
    background-image: -webkit-gradient(linear, 30% 0%, 30% 100%, color-stop(0%, transparent), color-stop(100%, rgba(0, 0, 0, 0.3)));
    background-image: -webkit-linear-gradient(top, transparent 0%, rgba(0, 0, 0, 0.3) 100%);
    background-image: -moz-linear-gradient(top, transparent 0%, rgba(0, 0, 0, 0.3) 100%);
    background-image: -o-linear-gradient(top, transparent 0%, rgba(0, 0, 0, 0.3) 100%);
    background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%);
}
.picturebtn{
    width:100%;
    height: 40px;
    line-height: 40px;
    background: #f2f2f2;
    font-size:0;
}
.picturebtn button{
    outline: none;
    border:0;
    background: transparent;
    color: #000;
    font-size: 0.83vw;
    text-align: center;
    width:199px;
    height:100%;
    line-height: 40px;
    display: inline-block;
    vertical-align: top;
}
.myshu{
    display: inline-block;
    vertical-align: top;
    width:1px;
    height: 30px;
    margin-top: 5px;
    background: #999999;
}
.picturebtn button.screenshots{
    background: transparent url(jiequ.png)no-repeat 35px 10.5px;
    -webkit-background-size: 23px 19px;
    background-size: 23px 19px;
}
.picturebtn button.closecamera{
    background: transparent url(closecamera.png)no-repeat 35px 11px;
    -webkit-background-size: 23px 19px;
    background-size: 23px 19px;
}

这篇文章希望能对大家有帮助。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值