AVA整合HTML5实现扫描二维码功能项目源码-阿里云开发者社区

开发者社区> 小柒2012> 正文

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

简介: 最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。项目使用环境以及工具:Eclipse,JDK1.7,struts2,HTML5,Jquery,QRCode 引用 HTML5技术支持WebApp在手机上拍照,显示在页面上并上传到服务器。这是手机微博应用中常见的功能,当然你也可以在其它类型应用中适当使用此技术。 这个功
+关注继续查看
最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓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 解析图片获取二维码信息。

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

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


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





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

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


CSDN 下载地址:http://download.csdn.net/detail/zhulin2012/9571624

百度云下载地址:http://pan.baidu.com/s/1slaNMnr

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
01_spring_ 简介| 学习笔记
快速学习01_spring_ 简介
10 0
Django框架介绍与安装
软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品, 框架的功能类似于基础设施,提供并实现最为基础的软件架构和体系 通常情况下我们依据框架来实现更为复杂的业务程序开发 二个字,框架就是程序的骨架
5 0
学习vue3之路day1
学习vue3之路day1
18 0
学习vue3之路day2
学习vue3之路day2
6 0
xshell+阿里云linux+vue+mysql开发练习
这篇文章记录了我在阿里云进行Linux基础学习的过程,以及根据阿里云进行一些简单的开发实践。
9 0
Java 简介(Java 发展概述)|学习笔记
快速学习 Java 简介(Java 发展概述)
6 0
jquery获取多个相同name的input的value值
jquery获取多个相同name的input的value值
10 0
飞天加速计划·高校学生在家实践
我用阿里云服务器的一些心得
18 0
学习vue3之路day3
学习vue3之路day3
6 0
+关注
小柒2012
一个程序员,欢迎骚扰!!!
153
文章
2331
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载