Das Händler-Backend, an dem ich kürzlich gearbeitet habe, musste die Funktion implementieren, die Kamera aufzurufen, um Fotos von den eincheckenden Benutzern aufzunehmen. Ich habe nach Informationen gesucht und recherchiert. Schließlich hat sich Huang Tian ausgezahlt und ich werde den Codeschritt veröffentlichen Schritt für Schritt weiter unten, in der Hoffnung, dass es hilfreich ist.
Es gibt viel Code, aber jeder Schritt ist leicht zu verstehen. Wenn es an der Zeit ist, das Bild hochzuladen, wird es nicht asynchron sein Sie müssen andere js einführen. Es gibt eine Methode für h5, um das Mediengerät direkt anzupassen.
Es ist jedoch zu beachten, dass Websites ohne HTTPS-Protokolle aus Sicherheitsgründen bei vielen Browsern wie Google, QQ, 360 usw. als unsicher gelten. Wenn sie daher nicht abgerufen werden können, denken Sie daran Beantragen Sie das HTTPS-Zertifikat der Website, das auf dem Server installiert ist.
Während des Testzeitraums schaltete ihr Browser standardmäßig den Blitz und die Kameraausrüstung aus und konnte sie nicht öffnen. Ich suchte nach verschiedenen Eingängen, aber es gab keine Check-in-Button. Schließlich habe ich es ausprobiert. Firefox kann abgerufen werden, daher wird empfohlen, Firefox während der Testphase für die Entwicklung zu verwenden
Anforderungen:
Aufnehmen und Fotografieren müssen nach dem Aufnehmen des Fotos am selben Ort erfolgen. In Zukunft wird das Foto in der Videobox angezeigt. Wenn Sie die Aufnahme wiederholen möchten, wird die Videobox angezeigt und das Foto angezeigt wird ausgeblendet. Klicken Sie dann auf „Aufnahme“. Wenn die Aufnahme erfolgreich ist, klicken Sie auf „Hochladen“.
Die Kamera wurde erfolgreich aufgerufen, wie in der Videobox mit einem Fortschrittsbalken wie unten gezeigt:
Klicken Sie, um ein Foto aufzunehmen, die Aufnahme ist Erfolgreich, und die Aktivierung der Kamera wird auf der linken Schaltfläche angezeigt. Klicken Sie tatsächlich nicht, um die Kamera zu aktivieren. Wenn Sie nicht zufrieden sind und klicken, um ein Bild aufzunehmen, können Sie ein Bild aufnehmen, es wird jedoch nicht angezeigt wie es aussieht, wie im Bild gezeigt:
Die Aufnahme ist abgeschlossen. Klicken Sie auf „Hochladen“, um den Datenvorgang in den Hintergrund zu übertragen.
Style-Datei:
.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-Code:
<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+'"/ alt="So rufen Sie die Kamera mit PHP auf, um die Kamerafunktion zu implementieren" >'); } $('#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>
An den Hintergrund senden, PHP verarbeitet es und das Framework Verwendet wird tp5, daher ist es sehr praktisch, den Erfolg und Fehler von tp bei der späteren Rückkehr direkt zu verwenden. Der erste Parameter ist msg, der zweite ist die URL und der dritte sind Daten.
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('编辑失败,请刷新重试!'); } }
Verwandte Empfehlungen: „PHP-Tutorial“
Das obige ist der detaillierte Inhalt vonSo rufen Sie die Kamera mit PHP auf, um die Kamerafunktion zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!