HTML5能夠經過調用navigator.getUserMedia來獲取手機設備攝像頭,兼容性寫法以下javascript
window.navigator.getUserMedia = navigator.getUserMedia || navigator.webKitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;css
可是navigator.getUserMediau已經從 Web 標準中刪除,雖然部分瀏覽器可使用,生產環境中仍是要作好兼容。新的API更替爲MediaDevices.getUserMedia。MediaDevices.getUserMedia能夠經過video的facingMode屬性指定調用手機的前置或後置攝像頭
video:{ 'facingMode': "user" }//調用前置攝像頭
video: { facingMode: { exact: "environment" } }//後置html
具體代碼:java
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"> <title>Document1</title> <style type='text/css'> * { margin: 0; padding: 0; } html, body { height: 100%; } .flex { display: flex; } .flex-row { flex-direction: row; justify-content: space-around; align-items: center; } .flex-column { flex-direction: column; justify-content: flex-start; align-items: center; } body { overflow: auto; background: #fff; } .title { width: 920px; padding: 30px; align-items: flex-end; } .title h1 { padding-bottom: 20px; font-size: 38px; color: #ffffff; text-shadow: 0 1px 3px #222222; } .title p { font-size: 18px; color: #f5f5f5; text-shadow: 0 1px 3px #565656; } .wrap { width: 1220px; } .wrap .reference { position: relative; padding: 10px; background-color: rgba(255, 255, 255, 0); border-radius: 10px; box-shadow: 0 0 20px #a1a19f; } .wrap .reference img.face { display: block; width: 320px; height: auto; border-radius: 10px; } .wrap .reference img.toggle { position: absolute; right: 10px; top: 10px; width: 50px; height: 50px; } .wrap .scan video { background-color: rgba(0, 0, 0, .8); border-radius: 10px; } .wrap .control { justify-content: space-around; height: 456px; padding: 0 20px; } .wrap .control p { width: 160px; height: 60px; background-color: #f9f9f9; text-align: center; line-height: 60px; color: #ffffff; font-size: 24px; border-radius: 8px; cursor: pointer; box-shadow: -8px -8px 150px -8px #b2b3b5 inset, 0 0 5px #222222; text-shadow: 0 0 1px #222222; transition: .5s; } .wrap .control p:hover { box-shadow: -8px -8px 150px -8px #50c4f1 inset, 0 0 5px #ffffff; } .wrap .scan { position: relative; overflow: hidden; } .wrap .scan .strainer { position: absolute; top: 10px; width: 320px; z-index: 999; height: 3px; } .wrap .scan .capture { width: 320px; height: 456px; } .wrap .scan .strainer.on { background: linear-gradient(to left, transparent, #0bffb2, transparent); animation: scan 1s linear infinite; } @keyframes scan { 0% { top: 10px; } 50% { top: 456px; } 100% { top: 10px; } } </style> <script type="text/javascript" src="vconsole.min.js"></script> </head> <body> <div class="title flex flex-column"> </div> <div class="wrap flex flex-row"> <div class="control flex flex-column"> <p class="open">開啓攝像頭</p> <p class="recognition">顯示到Canvas</p> <p class="close">關閉攝像頭</p> </div> <div class="scan reference"> <div class="strainer"></div> <video class="capture" width="320" height="456" src=""></video> </div> </div> <script type="text/javascript"> var buffer; var oCapture = document.querySelector(".capture"), open = document.querySelector(".open"), recognition = document.querySelector(".recognition"), close = document.querySelector(".close"); var control = document.querySelector(".control"); window.navigator.getUserMedia = navigator.getUserMedia || navigator.webKitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; function invokingCarera(){ if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){ navigator.mediaDevices.getUserMedia({ 'audio':true, 'video':{ 'facingMode': "user" }//調用前置攝像頭,後置攝像頭使用video: { facingMode: { exact: "environment" } } }) .then(function(mediaStream) {console.log(555);getVideoStream(mediaStream)}) .catch(function(error) { console.log(666);console.log(error) }) }else if(navigator.getUserMedia){ navigator.getUserMedia({ 'video':true, 'audio':true },getVideoStream,getFail) }else{ alert('不支持攝像頭調用!') } } //調用成功 function getVideoStream(stream){ buffer = stream; if(oCapture.mozSrcObject !== undefined){ oCapture.mozSrcObject = buffer; }else{ oCapture.src = window.URL && window.URL.createObjectURL(buffer); } oCapture.play(); } function getFail(){ } recognition.onclick = function(){ } control.addEventListener('click',function(e){ e = e || window.event; var className = e.target.className; switch(className){ case 'open': invokingCarera(); break; case 'close': closeCamera(); break; case 'recognition': screenShot(); break; default: break; } }) function closeCamera(){ buffer&&buffer.getTracks()[1].stop();//關閉攝像頭 } window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function( callback ){ window.setTimeout(callback, 1000 / 60); }; })(); function screenShot(){ var canvas = document.createElement('canvas'); canvas.width=320,canvas.height = 456; document.querySelector(".wrap").appendChild(canvas); var ctx = canvas.getContext('2d'); function drawVideo(){ ctx.drawImage(oCapture,0,0,320,456); ctx.font = "30px sans-serif"; ctx.fillStyle = "blue"; ctx.fillText("請眨眼", 50, 50); requestAnimationFrame(drawVideo); } window.requestAnimationFrame(drawVideo); } </script> </body> </html>
以上代碼並無進行太多的錯誤處理,好比用戶拒絕受權訪問攝像頭或瀏覽器不支持等狀況,生產環境使用需添加錯誤處理代碼web
以上代碼在PC端和Android手機端和微信測試經過,IOS下瀏覽器均不支持,聽說IOS11會開放權限。
注意,以上HTML須要在HTTPS下訪問方可正常工做
查看在線DEMO,若是使用微信訪問可能被屏蔽,微信打開連接後點擊右下角「訪問原網頁」
如需本地測試請使用Chrome插件:web-server;
webserver使用方法:chrome://apps > web-server > choose folder 勾選 Show Advanced Settings下Set CORS Headers便可
使用input type=」file」調用攝像頭拍照能夠參考camera APIchrome
補充下,獲取vedio的實際尺寸,能夠經過:this.videoWidth,this.videoHeight獲取。canvas
可用函數瀏覽器
drawImage(image, x, y) //按原圖片大小繪製。 drawImage(image, x, y, width, height) //按指定大小繪製。 drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) //經常使用於圖片裁剪
參數微信
image:所要繪製的圖像。這必須是表示 標記或者屏幕外圖像的 Image 對象,或者是 Canvas 元素。 x和y:圖片在文檔中的座標位置。 width和height:圖片的寬高。 對於drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) 經常使用有圖片的裁剪。其參數含義是原來image上從某一個位置開始(sourceX,sourceY),指定長寬進行剪切(sourceX,sourceY),而後將剪切的內容放到位置爲(destX,destY),寬度爲(destWidth),高度爲(destHeight)的位置上,固然裁剪後的會覆蓋原來的圖片。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>drawImage</title> </head> <body> <canvas id="myCanvas" width="500" height="400"></canvas> <script type="text/javascript"> var canv=document.getElementById("myCanvas"); var ctx = canv.getContext("2d"); img = new Image(); img.src = "2.jpg"; //當圖片加載完畢的時候在drawImage,不然可能圖片尚未加載完畢 //固然畫不上去嘍,這就和瀏覽器的性能有關了。 img.onload=function(){ ctx.drawImage(img,0,0,500,500); //ctx.drawImage(img,0,0,100,100,300,100,100,100); } </script> </body> </html>
除此以外,drawImage()還能夠畫video,參考連接app