この記事はパソコンやスマートフォンのカメラをJavaScriptで制御する方法のメモである。
まずは、ラップトップパソコンやタブレットPCなど、カメラが1つだけのとき、または複数あるときのデフォルトのカメラを使う時の方法である。
決めておくこと
カメラを制御するときには、いくつか決めておくことがある。
画素数
カメラを使うときには、2つの画素数を決める。
撮影する画像の大きさ
ひとつはカメラで撮影する画像の縦と横の画素数である。この画素数で撮影したデータを画像データとして出力できる。
ファインダーの大きさ
もうひとつはファインダーの縦と横の画素数である。ファインダーはカメラがどんな画像を写しているかを確かめるために使う。
ソースコード
HTMLとJavaScriptそれぞれのソースコードはこのようになる。
HTMLのソースコード
<video id="cameraFinder" autoplay></video>
<input type="button" value="シャッター" onclick="pressShutter()"><br>
撮影した画像<br>
<canvas id="canvasDetector"></canvas>
<img id="imgDetector">| タグ名 | 内容 | 
|---|---|
| video | カメラのファインダーとして使う。 | 
| input | シャッターボタンとして使う。 | 
| canvas | 撮影した画像を表示する。 | 
| img | 撮影した画像を表示する。 | 
JavaScriptのソースコード
JavaScriptのコードはこのようになる。
  //撮影する画像の大きさ
  const CAMERA_IMG_WIDTH  = 600;
  const CAMERA_IMG_HEIGHT = 450;
  //ファインダーの大きさ
  const FINDER_WIDTH  = 300;
  const FINDER_HEIGHT = 225;
  //カメラの仕様の定義
  const cameraSpec = {
    audio: false,
    video: {
      width : CAMERA_IMG_WIDTH  ,
      height: CAMERA_IMG_HEIGHT
    }
  };
  //カメラを使えるようにする
  navigator.mediaDevices.getUserMedia(cameraSpec)
    .then((stream) => {
      openFinder(stream);
    })
  /**
   * カメラファインダーの表示
   */
  function openFinder(stream) {
    //ファインダーとして使うvideoタグの画素数の指定
    let finderElement = document.getElementById("cameraFinder");
    finderElement.style.width  = FINDER_WIDTH  + "px";
    finderElement.style.height = FINDER_HEIGHT + "px";
    //videoタグにカメラが見ている画像を表示
    finderElement.srcObject = stream;
    finderElement.onloadedmetadata = (e) => {
      finderElement.play();
    };
  }
  /**
   * シャッターボタン押下
   */
  function pressShutter() {
    let finderElement = document.getElementById("cameraFinder");
    // 演出的な目的で一度映像を止めてSEを再生する
    finderElement.pause();  // 映像を停止
    setTimeout(() => {
      finderElement.play();    // 0.5秒後にカメラ再開
    }, 500);
    //撮影した画像をcanvasタグに表示
    let canvasPhoto = document.getElementById("canvasDetector");
    //canvasタグの大きさ
    canvasPhoto.style.width  = CAMERA_IMG_WIDTH  + "px";
    canvasPhoto.style.height = CAMERA_IMG_HEIGHT + "px";
    //カンバス自体の大きさ
    canvasPhoto.width  = CAMERA_IMG_WIDTH;
    canvasPhoto.height = CAMERA_IMG_HEIGHT;
    //canvasタグへ表示の本体
    canvasPhoto.getContext("2d").drawImage(
      finderElement,
      0, 0, CAMERA_IMG_WIDTH ,CAMERA_IMG_HEIGHT , //画像のどの範囲を表示するか
      0, 0, CAMERA_IMG_WIDTH ,CAMERA_IMG_HEIGHT   //カンバスのどの範囲に表示するか
    );
    //imgタグに表示するとき
    let imgPhoto = document.getElementById("imgDetector");
    //imgタグの大きさ
    imgPhoto.style.width  = CAMERA_IMG_WIDTH  + "px";
    imgPhoto.style.height = CAMERA_IMG_HEIGHT + "px";
    imgPhoto.src = canvasPhoto.toDataURL();
  }このコードがどうなっているのかをみていこう。
定義部分
  //撮影する画像の大きさ
  const CAMERA_IMG_WIDTH  = 600;
  const CAMERA_IMG_HEIGHT = 450;
  //ファインダーの大きさ
  const FINDER_WIDTH  = 300;
  const FINDER_HEIGHT = 225;
  //カメラの仕様の定義
  const cameraSpec = {
    audio: false,
    video: {
      width : CAMERA_IMG_WIDTH  ,
      height: CAMERA_IMG_HEIGHT
    }
  };| 項目 | 内容 | 
|---|---|
| 撮影する画像の大きさ | 撮影する画像の縦と横の画素数を定義する。 | 
| ファインダーの大きさ | ファインダーとして使うタグの縦と横の画素数を定義する。 | 
| カメラの仕様の定義 | カメラの仕様を定義する。 | 
「カメラの仕様の定義」にはいくつかの項目がある。
| 項目 | 内容 | 
|---|---|
| audio | 音声を使うかどうかを指定する。今回は使わないのでfalseにする。 | 
| videoのwidthとheight | 撮影する画像の縦と横の画素数を定義する。「撮影する画像の大きさ」の値を使う。 | 
| videoのfacingMode | スマートフォンのようにカメラが2台以上あるとき、どのカメラを使うかを指定する。 | 
カメラを使えるようにする
  //カメラを使えるようにする
  navigator.mediaDevices.getUserMedia(cameraSpec)
    .then((stream) => {
      openFinder(stream);
    })
  /**
   * カメラファインダーの表示
   */
  function openFinder(stream) {
    //ファインダーとして使うvideoタグの画素数の指定
    let finderElement = document.getElementById("cameraFinder");
    finderElement.style.width  = FINDER_WIDTH  + "px";
    finderElement.style.height = FINDER_HEIGHT + "px";
    //videoタグにカメラが見ている画像を表示
    finderElement.srcObject = stream;
    finderElement.onloadedmetadata = (e) => {
      finderElement.play();
    };
  }navigator.mediaDevices.getUserMedia()にカメラの仕様を指定するとカメラを使えるようになる。
navigator.mediaDevices.getUserMedia()が正常終了したときの戻り値を使ってファインダーを表示する。ここでは別関数(openFinder())で表示する。
カメラファインダーの表示では、ファインダーとして使うvideoタグの縦と横の画素数を指定し、srcObjectにnavigator.mediaDevices.getUserMedia()の戻り値を指定する。続けてvideoタグのplay()でカメラに写っている画像がファインダーに表示される。
シャッターボタンの押下
  /**
   * シャッターボタン押下
   */
  function pressShutter() {
    let finderElement = document.getElementById("cameraFinder");
    // 演出的な目的で一度映像を止めてSEを再生する
    finderElement.pause();  // 映像を停止
    setTimeout(() => {
      finderElement.play();    // 0.5秒後にカメラ再開
    }, 500);
    //撮影した画像をcanvasタグに表示
    let canvasPhoto = document.getElementById("canvasDetector");
    //canvasタグの大きさ
    canvasPhoto.style.width  = CAMERA_IMG_WIDTH  + "px";
    canvasPhoto.style.height = CAMERA_IMG_HEIGHT + "px";
    //カンバス自体の大きさ
    canvasPhoto.width  = CAMERA_IMG_WIDTH;
    canvasPhoto.height = CAMERA_IMG_HEIGHT;
    //canvasタグへ表示の本体
    canvasPhoto.getContext("2d").drawImage(
      finderElement,
      0, 0, CAMERA_IMG_WIDTH ,CAMERA_IMG_HEIGHT , //画像のどの範囲を表示するか
      0, 0, CAMERA_IMG_WIDTH ,CAMERA_IMG_HEIGHT   //カンバスのどの範囲に表示するか
    );
    //imgタグに表示するとき
    let imgPhoto = document.getElementById("imgDetector");
    //imgタグの大きさ
    imgPhoto.style.width  = CAMERA_IMG_WIDTH  + "px";
    imgPhoto.style.height = CAMERA_IMG_HEIGHT + "px";
    imgPhoto.src = canvasPhoto.toDataURL();
  }シャッターボタン押下時は、撮影時の画像をcanvasタグに表示できる。imgタグには直には表示できず、「canvasタグの内容を表示する」という方法になる。
canvasタグに撮影時の画像を表示するには、canvasタグのdrawImage()で、ファインダーとして使っているvideoタグを指定する。同時に表示する縦と横の画素数を指定しておく。
imgタグに撮影時の画像を表示するには、canvasタグの内容をtoDataURL()で変換してimgタグのsrcに指定する。
では、実際にカメラを表示し、撮影してみよう→「JavaScriptでPCのカメラを使ったりする方法−其の壱−カメラを一つだけ使う」を実行してみる
 
  
  
  
  
コメント