科帮网

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 项目源码 > JAVA整合HTML5实现扫描二维码功能项目源码
总共48087条微博

动态微博

查看: 10698|回复: 39

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2016-07-09 15:09:55 |只看该作者 |倒序浏览
           最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。5 {: `& F3 Y2 G0 n9 o

    , ^# S/ b$ Y# R% X. ^, G2 C+ b& U, ^. E7 O# i3 E% u
    项目使用环境以及工具:) T! o' O2 a, p' t
    : d1 g4 \# G6 a9 b
    Eclipse,JDK1.7,struts2,HTML5,Jquery,QRCode+ h0 |0 X5 P  g" c
    HTML5技术支持WebApp在手机上拍照,显示在页面上并上传到服务器。这是手机微博应用中常见的功能,当然你也可以在其它类型应用中适当使用此技术。

    2 w) o( g; K4 f. u! S! ^        这个功能不但手机端可以实现PC端也可以很好的实现,这个应用接口技术就是getUserMedia API,它能让应用开发者访问用户的摄像头或内置相机。下面就让我展示一下如何通过浏览器来访问你的摄像头,并提取截屏图形。
    7 c$ T$ I8 e6 ?7 w: i, s
    : T- Y( J. S# f9 d一、视频流 # V5 x' [' k6 W5 h* Y$ Y' d

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

    2 M4 ]0 }* X4 \5 D" x) c* b
    % l. K7 L: Q8 q1 L$ F( o1 I
    二、拍照1 C& M. h3 B% B1 b# G5 K/ P

    # F) G9 R* ^3 `: b9 F拍照是采用HTML5的Canvas功能,实时捕获Video标签的内容,因为Video元素可以作为Canvas图像的输入,所以这一点很好实现。
    " R0 Y# ^5 {- a- n" q( {8 E6 ~
    . {$ [7 R6 W) L3 \: n
    三、 获取图片
    / F7 K2 `% [* S& z% Y) ?
    8 A: B: O" c$ d2 T8 I  从Canvas获取图片数据的核心思路是用canvas的toDataURL将Canvas的数据转换为base64位编码的PNG图像,类似于“data:image/png;base64,xxxxx”的格式。
    ' A% U5 L8 d0 R7 T6 _4 C- S) e' ]- a4 R* E
    var imgData=canvas.toDataURL(“image/png”);
    ) u: c2 L3 V" y# a( z) U. ~
    ) t$ G# _2 f- j& \9 a6 s% |这样,imgData变量就存储了一长串的字符数据内容,表示的就是一个PNG图像的base64编码。因为真正的图像数据是base64编码逗号之后的部分,所以要让实际服务器接收的图像数据应该是这部分,我们可以用两种办法来获取。6 l' H( }4 `7 @1 L7 m
      第一种:是在前端截取22位以后的字符串作为图像数据,例如:
    8 X6 C& k' v- y& L! R% y6 Z
    - q3 F. e' @8 H4 a) Y  ?var data=imgData.substr(22);
    5 D6 x4 ]+ F0 r$ z! `  q2 h, X: b+ a" {( z
      第二种:就是替换;前面的部分为"";

    4 G5 ?1 ?* l6 f5 {( b; n. u5 `( N0 z( V) A- G3 V. w4 Z! B
    var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");
    $ [8 y5 m, j& i, e/ d3 ^! `
    # Z. h) _1 Y- T' v反正不管如何实现,能获取到图片流即可、
    7 f1 k: Y# f! w$ e7 d

    6 C  P, U2 O% U$ p9 q' M( K四、上传图片并解析  q" ?+ J" o4 p  B5 A

    5 v7 U- a* I) X  j0 b使用 setInterval定时上传到项目后台使用开源QRCode.jar 解析图片获取二维码信息。
    8 Z3 ~! W/ G! p) _3 C# Z8 F
    5 x" j3 T& J! }! ?" t. m+ l/ r前台部分代码:

    ! E2 `. W, u9 B. Y" X& {, g
    1. <video  id="video">
      6 s  E9 x! D7 Q) S+ h
    2. <script>, h% M+ w) I% j* b0 @4 R
    3.     var flag = true;4 v4 C' j& F) q" ?# k6 s/ A
    4.     window.addEventListener("DOMContentLoaded", function () {/ p- q7 M8 N6 S* z, z" ?' H6 O3 i1 S  x
    5.         var video = document.getElementById("video"), canvas, context;0 A% }8 G! ^& G3 L( _# |
    6.         try {! m& y1 {5 p% i5 L/ _' e
    7.             canvas = document.createElement("canvas");
      5 R8 _0 a% M( T# A
    8.             canvas.width = 600;( W7 t" I8 p% p# [
    9.             canvas.height = 600;
      9 `9 z3 p' s; {! _# S/ U5 d
    10.             context = canvas.getContext("2d");
      3 n- q& g. x. [
    11.         } catch (e) { alert("not support canvas!"); return; }
      ( X6 Q- e% B1 W0 U
    12.         navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;4 h; L6 B8 ^2 V: K
    13. 9 q) }+ J+ m' f8 v) w4 |' ~1 I
    14.         if (navigator.getUserMedia)
      ; Z  b% x7 m/ z8 m
    15.             navigator.getUserMedia(
      7 t4 N; ?! T5 }1 M% r- u4 G
    16.                 { "video": true },
      2 A1 ^7 ~9 ?9 n
    17.                 function (stream) {+ ~$ G2 H! Q  s6 M+ g' ^
    18.                     if (video.mozSrcObject !== undefined)video.mozSrcObject = stream;& o& P, Z8 Y) C! k% L
    19.                     else video.src = ((window.URL || window.webkitURL || window.mozURL || window.msURL) && window.URL.createObjectURL(stream)) || stream;               3 a5 c/ k2 N3 t& h$ ^/ s
    20.                     video.play();
        `5 v/ d6 t  w' v: \$ a+ b
    21.                 },# M+ E! o& [( W9 n* T6 T/ z1 [! t( o
    22.                 function (error) {# E0 [6 s6 `, W
    23.                     alert("请检查是否开启摄像头");
      , e6 j6 ^8 n7 o" Q
    24.                     flag = false;  ~3 J% q( D; [' w$ i
    25.                 }* x. h/ y! P4 J! M; }: J
    26.             );
      / e9 ?; a1 y3 e' a9 v, p2 M# z: I
    27.         else alert("Native device media streaming (getUserMedia) not supported in this browser");0 M! t5 a/ T" \; s' P8 h
    28.        ' F/ T7 k! r! K6 `1 ^7 k
    29.         setInterval(function () {
      ! b: \; ~9 l* r* Z7 y3 [  c
    30.                 if(!flag){
      1 p9 ~: S, e; \* }; o
    31.                         return;
      6 a6 {1 b+ m8 y4 B
    32.                 }
      * R5 `6 M) J4 O4 |  _4 m! R
    33.             context.drawImage(video, 0, 0, canvas.width = video.videoWidth, canvas.height = video.videoHeight);' c. I: G/ Z# G7 O! ~, N
    34.                     var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", ""); 3 ?4 r) ]9 z! d- C- E: I
    35.             $.ajax({
      $ v! v8 ]# h, y$ ^9 E" m/ H& Q
    36.                                 url : 'qRCodeAction_decoderQRCode.action',
      9 r9 B- M- L5 S
    37.                                 async : false,
      & Y( c! i  i" i1 w" h; T
    38.                                 type : 'post',
      & n! k9 Z# c6 ~" w2 p" y
    39.                                 data : {* V. h0 h2 d6 u3 d( }
    40.                                         'time' : (new Date()).toString(),
      ( C" ]/ X) r9 c3 ]% V
    41.                                         'img' : image
      ' l" w; P! z) ]4 ?% T8 W
    42.                                 },
      . Z4 X- {" b+ O# h: u' l
    43.                                 success : function(result) {/ E- t+ J( Q+ B+ _# d
    44.                                           
      ' g+ p: H1 g5 S7 ]* @! W0 Y5 c
    45.                                 },3 w: `, s2 B/ f) `" G$ T7 s
    46.                     });
      1 B. Z1 T0 i0 z# y
    47.         }, 5000);
      7 p6 R$ v" L! z; M
    48.     }, false);- B5 ]7 `! b" M* M! f8 p
    49. </script>
    复制代码
    1 m  G) _+ i+ P5 S8 p6 h' D* Q
    后台部分代码:
    * ]/ C) M# _+ T2 w( X/ c# s
    1. /**
      ' M1 E2 ^! P7 T5 c6 F
    2.          * 解析二维码
      0 l0 j& E# F: ?) ]) o
    3.          * @Author        张志朋  i2 ~  }  ~: e6 i- X
    4.          * @return  String
      ' k0 L7 U: F/ ]1 e
    5.          * @Date        2016年7月9日
      9 ~. t/ e5 O5 q4 H  u, V
    6.          * 更新日志
      6 S; M! z0 X7 S4 G' z4 E. \6 T" l
    7.          * 2016年7月9日 张志朋  首次创建% M1 ]4 ?6 X( F0 ]
    8.          *% G+ s: d% a# d9 W8 O/ K
    9.          */: N! d- c) p+ s3 j/ A+ Y" j8 H% u0 _
    10.         public String decoderQRCode(){& D! a/ n6 f, Q8 ~3 c* l; D
    11.                 try {2 t6 `' u4 X8 B" y/ M' Z0 y2 Y
    12.                         String realpath = ServletActionContext.getServletContext().getRealPath("/file");1 T* `: W/ y( ]: C. N7 @4 Y
    13.                         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");. s- j- z1 S/ e) `- ?. l' A
    14.                         String imgName = sdf.format(new Date()) + ".png";  a: q  `3 m4 _% M* ^" D
    15.                         String filePath = realpath+Constants.SF_FILE_SEPARATOR+imgName;
      $ e6 F2 l  n2 F- d
    16.                         OutputStream out = new FileOutputStream(filePath);
      5 q3 Q$ T& `; W  C
    17.                         QRCode.GenerateImage(img,out);//生成图片2 v. f8 z6 V7 m3 {* g
    18.                         message   = QRCode.decoderQRCode(filePath);
      6 y- u( i. G9 h5 W* a! t/ v
    19.                 } catch (Exception e) {
      6 l' [: S5 f% O
    20.                         e.printStackTrace();
      0 o: R1 o9 l/ \( _& C3 j, @
    21.                 }7 g% W- ~2 ~7 j. V
    22.                 return Action.SUCCESS;2 g5 V7 f5 r' z% S& k2 }6 m) O6 i, V
    23.         }
    复制代码
      P8 C2 I/ S* m* u

    1 P7 l4 E- m9 t. z0 m4 Q: m# F调用电脑拍摄一定要允许操作。
    现在只需要HTML5的画布技术和javaScript,我们就能简单快速的操作用户的摄像头。手机不仅可以调用摄像头扫描,PC不仅仅能访问摄像头,而且利用HTML5强大的画布技术,我们可以给图片上加入各种迷人的滤镜效果。现在,在浏览器里用自己的摄像头给自己拍张照片吧!6 G3 x/ o2 I$ ~" t5 D

    ) G& G" n& ?" {4 z% d9 e3 I
    # w* c, \5 A( ]$ P' i& p, g* J! ~  h
      `5 [. p& W6 d( D2 F& x% X( {
    ' e" e+ C+ \( l
    7 B6 h: ~( ?7 G; E# i
    有些手机可能无法调出摄像头,那就赶紧换手机吧,别out了。
    6 Z- N) Y9 c, }0 h/ {$ c" w# w* g% }5 T
    # c; F) ^4 k1 X( _! d
    附上演示地址:http://monitor.52itstyle.com/9 J6 t8 j3 g! ^- X) b4 F3 d6 f
    . a0 X. e5 w/ F
    项目源码下载地址! F1 b. I( P) x; o' J. S" V- I+ [

    % L' u8 U, z; F- s
    * M) q$ I% {0 b" |提取码:5 @! N$ p' ]/ N$ `
    游客,如果您要查看本帖隐藏内容请回复
    6 w! \  R! g0 ^% l/ a

    ; Y" ^* _& `) o" u5 ~# Y. j
    ' h. V6 ^. j( B. e$ n- o( P- }  y( S! ]0 d! @8 A: r! K

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    3

    主题

    1

    听众

    119

    金钱

    三袋弟子

    该用户从未签到

    沙发
    发表于 2016-07-09 16:11:12 |只看该作者
    七总威武啊
    回复

    使用道具 举报

    5

    主题

    1

    听众

    54

    金钱

    二袋弟子

    该用户从未签到

    板凳
    发表于 2016-07-09 17:37:08 |只看该作者
    查看该项目的提取码
    回复

    使用道具 举报

    1

    主题

    0

    听众

    88

    金钱

    三袋弟子

    该用户从未签到

    地板
    发表于 2016-07-11 15:29:00 |只看该作者
    查看该项目的提取码
    回复

    使用道具 举报

    1

    主题

    0

    听众

    54

    金钱

    二袋弟子

    该用户从未签到

    5#
    发表于 2016-07-15 16:29:31 |只看该作者
    提取码啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
    回复

    使用道具 举报

    8

    主题

    0

    听众

    82

    金钱

    三袋弟子

    该用户从未签到

    6#
    发表于 2016-07-26 22:07:21 |只看该作者
    好! 谢谢
    回复

    使用道具 举报

    8

    主题

    0

    听众

    82

    金钱

    三袋弟子

    该用户从未签到

    7#
    发表于 2016-07-26 22:07:40 |只看该作者
    好! 谢谢
    回复

    使用道具 举报

    3

    主题

    0

    听众

    120

    金钱

    三袋弟子

    该用户从未签到

    8#
    发表于 2016-07-27 09:34:22 |只看该作者
    很久没有和html5一起用了,看看啊
    回复

    使用道具 举报

    2

    主题

    0

    听众

    79

    金钱

    三袋弟子

    该用户从未签到

    9#
    发表于 2016-08-14 23:18:40 |只看该作者
    一直好奇这个,下下来看看
    回复

    使用道具 举报

    2

    主题

    0

    听众

    112

    金钱

    三袋弟子

    该用户从未签到

    10#
    发表于 2016-08-27 14:38:12 |只看该作者
    学习一下 感谢分享
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表