经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
JS调用安卓手机摄像头扫描二维码
来源:jb51  时间:2018/10/17 8:45:26  对本文有异议

项目要求:

使用H5模仿微信扫一扫付款功能

经过一系列的查找最后发现可以使用 JS调用手机摄像头然后用画布把当前摄像头的数据转成Base64的png图片,经过QrCode直接再本地识别。

优点:

兼容大多数浏览器

本地识别不占用服务端资源

代码比较简单只有一个页面

  1. <html lang="ZH-CN">
  2. <head>
  3. <meta charset="utf-8">
  4. <title>Web QrCode Test</title>
  5. <script type="text/javascript" src="jquery-1.8.3.min.js"></script>
  6. <script type="text/javascript" src="jsqrcode/src/grid.js"></script>
  7. <script type="text/javascript" src="jsqrcode/src/version.js"></script>
  8. <script type="text/javascript" src="jsqrcode/src/detector.js"></script>
  9. <script type="text/javascript" src="jsqrcode/src/formatinf.js"></script>
  10. <script type="text/javascript" src="jsqrcode/src/errorlevel.js"></script>
  11. <script type="text/javascript" src="jsqrcode/src/bitmat.js"></script>
  12. <script type="text/javascript" src="jsqrcode/src/datablock.js"></script>
  13. <script type="text/javascript" src="jsqrcode/src/bmparser.js"></script>
  14. <script type="text/javascript" src="jsqrcode/src/datamask.js"></script>
  15. <script type="text/javascript" src="jsqrcode/src/rsdecoder.js"></script>
  16. <script type="text/javascript" src="jsqrcode/src/gf256poly.js"></script>
  17. <script type="text/javascript" src="jsqrcode/src/gf256.js"></script>
  18. <script type="text/javascript" src="jsqrcode/src/decoder.js"></script>
  19. <script type="text/javascript" src="jsqrcode/src/qrcode.js"></script>
  20. <script type="text/javascript" src="jsqrcode/src/findpat.js"></script>
  21. <script type="text/javascript" src="jsqrcode/src/alignpat.js"></script>
  22. <script type="text/javascript" src="jsqrcode/src/databr.js"></script>
  23. </head>
  24. <body>
  25. <div class="booth">
  26. <video id="video" width="400" height="400"></video>
  27. <canvas id='canvas' width='400' height='400'></canvas>
  28. <img id='img' src=''>
  29. </div>
  30. <div id="mmm"></div>
  31. <canvas id="qr-canvas" width="640" height="480"></canvas>
  32. <script>
  33. //初始化媒体对象
  34. var c=0;
  35. var video = document.getElementById('video'),
  36. canvas = document.getElementById('canvas'),
  37. img = document.getElementById('img'),
  38. vendorUrl = window.URL || window.webkitURL;
  39. //媒体对象
  40. navigator.getMedia = navigator.getUserMedia ||
  41. navagator.webkitGetUserMedia ||
  42. navigator.mozGetUserMedia ||
  43. navigator.msGetUserMedia;
  44. navigator.getMedia({
  45. video: true, //使用摄像头对象
  46. audio: false //不适用音频
  47. }, function(strem){
  48. console.log(strem);
  49. video.src = vendorUrl.createObjectURL(strem);
  50. video.play();
  51. }, function(error) {
  52. //error.code
  53. console.log(error);
  54. });
  55. //启动定时器
  56. setTimeout("actionP(null)","1000");
  57. //定时器
  58. function actionP(data){
  59. if(data==null){
  60. Screenshot()
  61. }else{
  62. if(data!=null & data!="error decoding QR Code"){//识别出数据
  63. if(data.indexOf("http")!=-1){
  64. window.location.href=data;
  65. }else alert(data);
  66. }else{//没有数据循环十次
  67. c++;
  68. if(c<10){
  69. setTimeout("actionP(null)","1000");
  70. }
  71. }
  72. }
  73. }
  74. function Screenshot(){//截取图像
  75. canvas.getContext('2d').drawImage(video, 0, 0, 400, 400);
  76. var imgData = canvas.toDataURL("image/png");
  77. load(imgData);
  78. img.src=imgData;
  79. }
  80. ////////////////////////////////////////识别二维码////////////////////////////////////////////
  81. function dragenter(e) {
  82. e.stopPropagation();
  83. e.preventDefault();
  84. }
  85. function dragover(e) {
  86. e.stopPropagation();
  87. e.preventDefault();
  88. }
  89. function drop(e) {
  90. e.stopPropagation();
  91. e.preventDefault();
  92. var dt = e.dataTransfer;
  93. var files = dt.files;
  94. }
  95. function load(name)
  96. {
  97. initCanvas(640,480);
  98. //识别二维码并回调方法
  99. qrcode.callback = actionP;
  100. qrcode.decode(name);
  101. }
  102. function initCanvas(ww,hh)//创建画板
  103. {
  104. gCanvas = document.getElementById("qr-canvas");
  105. gCanvas.addEventListener("dragenter", dragenter, false);
  106. gCanvas.addEventListener("dragover", dragover, false);
  107. gCanvas.addEventListener("drop", drop, false);
  108. var w = ww;
  109. var h = hh;
  110. gCanvas.style.width = w + "px";
  111. gCanvas.style.height = h + "px";
  112. gCanvas.width = w;
  113. gCanvas.height = h;
  114. gCtx = gCanvas.getContext("2d");
  115. gCtx.clearRect(0, 0, w, h);
  116. imageData = gCtx.getImageData( 0,0,320,240);
  117. }
  118. </script>
  119. </body>
  120. </html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号