文档章节

JAVA整合HTML5实现扫描二维码功能项目源码

小柒2012
 小柒2012
发布于 2016/07/09 19:33
字数 969
阅读 1112
收藏 13

 最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。


项目使用环境以及工具:

Eclipse,JDK1.7,struts2,HTML5,Jquery,QRCode

HTML5技术支持WebApp在手机上拍照,显示在页面上并上传到服务器。这是手机微博应用中常见的功能,当然你也可以在其它类型应用中适当使用此技术。


        这个功能不但手机端可以实现PC端也可以很好的实现,这个应用接口技术就是getUserMedia API,它能让应用开发者访问用户的摄像头或内置相机。下面就让我展示一下如何通过浏览器来访问你的摄像头,并提取截屏图形。

一、视频流 

      HTML5 的 The Media Capture(媒体捕捉) API 提供了对摄像头的可编程访问,用户可以直接用 getUserMedia (请注意目前仅Chrome和Opera支持)获得摄像头提供的视频流。我们需要做的是添加一个HTML5 的 Video 标签,并将从摄像头获得的视频作为这个标签的输入来源。

二、拍照

拍照是采用HTML5的Canvas功能,实时捕获Video标签的内容,因为Video元素可以作为Canvas图像的输入,所以这一点很好实现。

三、 获取图片

  从Canvas获取图片数据的核心思路是用canvas的toDataURL将Canvas的数据转换为base64位编码的PNG图像,类似于“data:image/png;base64,xxxxx”的格式。

var imgData=canvas.toDataURL(“image/png”);

这样,imgData变量就存储了一长串的字符数据内容,表示的就是一个PNG图像的base64编码。因为真正的图像数据是base64编码逗号之后的部分,所以要让实际服务器接收的图像数据应该是这部分,我们可以用两种办法来获取。
  第一种:是在前端截取22位以后的字符串作为图像数据,例如:

var data=imgData.substr(22);

  第二种:就是替换;前面的部分为"";

var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");

反正不管如何实现,能获取到图片流即可、

四、上传图片并解析

使用 setInterval定时上传到项目后台使用开源QRCode.jar 解析图片获取二维码信息。

前台部分代码:

  1. <video  id="video">
  2. <script>
  3.     var flag = true;
  4.     window.addEventListener("DOMContentLoaded", function () {
  5.         var video = document.getElementById("video"), canvas, context;
  6.         try {
  7.             canvas = document.createElement("canvas");
  8.             canvas.width = 600;
  9.             canvas.height = 600;
  10.             context = canvas.getContext("2d");
  11.         } catch (e) { alert("not support canvas!"); return; }
  12.         navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
  13.  
  14.         if (navigator.getUserMedia)
  15.             navigator.getUserMedia(
  16.                 { "video": true },
  17.                 function (stream) {
  18.                     if (video.mozSrcObject !== undefined)video.mozSrcObject = stream;
  19.                     else video.src = ((window.URL || window.webkitURL || window.mozURL || window.msURL) && window.URL.createObjectURL(stream)) || stream;               
  20.                     video.play();
  21.                 },
  22.                 function (error) {
  23.                     alert("请检查是否开启摄像头");
  24.                     flag = false;
  25.                 }
  26.             );
  27.         else alert("Native device media streaming (getUserMedia) not supported in this browser");
  28.        
  29.         setInterval(function () {
  30.                 if(!flag){
  31.                         return;
  32.                 }
  33.             context.drawImage(video, 0, 0, canvas.width = video.videoWidth, canvas.height = video.videoHeight);
  34.                     var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", ""); 
  35.             $.ajax({
  36.                                 url : 'qRCodeAction_decoderQRCode.action',
  37.                                 async : false,
  38.                                 type : 'post',
  39.                                 data : {
  40.                                         'time' : (new Date()).toString(),
  41.                                         'img' : image
  42.                                 },
  43.                                 success : function(result) {
  44.                                           
  45.                                 },
  46.                     });
  47.         }, 5000);
  48.     }, false);
  49. </script>

复制代码


后台部分代码:

  1. /**
  2.          * 解析二维码
  3.          */
  4.         public String decoderQRCode(){
  5.                 try {
  6.                         String realpath = ServletActionContext.getServletContext().getRealPath("/file");
  7.                         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  8.                         String imgName = sdf.format(new Date()) + ".png";
  9.                         String filePath = realpath+Constants.SF_FILE_SEPARATOR+imgName;
  10.                         OutputStream out = new FileOutputStream(filePath);
  11.                         QRCode.GenerateImage(img,out);//生成图片
  12.                         message   = QRCode.decoderQRCode(filePath);
  13.                 } catch (Exception e) {
  14.                         e.printStackTrace();
  15.                 }
  16.                 return Action.SUCCESS;
  17.         }

复制代码



调用电脑拍摄一定要允许操作。现在只需要HTML5的画布技术和javaScript,我们就能简单快速的操作用户的摄像头。手机不仅可以调用摄像头扫描,PC不仅仅能访问摄像头,而且利用HTML5强大的画布技术,我们可以给图片上加入各种迷人的滤镜效果。现在,在浏览器里用自己的摄像头给自己拍张照片吧!

 


 
有些手机可能无法调出摄像头,那就赶紧换手机吧,别out了。

附上演示地址:http://monitor.52itstyle.com/

© 著作权归作者所有

共有 人打赏支持
小柒2012
粉丝 116
博文 27
码字总数 28778
作品 0
青岛
程序员
加载中

评论(4)

杨小小玉
有完整案例代码吗?
zigzagroad
zigzagroad

引用来自“IT媛”的评论

引用来自“zigzagroad”的评论

还不错。建议最后加上finally块,在其中删除产生的临时图片文件
哈哈 就是为了 保存这些图片 你懂得21

原来如此
小柒2012
小柒2012

引用来自“zigzagroad”的评论

还不错。建议最后加上finally块,在其中删除产生的临时图片文件
哈哈 就是为了 保存这些图片 你懂得21
zigzagroad
zigzagroad
还不错。建议最后加上finally块,在其中删除产生的临时图片文件
【培训】JAVA微信插件开发培训:本周三(10月28日)腾讯课堂开讲

关于微信插件 微信插件活动如何开发??? 有粉丝的地方就有活动。社交媒体风行后,品牌活动大规模转移到微信上来,真实的社交关系链,对于微信营销活动来说是最好的人气资源,”大转盘”、“...

Jeecg
2015/10/28
0
0
基于HTML5技术的电力3D监控应用(二)

上篇介绍了我们电力项目的基本情况,我们选用HTML5技术还是顶着很大压力,毕竟HTML5技术性能行不行,浏览器兼容性会不会有问题,这些在项目选型阶段还是充满疑惑,项目做到现在终于快收尾了我...

xhload3d
2013/12/15
0
1
Google的Native Client微笑着抽了HTML5一记漂亮的耳光

日前,Google在加州总部的一次会议上首次公开演示了Native Client项目(简称“NaCl”),Google已经花了三年多时间研发此项目并表示未来的浏览器中将整合该技术,同时宣布Native Client即将起...

晨曦之光
2012/03/09
0
0
WebView!!!!日记~~

● Android设备多分辨率的问题 Android浏览器默认预览模式浏览 会缩小页面 WebView中则会以原始大小显示 Android浏览器和WebView默认为mdpi。hdpi相当于mdpi的1.5倍 ldpi相当于0.75倍 三种解...

Neo_
2012/11/01
0
0
HTML5从入门到精通,零基础学员必看

学习html5从入门到精通,零基础新手也能看懂,无论你是唱歌,画画的艺术生,还是学习机械专业的工科生,或者大学读的文学学科。先了解HTML5可以实现的功能有哪儿些? 1. HTML5可以同时在多种...

课工场CC老师
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 公司女同事约我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享水木年华的单曲《蝴蝶花(2002年大提琴版)》 《蝴蝶花(2002年大提琴版)》- 水木年华 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
10分钟前
28
7
Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
5
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
3
0
docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
今天
4
1
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部