TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。
0 X# t7 t; A- l8 \+ \" K- b$ c3 u( J! ]0 F7 K& q5 m8 B; r/ R- \
0 E1 a9 Z! j* f( ]) N项目使用环境以及工具:0 P, d1 Z, ?! h: n) V: w& a
7 @2 E5 B( u8 y0 M! c( k4 FEclipse,JDK1.7,struts2,HTML5,Jquery,QRCode
( I4 \+ } X7 x0 r! THTML5技术支持WebApp在手机上拍照,显示在页面上并上传到服务器。这是手机微博应用中常见的功能,当然你也可以在其它类型应用中适当使用此技术。 - ^# _9 n! d6 @5 l
这个功能不但手机端可以实现PC端也可以很好的实现,这个应用接口技术就是getUserMedia API,它能让应用开发者访问用户的摄像头或内置相机。下面就让我展示一下如何通过浏览器来访问你的摄像头,并提取截屏图形。! M( m2 a$ H' l; s6 |( t) Y! A
8 x% \5 O$ B0 ?! G* m) v
一、视频流
/ {; |+ D% B9 P9 i# ?; B0 N% _; i6 A4 E
HTML5 的 The Media Capture(媒体捕捉) API 提供了对摄像头的可编程访问,用户可以直接用 getUserMedia (请注意目前仅Chrome和Opera支持)获得摄像头提供的视频流。我们需要做的是添加一个HTML5 的 Video 标签,并将从摄像头获得的视频作为这个标签的输入来源。 q& p" \% I. v6 O) R
% N: c2 U' U0 ~6 }
二、拍照
; @8 A9 m0 `0 ]8 i7 c, \3 J# Z2 X* O0 B6 l1 s" H
拍照是采用HTML5的Canvas功能,实时捕获Video标签的内容,因为Video元素可以作为Canvas图像的输入,所以这一点很好实现。
* \; s+ F6 z4 A) Z% y* w) S4 z, i( H0 L6 p. x1 \6 j7 i
三、 获取图片/ }- ^) T8 A8 ]) C
1 }$ ?. t' J1 V; E# ? 从Canvas获取图片数据的核心思路是用canvas的toDataURL将Canvas的数据转换为base64位编码的PNG图像,类似于“data:image/png;base64,xxxxx”的格式。3 L: y7 A; G' R+ R w/ e$ F" j
# M0 X1 I4 p# ^# x) W; u, pvar imgData=canvas.toDataURL(“image/png”);
; Y d" O8 O8 q2 }7 H, ~2 x6 Z' ^- B. @4 S7 { Y! B
这样,imgData变量就存储了一长串的字符数据内容,表示的就是一个PNG图像的base64编码。因为真正的图像数据是base64编码逗号之后的部分,所以要让实际服务器接收的图像数据应该是这部分,我们可以用两种办法来获取。% @0 e7 s9 ^0 s" j; ^
第一种:是在前端截取22位以后的字符串作为图像数据,例如:
+ x4 B* m9 X& Z+ r3 O, z }9 U+ k4 R& t# D+ X* w: h" ^
var data=imgData.substr(22);
A- X# M1 d) Y/ j
" ^; j4 z0 `9 T6 |: b 第二种:就是替换;前面的部分为"";, G3 f1 }, w' d& K4 s
& z1 q% Z! Q; J; R: q! W6 g1 {var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");
9 S/ T5 t0 g1 X9 n# H2 S1 o' }7 f8 G- i2 [* D: f9 j) J! a
反正不管如何实现,能获取到图片流即可、
9 p; P9 q3 O3 w& I7 x" J2 Y v7 x C* e0 h- d* I( }# I
四、上传图片并解析' {7 H) A+ [- Y6 }; j- A) \
0 |2 o' T& g! m& ^使用 setInterval定时上传到项目后台使用开源QRCode.jar 解析图片获取二维码信息。8 o! u$ ?6 K4 @) X9 }) i
& a2 N5 [; Q' M
前台部分代码:* d: U b: | X3 l$ W2 f+ W4 O
- <video id="video">
7 H' `5 B! {7 A& A - <script>
! S, w# o( e& e+ ^: q - var flag = true;
' a' w# v) y# x, D - window.addEventListener("DOMContentLoaded", function () {
; l8 M$ `! Q" M; N - var video = document.getElementById("video"), canvas, context;& y* x6 F* V) w
- try {
# Y0 X# Q5 O! Y' y9 `3 B% o% }1 | - canvas = document.createElement("canvas");
8 s; l6 z# I$ h2 z' A: O8 C# E1 \ - canvas.width = 600;( S+ f, A( Z- } b; v
- canvas.height = 600;
8 Q9 f7 K7 Y, M/ H - context = canvas.getContext("2d");8 R) V Q& @: l4 s
- } catch (e) { alert("not support canvas!"); return; }
E5 t6 _' Q- E8 H - navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
# Y3 F8 P1 T! J0 ]3 j+ g
7 q7 |$ v0 V( k. k- if (navigator.getUserMedia) g2 O, i- y3 g2 Y4 y
- navigator.getUserMedia(7 f+ f3 _$ ` @0 V( q) r
- { "video": true },
- ?7 J0 P* g0 q7 ^% n! t - function (stream) {
+ Y Z! M3 R0 w) n; p - if (video.mozSrcObject !== undefined)video.mozSrcObject = stream;
" ^& s% ]) ~8 L! }4 n - else video.src = ((window.URL || window.webkitURL || window.mozURL || window.msURL) && window.URL.createObjectURL(stream)) || stream; & |0 I# t9 s& a9 d8 I0 m# a% g
- video.play();
) @1 x& P* c. e/ i3 l+ X/ F - },' J! i5 q6 T' o
- function (error) {; \8 H0 ]6 K+ v% U
- alert("请检查是否开启摄像头");
" \3 A. Z$ ^. X+ J6 V% g- U# B - flag = false;. X6 Q5 B. \& M6 B. n$ _
- }
& S2 P, Z/ L, ] - );5 @' P, D! i3 z% i7 R5 S1 B+ z
- else alert("Native device media streaming (getUserMedia) not supported in this browser");* R9 Q. _3 m& _7 H
- " I0 }; {# Z( V4 r
- setInterval(function () {+ w t5 L2 p# ]0 \# W
- if(!flag){
# h3 @8 w& d z; c - return;/ I, `7 y$ f+ L' U/ b
- }" p5 _; V2 M9 b& r- V4 q/ F
- context.drawImage(video, 0, 0, canvas.width = video.videoWidth, canvas.height = video.videoHeight);+ A7 c3 M: p R1 M1 |" l! G
- var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");
: `1 r2 h, N; {* c - $.ajax({2 I" n/ r h% a S: p
- url : 'qRCodeAction_decoderQRCode.action',0 k; U- ^9 x% |
- async : false,: J& c$ k$ b1 ~* W
- type : 'post',' m, q( X4 r+ k0 e
- data : {
7 E3 ?: m: a, y" w) V( P - 'time' : (new Date()).toString(),
' T( U0 b* u o( L$ j - 'img' : image+ ^9 _3 W( w2 K! T1 t
- },
/ Q. u7 c& O* T! L& b - success : function(result) {
6 s# J, J; u2 O - , n1 z& M0 f/ H3 M
- },7 q. Q2 q5 B# h" a5 Z. h
- });% f. e( S2 J0 i, K: I# @& w
- }, 5000);
1 t2 o' L! L1 X! V5 g; t$ C% g - }, false);. ?1 }9 H7 l3 G
- </script>
复制代码 % _$ U" r9 Z8 B% O- P1 e
后台部分代码:8 n! R B2 Y1 {, W+ F: ]
- /**
2 H: v' \% J8 Q5 L" K4 Y8 ~. D - * 解析二维码
" x& V; q: r# Z& A8 s - * @Author 张志朋
6 t r) K S m6 K& {/ ^/ }* x - * @return String
1 j- f* e! d, |% M - * @Date 2016年7月9日
% l; K3 A% l6 H$ B1 a6 k4 b - * 更新日志
; t+ m7 f! e$ x4 Y% O: l( [ - * 2016年7月9日 张志朋 首次创建
. p1 f. W5 e( C7 A* `2 z; B6 ]5 z - *' s1 x! d" O4 T5 q/ j% r, \
- */
& \7 B" i6 ]5 Y - public String decoderQRCode(){( T8 ^! @6 c3 U3 X3 v: | m& ?
- try {
" A. h1 N& | {. K$ N4 c! [ - String realpath = ServletActionContext.getServletContext().getRealPath("/file");
& q2 J3 W( J- e& G5 }+ U7 `9 z/ { - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");/ c& h( \% p! K! Q9 G
- String imgName = sdf.format(new Date()) + ".png";3 Z' p0 u1 t4 X. C5 ~1 F
- String filePath = realpath+Constants.SF_FILE_SEPARATOR+imgName;
8 H& f. v; n7 I; u( F, |- Z7 ? - OutputStream out = new FileOutputStream(filePath);
, W- X9 I( l7 J# D7 Y1 H - QRCode.GenerateImage(img,out);//生成图片
/ E+ f( p; E- Z - message = QRCode.decoderQRCode(filePath);+ T5 e( f' N6 U) G, c* G
- } catch (Exception e) {' h& c$ n9 X+ `* R2 X6 C& Y
- e.printStackTrace();
6 C& y7 }. _( B: T. P T - }) n7 {1 O" @4 U8 v( @* P
- return Action.SUCCESS;- o9 _' |* x: {
- }
复制代码 ! F' H) R3 q& y0 c" A
- n S6 Z# r3 E8 { q4 J8 N调用电脑拍摄一定要允许操作。现在只需要HTML5的画布技术和javaScript,我们就能简单快速的操作用户的摄像头。手机不仅可以调用摄像头扫描,PC不仅仅能访问摄像头,而且利用HTML5强大的画布技术,我们可以给图片上加入各种迷人的滤镜效果。现在,在浏览器里用自己的摄像头给自己拍张照片吧!
9 g1 ], C' \6 w
# |; V1 Y$ C& a- \: X8 C0 n
# b7 P8 O0 \& z4 b
. D6 z* Z8 L8 _6 I/ j& q
+ E5 p; e+ `: n2 t6 o' m: A/ x% d. B
0 ^' x9 ?# `; \8 h* w' n" y; L有些手机可能无法调出摄像头,那就赶紧换手机吧,别out了。5 s2 `0 i; w- [+ W7 S7 U
& J/ ~" m8 d0 s7 i1 [5 }附上演示地址:http://monitor.52itstyle.com/
6 y4 z* x" ^( H5 K2 y$ m$ x( t1 a: V) k: S( Q7 Q3 a+ y I( J4 L4 H) ]
项目源码下载地址$ g! N7 x8 z# b- D7 Z+ R
/ f% \" r' {9 ?$ w- R* X
- h( p( {! l, ?; T8 }, G提取码:
. A, |3 v- b. z5 s5 L0 e: t C4 G) t& s5 S6 N% `6 i
: K+ W3 j+ S# j0 [7 d, }5 e& {- `5 x$ J! |/ ]( P; s
! o- S& E. w5 M3 g3 W* X
|
|