↓↓クリックして頂けると励みになります。
【42 | 配達写真ページ】 << 【ホーム】 >> 【44 | 配送写真アップロード】
「core/static」フォルダに「js」フォルダを新規作成します。
作成した「core/static/js」フォルダに「webcam-easy.min.js」ファイルを新規作成します。
新規作成 【Desktop/crowdsource/core/static/js/webcam-easy.min.js】
class Webcam{constructor(e,t="user",s=null,i=null){this._webcamElement=e,this._webcamElement.width=this._webcamElement.width||640,this._webcamElement.height=this._webcamElement.height||.75*this._webcamElement.width,this._facingMode=t,this._webcamList=[],this._streamList=[],this._selectedDeviceId="",this._canvasElement=s,this._snapSoundElement=i}get facingMode(){return this._facingMode}set facingMode(e){this._facingMode=e}get webcamList(){return this._webcamList}get webcamCount(){return this._webcamList.length}get selectedDeviceId(){return this._selectedDeviceId}getVideoInputs(e){return this._webcamList=[],e.forEach(e=>{"videoinput"===e.kind&&this._webcamList.push(e)}),1==this._webcamList.length&&(this._facingMode="user"),this._webcamList}getMediaConstraints(){var e={};return""==this._selectedDeviceId?e.facingMode=this._facingMode:e.deviceId={exact:this._selectedDeviceId},{video:e,audio:!1}}selectCamera(){for(let e of this._webcamList)if("user"==this._facingMode&&e.label.toLowerCase().includes("front")||"enviroment"==this._facingMode&&e.label.toLowerCase().includes("back")){this._selectedDeviceId=e.deviceId;break}}flip(){this._facingMode="user"==this._facingMode?"enviroment":"user",this._webcamElement.style.transform="",this.selectCamera()}async start(e=!0){return new Promise((t,s)=>{this.stop(),navigator.mediaDevices.getUserMedia(this.getMediaConstraints()).then(i=>{this._streamList.push(i),this.info().then(i=>{this.selectCamera(),e?this.stream().then(e=>{t(this._facingMode)}).catch(e=>{s(e)}):t(this._selectedDeviceId)}).catch(e=>{s(e)})}).catch(e=>{s(e)})})}async info(){return new Promise((e,t)=>{navigator.mediaDevices.enumerateDevices().then(t=>{this.getVideoInputs(t),e(this._webcamList)}).catch(e=>{t(e)})})}async stream(){return new Promise((e,t)=>{navigator.mediaDevices.getUserMedia(this.getMediaConstraints()).then(t=>{this._streamList.push(t),this._webcamElement.srcObject=t,"user"==this._facingMode&&(this._webcamElement.style.transform="scale(-1,1)"),this._webcamElement.play(),e(this._facingMode)}).catch(e=>{console.log(e),t(e)})})}stop(){this._streamList.forEach(e=>{e.getTracks().forEach(e=>{e.stop()})})}snap(){if(null!=this._canvasElement){null!=this._snapSoundElement&&this._snapSoundElement.play(),this._canvasElement.height=this._webcamElement.scrollHeight,this._canvasElement.width=this._webcamElement.scrollWidth;let e=this._canvasElement.getContext("2d");return"user"==this._facingMode&&(e.translate(this._canvasElement.width,0),e.scale(-1,1)),e.clearRect(0,0,this._canvasElement.width,this._canvasElement.height),e.drawImage(this._webcamElement,0,0,this._canvasElement.width,this._canvasElement.height),this._canvasElement.toDataURL("image/png")}throw"canvas element is missing"}}
記述編集 【Desktop/crowdsource/core/templates/courier/current_job_take_photo.html】
{% extends 'courier/base.html' %} {% load static %} {% block head %} <script src="{% static 'js/webcam-easy.min.js' %}"></script> <style> body { background-color: black; } .btn-back { position: fixed; top: 30px; left: 30px; } .buttons { position: fixed; bottom: 20px; left: 0; right: 0; text-align: center; } #take-photo-step { height: 100%; display: flex; align-items: center; } video { width: 100%; height: auto; } #upload-step { height: 100%; display: none; align-items: center; } </style> {% endblock %} {% block content %} <div id="upload-step"> <img id="photo"> <div class="buttons"> <a id="retake-button" class="btn btn-light" href="javascript:void(retake_photo())">再度撮影</a> <a id="upload-button" class="btn btn-info" href="javascript:void(upload_photo())"> アップロード </a> </div> </div> <div id="take-photo-step"> <video id="webcam" autoplay playsinline></video> <canvas id="canvas" class="d-none"></canvas> <a href="{% url 'courier:current_job' %}" class="btn-back"> <i class="fas fa-chevron-left text-light"></i> </a> <div class="buttons"> <a href="javascript:void(take_photo())" class="btn btn-info"> 配達の写真を撮影する </a> </div> </div> <script> const webcamElement = document.getElementById('webcam'); const canvasElement = document.getElementById('canvas'); const webcam = new Webcam(webcamElement, 'environment', canvasElement); webcam.start(); function take_photo() { let picture = webcam.snap(); console.log(picture); $("#photo").attr("src", picture); $("#take-photo-step").css("display", "none"); $("#upload-step").css("display", "flex"); } function retake_photo() { $("#upload-step").css("display", "none"); $("#take-photo-step").css("display", "flex"); } </script> {% endblock %}
写真撮影、再撮影ができるようになりました。
JsonViewのコンソールを開いて動作を確認してください。

↓↓クリックして頂けると励みになります。
【42 | 配達写真ページ】 << 【ホーム】 >> 【44 | 配送写真アップロード】