トップへ(mam-mam.net/)

WEBサイトでカメラ(WebCam)映像からQRコードを読むスキャナー

検索:

Javascriptでカメラ映像からjsQRを使用してQRコード読む(QRコードをスキャンする)
Chrome,Android Chrome,iPhone(Safari)に対応

カメラ使用を許可してください。しばらくすると、カメラ映像が表示されます

多少離れてもいいのでピントを合わせて、QRコードをカメラ映像の赤枠内にあわせると読み取ります


使用したライブラリとソースコード

https://github.com/cozmo/jsQR
から右上の「Code」ボタンを押し、「Download ZIP」ボタンを押して、jsQR-master.zipをダウンロードし解凍します。
ファイルを解凍した「dist」フォルダのみが必要なので、WEBサーバー上に配置等します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=0.2, maximum-scale=4,user-scalable=yes">
<!-- jsQR.jsの読み込み -->
<script src="./dist/jsQR.js"></script>
<script>
  var video,tmp,tmp_ctx,qr,prev,prev_ctx,w,h,m,x1,y1;
  window.addEventListener("load",function(){
    video=document.createElement('video');
    video.setAttribute("autoplay","");
    video.setAttribute("muted","");
    video.setAttribute("playsinline","");
    video.onloadedmetadata = function(e){video.play();};
    prev=document.getElementById("preview");
    prev_ctx=prev.getContext("2d", {willReadFrequently:true});
    tmp = document.createElement('canvas');
    tmp_ctx = tmp.getContext("2d", {willReadFrequently:true});

    qr = document.getElementById("qr");
    //カメラ使用の許可ダイアログが表示される
    navigator.mediaDevices.getUserMedia(
      //マイクはオフ, カメラの設定   できれば背面カメラ    できれば640×480
      {"audio":false,"video":{"facingMode":"environment","width":{"ideal":640},"height":{"ideal":480}}}
    ).then( //許可された場合
      function(stream){
        video.srcObject = stream;
        //0.5秒後にスキャンする
        setTimeout(Scan,500);
      }
    ).catch( //許可されなかった場合
      function(err){qr.innerHTML=qr.innerHTML+err+'\n';}
    );
  });
  function Scan(){
    //選択された幅高さ
    w=video.videoWidth;
    h=video.videoHeight;
    //画面上の表示サイズ
    prev.style.width=(w/2)+"px";
    prev.style.height=(h/2)+"px";
    //内部のサイズ
    prev.setAttribute("width",w);
    prev.setAttribute("height",h);
    if(w>h){m=h*0.5;}else{m=w*0.5;}
    x1=(w-m)/2;
    y1=(h-m)/2;
    prev_ctx.drawImage(video,0,0,w,h);
    prev_ctx.beginPath();
    prev_ctx.strokeStyle="rgb(255,0,0)";
    prev_ctx.lineWidth=2;
    prev_ctx.rect(x1,y1,m,m);
    prev_ctx.stroke();
    tmp.setAttribute("width",m);
    tmp.setAttribute("height",m);
    tmp_ctx.drawImage(prev,x1,y1,m,m,0,0,m,m);
    let imageData = tmp_ctx.getImageData(0,0,m,m);
    let scanResult = jsQR(imageData.data,m,m);
    if(scanResult){
      //QRコードをスキャンした結果を出力
      qr.value=qr.value+scanResult.data+'\n';
      qr.scrollTop = qr.scrollHeight;
    }
    setTimeout(Scan,200);
  }
</script>
</head>
<body>
  <p>ピントを合わせて、QRコードをカメラ映像の赤枠内にあわせると読み取ります</p>
  <div><canvas id="preview"></canvas></div>
  <textarea id="qr" rows="8" cols="40"></textarea>
</body>
</html>