JS調(diào)用安卓手機(jī)攝像頭掃描二維碼
項目要求:
使用H5模仿微信掃一掃付款功能
經(jīng)過一系列的查找最后發(fā)現(xiàn)可以使用 JS調(diào)用手機(jī)攝像頭然后用畫布把當(dāng)前攝像頭的數(shù)據(jù)轉(zhuǎn)成Base64的png圖片,經(jīng)過QrCode直接再本地識別。
優(yōu)點:
兼容大多數(shù)瀏覽器
本地識別不占用服務(wù)端資源
代碼比較簡單只有一個頁面
<html lang="ZH-CN">
<head>
<meta charset="utf-8">
<title>Web QrCode Test</title>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="jsqrcode/src/grid.js"></script>
<script type="text/javascript" src="jsqrcode/src/version.js"></script>
<script type="text/javascript" src="jsqrcode/src/detector.js"></script>
<script type="text/javascript" src="jsqrcode/src/formatinf.js"></script>
<script type="text/javascript" src="jsqrcode/src/errorlevel.js"></script>
<script type="text/javascript" src="jsqrcode/src/bitmat.js"></script>
<script type="text/javascript" src="jsqrcode/src/datablock.js"></script>
<script type="text/javascript" src="jsqrcode/src/bmparser.js"></script>
<script type="text/javascript" src="jsqrcode/src/datamask.js"></script>
<script type="text/javascript" src="jsqrcode/src/rsdecoder.js"></script>
<script type="text/javascript" src="jsqrcode/src/gf256poly.js"></script>
<script type="text/javascript" src="jsqrcode/src/gf256.js"></script>
<script type="text/javascript" src="jsqrcode/src/decoder.js"></script>
<script type="text/javascript" src="jsqrcode/src/qrcode.js"></script>
<script type="text/javascript" src="jsqrcode/src/findpat.js"></script>
<script type="text/javascript" src="jsqrcode/src/alignpat.js"></script>
<script type="text/javascript" src="jsqrcode/src/databr.js"></script>
</head>
<body>
<div class="booth">
<video id="video" width="400" height="400"></video>
<canvas id='canvas' width='400' height='400'></canvas>
<img id='img' src=''>
</div>
<div id="mmm"></div>
<canvas id="qr-canvas" width="640" height="480"></canvas>
<script>
//初始化媒體對象
var c=0;
var video = document.getElementById('video'),
canvas = document.getElementById('canvas'),
img = document.getElementById('img'),
vendorUrl = window.URL || window.webkitURL;
//媒體對象
navigator.getMedia = navigator.getUserMedia ||
navagator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
navigator.getMedia({
video: true, //使用攝像頭對象
audio: false //不適用音頻
}, function(strem){
console.log(strem);
video.src = vendorUrl.createObjectURL(strem);
video.play();
}, function(error) {
//error.code
console.log(error);
});
//啟動定時器
setTimeout("actionP(null)","1000");
//定時器
function actionP(data){
if(data==null){
Screenshot()
}else{
if(data!=null & data!="error decoding QR Code"){//識別出數(shù)據(jù)
if(data.indexOf("http")!=-1){
window.location.href=data;
}else alert(data);
}else{//沒有數(shù)據(jù)循環(huán)十次
c++;
if(c<10){
setTimeout("actionP(null)","1000");
}
}
}
}
function Screenshot(){//截取圖像
canvas.getContext('2d').drawImage(video, 0, 0, 400, 400);
var imgData = canvas.toDataURL("image/png");
load(imgData);
img.src=imgData;
}
////////////////////////////////////////識別二維碼////////////////////////////////////////////
function dragenter(e) {
e.stopPropagation();
e.preventDefault();
}
function dragover(e) {
e.stopPropagation();
e.preventDefault();
}
function drop(e) {
e.stopPropagation();
e.preventDefault();
var dt = e.dataTransfer;
var files = dt.files;
}
function load(name)
{
initCanvas(640,480);
//識別二維碼并回調(diào)方法
qrcode.callback = actionP;
qrcode.decode(name);
}
function initCanvas(ww,hh)//創(chuàng)建畫板
{
gCanvas = document.getElementById("qr-canvas");
gCanvas.addEventListener("dragenter", dragenter, false);
gCanvas.addEventListener("dragover", dragover, false);
gCanvas.addEventListener("drop", drop, false);
var w = ww;
var h = hh;
gCanvas.style.width = w + "px";
gCanvas.style.height = h + "px";
gCanvas.width = w;
gCanvas.height = h;
gCtx = gCanvas.getContext("2d");
gCtx.clearRect(0, 0, w, h);
imageData = gCtx.getImageData( 0,0,320,240);
}
</script>
</body>
</html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
json對象轉(zhuǎn)為字符串,當(dāng)做參數(shù)傳遞時加密解密的實現(xiàn)方法
下面小編就為大家?guī)硪黄猨son對象轉(zhuǎn)為字符串,當(dāng)做參數(shù)傳遞時加密解密的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
JavaScript中內(nèi)存泄漏的幾種情況總結(jié)
在JavaScript中,內(nèi)存泄漏通常是由于變量、對象、閉包、事件監(jiān)聽器等長期存在而沒有被釋放引起的。本文就來和大家總結(jié)一下常見的幾種情況以及解決方法吧2023-05-05
《JavaScript DOM 編程藝術(shù)》讀書筆記之JavaScript 圖片庫
這篇文章主要介紹了《JavaScript DOM 編程藝術(shù)》讀書筆記之JavaScript 圖片庫,需要的朋友可以參考下2015-01-01
javascript判斷數(shù)組內(nèi)是否重復(fù)的方法
這篇文章主要介紹了javascript判斷數(shù)組內(nèi)是否重復(fù)的方法,涉及javascript針對數(shù)組的相關(guān)操作技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
JavaScript基于DOM操作實現(xiàn)簡單的數(shù)學(xué)運算功能示例
這篇文章主要介紹了JavaScript基于DOM操作實現(xiàn)簡單的數(shù)學(xué)運算功能,涉及javascript節(jié)點操作、元素遍歷及數(shù)學(xué)運算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01

