TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。; d& Q1 `* g' V/ C7 j3 `: R8 h4 D
" ]" x) R+ i6 A' B* U% R
3 g: i, U% M: u! J0 n# O
项目使用环境以及工具:- @2 y0 F2 b. L9 ]. `$ t: b
: [( b. D+ f* z5 p$ K8 p1 ZEclipse,JDK1.7,struts2,HTML5,Jquery,QRCode1 Q/ g$ h; t. W" v. P
HTML5技术支持WebApp在手机上拍照,显示在页面上并上传到服务器。这是手机微博应用中常见的功能,当然你也可以在其它类型应用中适当使用此技术。 5 ]* l+ }+ t0 z
这个功能不但手机端可以实现PC端也可以很好的实现,这个应用接口技术就是getUserMedia API,它能让应用开发者访问用户的摄像头或内置相机。下面就让我展示一下如何通过浏览器来访问你的摄像头,并提取截屏图形。& ^! R' [+ Q9 g& s6 V; z" w
8 g& R6 Y w0 T: ]% m
一、视频流
- W7 D) F1 ?$ I: A( d8 w3 j- ^2 K( |9 o4 J, E; m8 H& e5 v2 x
HTML5 的 The Media Capture(媒体捕捉) API 提供了对摄像头的可编程访问,用户可以直接用 getUserMedia (请注意目前仅Chrome和Opera支持)获得摄像头提供的视频流。我们需要做的是添加一个HTML5 的 Video 标签,并将从摄像头获得的视频作为这个标签的输入来源。% w! \' M8 u! t& J8 m( i7 Q
" N# R, a8 `& e二、拍照
6 t' P9 z# W1 b! i, X7 \8 Y* u, O- [) n' y' [
拍照是采用HTML5的Canvas功能,实时捕获Video标签的内容,因为Video元素可以作为Canvas图像的输入,所以这一点很好实现。6 Q2 q9 Y1 r& |7 `4 ?
+ F) @; U8 q# C7 S" @
三、 获取图片
# C( M. D7 J- k+ t5 y8 F* G& h# K
. B: ~0 J. i9 p7 J( R5 {! e0 U: [ 从Canvas获取图片数据的核心思路是用canvas的toDataURL将Canvas的数据转换为base64位编码的PNG图像,类似于“data:image/png;base64,xxxxx”的格式。2 i' ?, X* [% r# T1 g4 N
* \1 a8 ?4 @1 H5 evar imgData=canvas.toDataURL(“image/png”);
0 ]$ u; A) F- p' C2 c6 |
+ J! f# u8 U. _5 W* Y- S1 g这样,imgData变量就存储了一长串的字符数据内容,表示的就是一个PNG图像的base64编码。因为真正的图像数据是base64编码逗号之后的部分,所以要让实际服务器接收的图像数据应该是这部分,我们可以用两种办法来获取。
- T0 F# n, a2 A+ {, X% n 第一种:是在前端截取22位以后的字符串作为图像数据,例如:. V1 ?+ `# y8 k4 E( C7 _ [
* m, l9 k4 f# m) ]+ `' `8 O! xvar data=imgData.substr(22);- }& Q) [9 g* m# ] v
4 @) K- \+ h n9 x3 d 第二种:就是替换;前面的部分为"";$ q0 W; Q0 P9 t
* o7 n' r) G7 P2 J3 c" R5 s
var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");
& _5 Q: U0 Y: L7 U% B/ y, i# S$ J# \) Q- {: n2 _2 `
反正不管如何实现,能获取到图片流即可、
+ g6 u( S& c! l+ |8 g
2 f6 d" v6 F4 `( C. z. r四、上传图片并解析
. s0 P. G2 C B" S+ E. d* E% d; [# j8 \+ \
使用 setInterval定时上传到项目后台使用开源QRCode.jar 解析图片获取二维码信息。
' y0 j a, C( i8 x' N9 r+ n/ f
0 A: r7 ^/ Z9 T' Y7 n前台部分代码:
/ }( H; _( W5 S5 B/ k; E- <video id="video">& E. Q0 l( M6 I6 g! N! J: D
- <script>% i: c2 q' \4 c
- var flag = true;
4 T) Z; W$ t! I: I7 _6 Q3 R - window.addEventListener("DOMContentLoaded", function () {5 O; E, e4 S n2 c
- var video = document.getElementById("video"), canvas, context;! E& P- [# l b! B. m5 `
- try {
9 v# L+ [! u8 }8 |, C% x - canvas = document.createElement("canvas");
( U8 J2 X: t! v _2 V5 F2 R- P - canvas.width = 600;
3 }" a: U& T5 l. w; u - canvas.height = 600;: q3 y6 T7 {7 h: Q
- context = canvas.getContext("2d");4 Q; ]5 L- z, R$ `
- } catch (e) { alert("not support canvas!"); return; }, P2 {+ d& ^$ |8 \2 \) s6 P) e
- navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
: K' X5 F. }9 V! w# B* I' [ - , e1 R( e. V* e* t. \
- if (navigator.getUserMedia)) z' F8 d/ X( ]6 ]$ U: h
- navigator.getUserMedia(
7 S! J, ~* l4 y5 r4 r4 Y- R - { "video": true },. O# t& w- P3 I3 w$ G
- function (stream) {
( `. }" S! I+ J* S& p8 v1 q - if (video.mozSrcObject !== undefined)video.mozSrcObject = stream; l6 s z" x7 d9 ?% h' @: u
- else video.src = ((window.URL || window.webkitURL || window.mozURL || window.msURL) && window.URL.createObjectURL(stream)) || stream;
0 v+ j/ k, O& M2 Q N - video.play();
v' s: R6 [8 T; Q3 R" h - },
5 L- B* C8 U. \7 ^3 l" q% E; B - function (error) {
- @" y! Y; R0 F/ y! v - alert("请检查是否开启摄像头");
) F# o( A1 G: B. h' Z9 ~+ | - flag = false;
3 v3 k! I, O: Y% T( ^7 F - }2 K* Z+ B; } K, i
- );# L, G; K8 v& r9 V0 ]% }
- else alert("Native device media streaming (getUserMedia) not supported in this browser");6 A- R4 a' B( k b/ a3 w4 J% f
- " q; k& v y: P. Q
- setInterval(function () {
) Q: O$ C$ F( X% C0 W) h - if(!flag){7 ~9 k) n8 A; F _1 G7 g
- return;" G2 R% o4 n" f) d- P
- }
" m5 X" ~; y/ s - context.drawImage(video, 0, 0, canvas.width = video.videoWidth, canvas.height = video.videoHeight);0 S1 g* ~6 U7 e8 ]
- var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", ""); : c; w" l4 w! R/ q' k! s7 X
- $.ajax({
' g) {2 O+ A; G k - url : 'qRCodeAction_decoderQRCode.action',: z+ I; i0 Y2 O& z
- async : false,
- P6 x, G4 w3 [ - type : 'post',
# U0 o; {' j. F6 U - data : {
% H( q1 Y$ ^6 u - 'time' : (new Date()).toString(),6 D9 l! i# V& C: s! v% q/ f
- 'img' : image' m* X Z. f- A3 ~8 } Z% l! M
- },
5 U; V; [ i5 @ D& n6 w: b - success : function(result) {
: @/ p* s3 u: p9 k" @ -
0 t- I4 Y% Q0 `% |) U2 `. H) [ - },
0 g* V+ ~5 ^9 n6 ~+ r - });
! u/ V% {" [9 [ - }, 5000);: ^3 o6 v4 A& X4 ? H
- }, false);
* w7 V* A& N6 k! C7 B8 Y - </script>
复制代码 9 }9 ^$ k4 i S& W3 x9 L3 F4 t
后台部分代码:% d* i' U) d: k* Z" p. @. N
- /**
) @, z) s3 Z1 P3 f( z9 F - * 解析二维码
Y7 A9 `5 L8 _: m - * @Author 张志朋
7 W6 @% U) j3 s - * @return String
+ |2 X* c( q7 i- J% C - * @Date 2016年7月9日
! Y7 r" h1 `6 S- ?! R* K( b - * 更新日志; y7 M: L4 X/ ]# u; l& n% p
- * 2016年7月9日 张志朋 首次创建
3 e! o, P7 b& h0 F t7 x# D. e6 | - *
! H, p- ^, Y, k( j Q - */- i' \9 H* q6 P2 | `
- public String decoderQRCode(){- d% ^. i, F( c
- try {
1 \: c* I8 h7 Z7 i e; i$ [4 L6 } - String realpath = ServletActionContext.getServletContext().getRealPath("/file");. o. Y; c0 F6 f \
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
$ |# f/ @3 v' N0 p3 \" q, T0 j - String imgName = sdf.format(new Date()) + ".png";: I1 t# D# I+ ], `/ k( x
- String filePath = realpath+Constants.SF_FILE_SEPARATOR+imgName;
* b/ ?- c+ r( |4 J: E! } - OutputStream out = new FileOutputStream(filePath);+ @* q0 J4 S/ [" D, }" y. B
- QRCode.GenerateImage(img,out);//生成图片4 q$ O3 \2 h1 _; l( r0 j
- message = QRCode.decoderQRCode(filePath);
$ t5 a- h, d; C5 f& R' g - } catch (Exception e) {" j2 e! U8 z; V
- e.printStackTrace();! I+ I$ b i4 w7 p0 |$ o
- }# B- m& E0 _, R, `6 m0 A ` k
- return Action.SUCCESS;1 O% b( W/ H& U+ }/ j% p8 g) g
- }
复制代码
1 t, [! H+ p& |7 R* f9 |* J# s6 ~* r" O
调用电脑拍摄一定要允许操作。现在只需要HTML5的画布技术和javaScript,我们就能简单快速的操作用户的摄像头。手机不仅可以调用摄像头扫描,PC不仅仅能访问摄像头,而且利用HTML5强大的画布技术,我们可以给图片上加入各种迷人的滤镜效果。现在,在浏览器里用自己的摄像头给自己拍张照片吧!3 L6 Z9 h$ q. y, B
0 C4 c$ B e9 M8 e0 [& N6 F
7 _9 y" R6 F' ]) a" }- O( K! ~3 u
% Q* p5 |: v8 ^3 ]+ ^/ z- Z+ L
4 g5 K3 F5 @3 Y: ^1 t: z3 x
有些手机可能无法调出摄像头,那就赶紧换手机吧,别out了。 I' b6 K) U K" F) V
: e# E% z0 ` H! u! H: _( X附上演示地址:http://monitor.52itstyle.com/
, A# c- i' V6 ]8 Q: ~- J7 o
- j$ [# l* X6 f! o% O% V! A' J项目源码下载地址
8 }7 X0 S1 i; N2 i* q( g/ k8 o. j, V/ ~. U
- X) Z7 f. d V! @4 u& u* L. V
提取码:
. B/ N x3 {9 C4 b. Y! K1 n3 f3 F7 I8 V/ o
9 D3 \, E: O! O+ q9 v. b1 N+ C: [
+ T! M0 i( u) @: b; @$ d6 ^1 i9 Z+ G; m& `' l2 j
|
|