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调用代码

最终效果:


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

源码打包下载


浏览器支持情况

### 如何安装 Maven #### 1. 下载 Maven 访问 Apache 官方网站下载最新版本的 Maven。可以选择适合操作系统的二进制压缩包进行下载[^2]。 #### 2. 解压并设置安装路径 将下载好的压缩包解压至指定目录,例如 `E:\Maven\apache-maven-3.2.5`[^4]。此目录将成为 Maven安装根目录。 #### 3. 配置环境变量 为了能够在任意位置运行 Maven 命令,需配置系统环境变量: - 打开系统属性 -> 环境变量。 - 在 `Path` 中添加 Maven 的 `bin` 路径,例如:`E:\Maven\apache-maven-3.2.5\bin`。 #### 4. 验证安装是否成功 打开命令提示符窗口,输入以下命令验证安装情况: ```bash mvn -v ``` 如果返回的信息中包含了 JDK 版本、OS 名称以及 Maven 版本,则表示安装成功。 #### 5. 配置本地仓库 默认情况下,Maven 使用 `${user.home}/.m2/repository` 作为本地仓库地址。可以通过修改 `settings.xml` 文件中的 `<localRepository>` 属性来更改该路径[^3]。 #### 6. IDEA 中配置 Maven 对于使用 IntelliJ IDEA 开发工具的用户,可以进入 **File | Settings | Build, Execution, Deployment | Build Tools | Maven** 进行相关配置,包括指定 Maven 主目录和自定义设置文件的位置。 #### 7. Java 编译器版本配置 编辑 `conf/settings.xml` 或者项目的 `pom.xml` 文件,在其中加入如下片段以适配特定版本的 JDK: ```xml <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> ``` 上述 XML 结构用于激活对应版本的编译选项[^5]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值