代码有点多,然则每一步都很好明白,首先是HTML代码,写一个form表单,到时刻上传图片时ajax异步提交,不需要引入别的js,h5有要领能直接调取媒体装备。
不过要注意的是好几个浏览器比方谷歌,QQ,360等由于平安缘由,没有HTTPS协定的网站一概认为是不平安的,所以,调取不到,要记得给网站请求HTTPS证书,安装在服务器上
测试阶段,他们的浏览器默许是封闭的lash和摄像头装备的,打不开,找了种种找进口,就是没有打卡的按钮,末了试了试火狐的,火狐的能够调取,所以发起测试阶段用火狐浏览器开发
需求:
照相和照片要在同一个位置,拍完今后视频框显现照片,假如想重拍点击激活摄像头按钮,视频框显现,照片隐蔽,再点击拍,拍摄胜利,点击上传。
调取胜利摄像头,如图下会有进度条的视频框显现:
点击照相,拍摄胜利,左侧会显现激活摄像头的按钮,实在不点激活摄像头,不满意接着点照相,是能够拍的,只不过看不到是什么样的,如图:
拍摄完成,点击上传,上传至背景举行数据操纵。
款式文件:
.coach-price{display: none} .input-but{display: inline-flex;} #canvas{display: none} #showVideo{display: none} #input-picture{width:100%;} HTML代码: <div class="ibox float-e-margins"> <div class="ibox-title"> <h5>打卡头像</h5> </div> <div class="ibox-content img-content"> <form class="form-horizontal m-t" id="upPictureForm" method="post" action=""> <div class="form-group " id="input-picture"> <div class="img-box" id="results"> <input name="image_code" id="image_code" type="hidden" value=""/> <input name="userId" class="userId" type="hidden" value=""/> //这是一个画布的容器 <canvas id="canvas" width="300" height="260"></canvas> </div> </div> <div class="form-group "> //要照相的视频框 <video id="video" controls> </video> </div> <div class="form-group "> //种种按钮 <div class="input-but"> <button type="button" class="layui-btn" id="showVideo"> 激活摄像头 </button> <button type="button" class="layui-btn" id="capture"> <i class="layui-icon"></i>照相 </button> <button type="button" id="uppicture" class="layui-btn" > <i class="layui-icon"></i>上传 </button> </div> </div> </form> </div> </div>
JS代码:
<script> //接见用户媒体装备的兼容要领 function getUserMedia(constraints, success, error) { if (navigator.mediaDevices.getUserMedia) { //最新的规范API navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error); } else if (navigator.webkitGetUserMedia) { //webkit中心浏览器 navigator.webkitGetUserMedia(constraints,success, error) } else if (navigator.mozGetUserMedia) { //firfox浏览器 navigator.mozGetUserMedia(constraints, success, error); } else if (navigator.getUserMedia) { //旧版API navigator.getUserMedia(constraints, success, error); } } function success(stream) { //兼容webkit中心浏览器 let CompatibleURL = window.URL || window.webkitURL; //将视频流设置为video元素的源 console.log(stream); //video.src = CompatibleURL.createObjectURL(stream); video.srcObject = stream; video.play(); } function error(error) { alert(`接见用户摄像头失利${error.name}, ${error.message}`); } //从 canvas 提取图片 image function convertCanvasToImage(canvas) { //新Image对象,能够明白为DOM var image = new Image(); // canvas.toDataURL 返回的是一串Base64编码的URL // 指定花样 PNG image.src = canvas.toDataURL("image/png"); return image; } function getnavigator() { if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) { //猎取video宽高 var v_height,v_width; var myvObj = document.getElementById("video"); myvObj.addEventListener("loadedmetadata", function () { v_height = this.videoHeight; v_width =this.videoWidth; $('#canvas').attr('width',v_width); $('#canvas').attr('height',v_height); }); //挪用用户媒体装备, 接见摄像头 getUserMedia({video : {width: 320, height: 240}}, success, error); } else { alert('不支持接见用户媒体'); } } getnavigator(); function showVideo(){ $('#results').find('img').remove(); $('#canvas').css('display','none'); $('#video').css('display','block'); $('#showVideo').css('display','none'); getnavigator(); } function showpicture(picture) { if($('#results').find('img').attr('src')){ $('#results').find('img').attr('src',picture); }else{ $('#results').append('<img src="'+picture+'"/>'); } $('#video').css('display','none'); $('#canvas').css('display','none'); $('#showVideo').show(); $('.picture').val(1); } function hidepicture() { $('#results').find('img').remove(); getnavigator(); $('#video').css('display','block'); $('#canvas').css('display','none'); $('#showVideo').css('display','none'); } $('#showVideo').click(function () { showVideo(); }); document.getElementById('capture').addEventListener('click', function () { let video = document.getElementById('video'); let canvas = document.getElementById('canvas'); let context = canvas.getContext('2d'); context.drawImage(video, 0, 0); //猎取网页中的canvas对象 var mycans=$('canvas')[0]; //挪用convertCanvasToImage函数将canvas转化为img情势 var img=convertCanvasToImage(mycans); if(img.src){ $('#results').find('#image_code').val(img.src); // $('#capture').text('修正'); $('#video').css('display','none'); $('#canvas').css('display','block'); $('#showVideo').show(); } }) //点击图片上传按钮 $('#uppicture').click(function () { var userId = $('.userId').val(); var image_code = $('#image_code').val();//图片值 if(!userId){ alert('用户不存在');return; } if(!image_code){ alert('请先照相');return; } $.post("{:url('upPicture')}", {'userId':userId,'image_code':image_code}, function(res){ // console.log(res); if(1 == res.code){ layer.alert(res.msg, {title: '友谊提醒', icon: 1}); $('.picture').val(1); }else{ layer.alert(res.msg, {title: '友谊提醒', icon: 2}); } }); }); </script>
提交背景,PHP举行处置惩罚,用的框架是tp5的,所今背面返回的时刻直接用的tp的success和error,很轻易,它的第一个参数是msg,第二个是URL,第三个是data。
public function upPicture(){ $image_code = input('image_code'); if(empty($image_code)){ $this ->error('照片为空'); } $uId = input('userId'); //处置惩罚吸收过来的图片 $img = str_replace('data:image/png;base64,', '', $image_code); $img = str_replace(' ', '+', $img); $data = base64_decode($img); // 图片称号 $file_name = "./uploads/head/".time().".png"; $fp = fopen($file_name, 'w'); fwrite($fp, $data); fclose($fp); $array = array( "picture" => substr($file_name,1) ); $res = Db::table("table")->where("userId",$uId)->setField($array); if($res){ $this ->success('编辑胜利!'); }else{ $this ->error('编辑失利,请革新重试!'); } }
相干引荐:《PHP教程》
以上就是php调取摄像头完成照相功用的要领的细致内容,更多请关注ki4网别的相干文章!