js 調用攝像頭實現拍照


調用攝像頭

核心方法 Window.navigator.mediaDevices.getUserMedia()

Window.navigator 會返回一個 Navigator 對象的引用,可以用於請求運行當前代碼的應用程序的相關信息。
navigator.mediaDevices該對象提供訪問連接媒體輸入的設備,如照相機和麥克風,以及屏幕共享等。它可以使你取得任何硬件資源的媒體數據。
getUserMedia(constraints) 會提示用戶給予使用媒體輸入的許可,媒體輸入會產生一個MediaStream,里面包含了請求的媒體類型的軌道。此流可以包含一個視頻軌道、一個音頻軌道,也可能是其它軌道類型。
navigator 詳細說明 MDN-navigator
mediaDevices 詳細說明 MDN-mediaDevices
getUserMedia 詳細說明MDN-getUserMedia
constraints 視頻軌道的配置說明 MDN-Constraints

let constraints={
  audio: false, //音頻軌道
  video: true  //視頻軌道
}
let mediaPromise = navigator.mediaDevices.getUserMedia(constraints);
mediaPromise..then(function(stream) {
  /* 使用這個stream stream */
})
.catch(function(err) {
  /* 處理error */
});

界面展示攝像頭錄制的信息,界面中需要添加 video標簽,將獲取到的 stream 賦值到 video 中;

let constraints={
  audio: true, //音頻軌道
  video: true  //視頻軌道
};
let srcVideo=document.querySelector('video.src-video');
let mediaPromise = navigator.mediaDevices.getUserMedia(constraints);
mediaPromise..then(function(stream) {
  /* 使用這個stream stream */
  srcVideo.srcObject=stream;
  srcVideo.play();
})
.catch(function(err) {
  /* 處理error */
});

拍照

拍照實現邏輯

  1. 獲取 srcVideo元素,獲取需要拍照的數據;
  2. 獲取 canvas元素,根據srcVideo中的數據進行圖片繪制 ctx.drawImage()
  3. canvas繪制的圖片信息,展示在 img標簽中;
// 獲取 `srcVideo`元素,獲取需要拍照的數據;
let srcVideo=document.querySelector('video.src-video');
let canvas = document.getElementById('canvas');
//獲取 `canvas`元素,根據`srcVideo`中的數據進行圖片繪制 `ctx.drawImage()`;
let ctx = canvas.getContext('2d');
ctx.drawImage(srcVideo, 0, 0, 500, 500);
//將 `canvas`繪制的圖片信息,展示在 `img`標簽中;
let photo=document.querySelector('img.photo');
photo.src=canvas.toDataURL();

拍照完整代碼

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>拍照</title>
</head>

<body>
    <button onclick="openMedia()" >開啟攝像頭</button>
    <button onclick="takePhoto()" >拍照</button><br/><br/>
    <video style="display: none;" class="src-video" width="500px" height="500px" autoplay="autoplay"></video>
    <canvas id="canvas" width="500px" height="500px" style="display: none;"></canvas>
    <img src="" alt="" class="photo">
</body>
<script>
    let srcVideo = document.querySelector('video.src-video');
    let mediaStream;
    let photo=document.querySelector('img.photo');
    // 開啟攝像頭
    let openMedia = function () {
        photo.src='';
        srcVideo.style.display='block';
        let constraints = {
            audio: false, //音頻軌道
            video: {width:500,height:500}  //視頻軌道
        }
        let mediaPromise = navigator.mediaDevices.getUserMedia(constraints);
        mediaPromise.then(function (stream) {
            /* 使用這個stream stream */
            mediaStream=stream;
            srcVideo.srcObject = stream;
            srcVideo.play();
        }).catch(function (err) {
            /* 處理error */
            alert(err);
        });
    };

    // 拍照
    let takePhoto=function(){
        let canvas = document.querySelector('#canvas');
        //獲取 `canvas`元素,根據`srcVideo`中的數據進行圖片繪制 `ctx.drawImage()`;
        let ctx = canvas.getContext('2d');
        ctx.drawImage(srcVideo, 0, 0, 500, 500);
        //將 `canvas`繪制的圖片信息,展示在 `img`標簽中;
        photo.src=canvas.toDataURL();
        closeMedia();
    };

    // 關閉攝像頭
    let closeMedia=function(){
        mediaStream.getTracks().forEach(track => {
            track.stop();
        });
        srcVideo.style.display='none';
    }

</script>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM