web/html5调用摄像头实现二维码扫描

web/html5调用摄像头实现二维码扫描



  1. <!DOCTYPE html>  
  2. <html><head>  
  3.     <title>HTML5 code Reader</title>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  5. </head>  
  6. <style type="text/css">  
  7.  html, body { height: 100%; width: 100%; text-align:center; }    
  8. </style>  
  9. <script src="jquery-1.9.1.js"></script>  
  10. <script>  
  11. //这段代 主要是获取摄像头的视频流并显示在Video 签中    
  12. var canvas=null,context=null,video=null;     
  13. window.addEventListener("DOMContentLoaded", function ()  
  14. {  
  15.     try{  
  16.         canvas = document.getElementById("canvas");  
  17.         context = canvas.getContext("2d");  
  18.         video = document.getElementById("video");  
  19.           
  20.         var videoObj = { "video": true,audio:false},  
  21.         flag=true,  
  22.         MediaErr = function (error)  
  23.         {             
  24.             flag=false;    
  25.             if (error.PERMISSION_DENIED)  
  26.             {  
  27.                  alert('用户拒绝了浏览器请求媒体的权限', '提示');  
  28.             } else if (error.NOT_SUPPORTED_ERROR) {  
  29.                  alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');  
  30.             } else if (error.MANDATORY_UNSATISFIED_ERROR) {  
  31.                  alert('指定的媒体类型未接收到媒体流', '提示');  
  32.             } else {  
  33.                  alert('系统未能获取到摄像头,请确保摄像头已正确安装。或尝试刷新页面,重试', '提示');  
  34.             }  
  35.         };  
  36.         //获取媒体的兼容代码,目前只支持(Firefox,Chrome,Opera)  
  37.         if (navigator.getUserMedia)  
  38.         {  
  39.             //qq浏览器不支持  
  40.             if (navigator.userAgent.indexOf('MQQBrowser') > -1) {  
  41.                  alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');  
  42.                  return false;  
  43.             }  
  44.             navigator.getUserMedia(videoObj, function (stream) {  
  45.                 video.src = stream;                  
  46.                 video.play();        
  47.             }, MediaErr);             
  48.         }  
  49.         else if(navigator.webkitGetUserMedia)  
  50.         {  
  51.            navigator.webkitGetUserMedia(videoObj, function (stream)  
  52.            {            
  53.              video.src = window.webkitURL.createObjectURL(stream);             
  54.              video.play();             
  55.             }, MediaErr);             
  56.         }  
  57.         else if (navigator.mozGetUserMedia)  
  58.         {  
  59.             navigator.mozGetUserMedia(videoObj, function (stream) {  
  60.                  video.src = window.URL.createObjectURL(stream);  
  61.                  video.play();  
  62.             }, MediaErr);  
  63.         }  
  64.         else if (navigator.msGetUserMedia)  
  65.         {   
  66.              navigator.msGetUserMedia(videoObj, function (stream) {  
  67.                 $(document).scrollTop($(window).height());  
  68.                 video.src = window.URL.createObjectURL(stream);  
  69.                 video.play();  
  70.              }, MediaErr);  
  71.         }else{  
  72.             alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器');  
  73.             return false;  
  74.         }  
  75.         if(flag){  
  76.             alert('为了获得更准确的测试结果,请尽量将二维码置于框中,然后进行拍摄、扫描。 请确保浏览器有权限使用摄像功能');  
  77.         }  
  78.          //这个是拍照按钮的事件,            
  79.         $("#snap").click(function () {startPat();}).show();  
  80.     }catch(e){        
  81.         printHtml("浏览器不支持HTML5 CANVAS");         
  82.     }   
  83. }, false);  
  84.       
  85. //打印内容到页面        
  86. function printHtml(content){  
  87.     $(window.document.body).append(content+"<br/>");  
  88. }  
  89. //开始拍照  
  90. function startPat(){  
  91.     setTimeout(function(){//防止调用过快  
  92.         if(context)  
  93.         {  
  94.             context.drawImage(video, 0, 0, 320, 320);       
  95.             CatchCode();   
  96.         }  
  97.     },200);  
  98. }   
  99. //抓屏获取图像流,并上传到服务器        
  100. function CatchCode() {          
  101.     if(canvas!=null)  
  102.     {    
  103.         //以下开始编 数据     
  104.         var imgData = canvas.toDataURL();   
  105.         //将图像转换为base64数据  
  106.         var base64Data = imgData;//.substr(22); //在前端截取22位之后的字符串作为图像数据  
  107.         //开始异步上  
  108.        $.post("saveimg.php", { "img": base64Data },function (result)  
  109.        {     
  110.             printHtml("解析结果:"+result.data);  
  111.             if (result.status == "success" && result.data!="")  
  112.             {                   
  113.                 printHtml("解析结果成功!");  
  114.             }else{    
  115.                 startPat();//如果没有解析出来则重新抓拍解析         
  116.             }  
  117.        },"json");  
  118.     }  
  119. }        
  120. </script>  
  121.   <body>  
  122.   
  123. <div id="support"></div>  
  124. <div id="contentHolder">         
  125. <video id="video" width="320" height="320" autoplay>  
  126. </video>         
  127. <canvas style="display:none; background-color:#F00;" id="canvas" width="320" height="320">  
  128. </canvas> <br/>  
  129. <button id="snap" style="display:none; height:50px; width:120px;">开始扫描</button>    
  130.    </div>  
  131.   
  132.   
  133.   
  134. </body></html>  

PHP(saveimg)

  1. <?php  
  2. include_once("utils.php");  
  3. $base64_image_content=$_POST['img'];  
  4. if (preg_match('/^(data:\s*image\/(\w+);base64,)/'$base64_image_content$result))  
  5. {  
  6.   $type = $result[2];  
  7.   $new_file = "./2.{$type}";  
  8.   if (file_put_contents($new_filebase64_decode(str_replace($result[1], ''$base64_image_content)))){  
  9.     $code=utils::deCodeBitMap("2.png","192.168.46.123",20147);  
  10.     echo '{"status":"success","data":"'.trim($code).'"}';  
  11.   }else{  
  12.     echo '{"status":"write error","data":"NO"}';  
  13.   }  
  14. }else{  
  15.     echo '{"status":"preg error","data":"NO"}';  
  16. }  
  17. ?>  

php(utils)

  1. class  utils{  
  2.       
  3. /** 
  4.         * @access static 
  5.         * @param  $imagepath String 图片的完整路径 
  6. * @param  $host      String 主机如:127.0.0.1 
  7. * @param  $port      String 端口号如:20147 
  8.         * @return string 解析出的URL 
  9.     */  
  10. static function deCodeBitMap($imagepath,$host,$port){  
  11.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die($imagepath." Could not connet server create\n"); // 创建一个Socket  
  12.     if(!$socket){  
  13.         return "";  
  14.     }  
  15.     $connection = socket_connect($socket$host$portor die($imagepath." Could not connet server connection\n");    //  连接  
  16.     if(!$connection){  
  17.         return "";  
  18.     }  
  19.     socket_write($socket$imagepathor die("Write failed\n"); // 数据传送 向服务器发送消息  
  20.   
  21.     $buff = socket_read($socket, 1024, PHP_NORMAL_READ);  
  22.     return $buff;  
  23. }  
  24.   
  25. }  
java扩展使用说明

该解析过程需要Java环境支持,jar包启动后在本机的20147端口接受socket监听,因此网络编程语言都可以调用。
1 命令行启动jar包
java -jar xxxxx.jar
启动成功应该能看到20147端口的应用
2服务socket调用
暂提供php调用代码

最终效果:


程序已打包:在我的资源里面,可自行下载!

源码打包下载


浏览器支持情况

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值