
jsQRとは
ブラウザからカメラを起動してQRコードを読み込めるようにするJavaScriptライブラリ。
スマートフォンの場合、最新のOSであればカメラにQRコード読み取り機能があるが、古いOSだとアプリを別途インストールする必要がある。
しかし、QRコード読み取りアプリをインストールさせずにブラウザからカメラを起動してQRコードを読み取らせて画面遷移させたい場合もあるので、この記事ではその方法について書きました。
jsQRをインストール
npmの場合は以下のコマンドでインストールする。
npm i -D jsqr
インストールしたらES6 importかCommonJS requireで読み込んで使用する。
1 2 3 4 5 6 7 | // ES6 import import jsQR from "jsqr" ; // CommonJS require const jsQR = require( "jsqr" ); jsQR(...); |
npmを使用せずにcdnから読み込んで使用する場合はHTML内に以下のように記述して読み込む。
1 2 3 4 | < script > jsQR(...); </ script > |
jsQRで読み込んでアクセスするコード
完成形のjsQRで読み込んでアクセスするコードは以下の通り。
まずnavigator.mediaDevices.getUserMedia()でメディア入力を使用する許可をユーザーに求めます。
そしてカメラが使用可能であればQRを読み込むためのcanvasを描画して、jsQRでURLを取得してlocation.hrefでアクセスするだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | const video = document.createElement( 'video' ); const canvasElement = document.getElementById( 'canvas' ); const canvas = canvasElement.getContext( '2d' ); const loading = document.getElementById( 'loading' ); const output = document.getElementById( 'output' ); let isReadQR = false ; navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } }) .then((stream) => { video.srcObject = stream; video.setAttribute( 'playsinline' , true ); video.play(); requestAnimationFrame(tick); }); function tick() { loading.innerText = 'ロード中...' ; if (video.readyState === video.HAVE_ENOUGH_DATA) { loading.hidden = true ; canvasElement.hidden = false ; canvasElement.height = video.videoHeight; canvasElement.width = video.videoWidth; canvas.drawImage(video, 0, 0, canvasElement.width, canvasElement.height); var imageData = canvas.getImageData(0, 0, canvasElement.width, canvasElement.height); var code = jsQR(imageData.data, imageData.width, imageData.height, { inversionAttempts: 'dontInvert' , }); if (code && !isReadQR) { location.href = code.data; isReadQR = true ; } } requestAnimationFrame(tick); } |
jsQRを使用すればこれだけの簡単な処理でQRコードの読み込み処理が実装できます。
サンプルを用意しましたのでスマートフォンのブラウザでアクセスして試してみてください。