TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。7 t u1 [( o% F# |
+ }% ^$ t y: t
]! N9 t. A" l7 k N( G项目使用环境以及工具:/ ?9 u; q" M5 Y
, n- d: p1 U% E7 mEclipse,JDK1.7,struts2,HTML5,Jquery,QRCode) |# V2 U- t5 j$ V& t+ B9 X/ _
HTML5技术支持WebApp在手机上拍照,显示在页面上并上传到服务器。这是手机微博应用中常见的功能,当然你也可以在其它类型应用中适当使用此技术。
1 G) q; `5 J$ l7 b% V! U7 Y 这个功能不但手机端可以实现PC端也可以很好的实现,这个应用接口技术就是getUserMedia API,它能让应用开发者访问用户的摄像头或内置相机。下面就让我展示一下如何通过浏览器来访问你的摄像头,并提取截屏图形。
8 s2 y, O( N8 g
7 w6 S* ~4 M, p8 E( c一、视频流 7 v8 |3 v$ [3 V5 o
7 t8 K$ z" k! a3 J3 W- X1 W! ? V HTML5 的 The Media Capture(媒体捕捉) API 提供了对摄像头的可编程访问,用户可以直接用 getUserMedia (请注意目前仅Chrome和Opera支持)获得摄像头提供的视频流。我们需要做的是添加一个HTML5 的 Video 标签,并将从摄像头获得的视频作为这个标签的输入来源。1 H& k: K, }+ c
9 v' F2 o; j6 e2 X7 ?
二、拍照7 r& O8 v7 t$ {# d4 Z1 N. p
: W$ O6 u' w& d* U5 b q
拍照是采用HTML5的Canvas功能,实时捕获Video标签的内容,因为Video元素可以作为Canvas图像的输入,所以这一点很好实现。/ `- ~9 L8 z; S2 o6 y
! P7 P/ z4 h- u1 O2 E& ?4 M: J
三、 获取图片
5 V8 o& ~. {; v: I+ L5 |/ Q- g x' d$ e6 G
从Canvas获取图片数据的核心思路是用canvas的toDataURL将Canvas的数据转换为base64位编码的PNG图像,类似于“data:image/png;base64,xxxxx”的格式。0 a6 K. S6 O3 d2 I/ L
6 \ {+ l: e8 d. ?$ a' |: Z8 Svar imgData=canvas.toDataURL(“image/png”);
& _8 |( K8 C7 Q. m; q8 p6 i& G
4 R) }. m; w& P2 l% `2 v8 H+ K4 n这样,imgData变量就存储了一长串的字符数据内容,表示的就是一个PNG图像的base64编码。因为真正的图像数据是base64编码逗号之后的部分,所以要让实际服务器接收的图像数据应该是这部分,我们可以用两种办法来获取。; L: o+ x: T1 Y3 N% N
第一种:是在前端截取22位以后的字符串作为图像数据,例如:
6 @( ]+ k7 d& L5 e% W, H( r1 I8 Q, J N
var data=imgData.substr(22);( L$ N9 g+ ~- d( `9 m l) x3 e
- N& r8 v- I9 `. c: b: Y2 |/ F+ y
第二种:就是替换;前面的部分为"";
' x: {' Z: G( ?$ D% \ W1 s# ?0 L8 W# x2 T9 }6 c7 W
var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");# C% q8 s* T: W8 T6 B% c
# U: a" y' B6 O9 N! c" v
反正不管如何实现,能获取到图片流即可、
- k Q, p8 C5 T. @! V O" h- f. Q3 j) \ A% U+ i: K# ] t0 G$ m
四、上传图片并解析
# \6 o8 e, V: u" ?
6 ]4 Q) l! E6 P( S( i1 }0 n使用 setInterval定时上传到项目后台使用开源QRCode.jar 解析图片获取二维码信息。1 x7 z! ~' b1 f6 s. E: ?. w4 M
4 |: @! ?7 V% {1 S# Q- b. n0 X: H6 U前台部分代码:
; H/ C* H) h) h+ I* ?) m! S, v- <video id="video">) C+ p7 y% E) M( }* }* h
- <script>
3 A9 O) n7 }3 Y. F7 D5 h! P7 o - var flag = true;
7 N* d5 F! Z4 C" q+ O - window.addEventListener("DOMContentLoaded", function () {
4 A& d( U0 {4 b! Z8 [/ Q! W - var video = document.getElementById("video"), canvas, context;% O. i+ d0 L# O9 N& u
- try {
6 i% i! H& i9 ~+ Q6 G1 s7 U - canvas = document.createElement("canvas");
( I1 T+ [' l& I* I1 q* \' N$ U - canvas.width = 600;
; ^, k3 ]# ]4 [ - canvas.height = 600;9 H, j+ |8 i- S+ z, h5 B
- context = canvas.getContext("2d");
( v o2 V3 x h% g6 I3 T - } catch (e) { alert("not support canvas!"); return; }$ R3 m0 j7 X$ x5 }
- navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
+ X X9 p9 C) w2 w8 B0 I; J7 ~& V6 e - # g/ ~" a8 b9 v7 c/ V2 V
- if (navigator.getUserMedia)( _5 i" E# n& Y4 u
- navigator.getUserMedia(- }5 Q5 ]2 y3 _$ k/ A; _$ [
- { "video": true },
. c% F) M2 _ v3 c5 q" V. `, d4 J - function (stream) {
2 B% n# @' r% |' ?8 P: g% t2 T - if (video.mozSrcObject !== undefined)video.mozSrcObject = stream;. @/ j( B8 m% m# D; V
- else video.src = ((window.URL || window.webkitURL || window.mozURL || window.msURL) && window.URL.createObjectURL(stream)) || stream;
' X1 P" H# e2 o5 N. h% \ - video.play();! U: t+ Q0 d; D) ?' I/ S0 ?- ^
- },6 p# T+ Y0 f4 u% ^% c
- function (error) {& |) t V+ u& R3 _1 U6 x
- alert("请检查是否开启摄像头");
2 y+ {! U1 N; R1 E - flag = false;
- q4 @7 N0 j- Q+ A2 `1 E - }
; |( N# {9 w% {" n - );" Y" U5 Q4 C) j+ [ }% F
- else alert("Native device media streaming (getUserMedia) not supported in this browser");
# y6 f* [+ x2 C; d - " S: _! x7 K+ X* J \; b
- setInterval(function () {
" p6 v4 }7 Z% N$ s' m; `( i - if(!flag){$ Y K% [( F* y: K( m3 |: U0 q
- return;
# p* P% X# R. e - }- @5 U: I: F) H! l/ Y
- context.drawImage(video, 0, 0, canvas.width = video.videoWidth, canvas.height = video.videoHeight);
f5 u' {0 W1 |! P, z' `, e - var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", ""); 9 B, Z: e4 g' P" \" K
- $.ajax({
& t0 ^/ }1 u K* p, O - url : 'qRCodeAction_decoderQRCode.action',
! f! r- X3 X/ Q8 ?3 r - async : false,
4 x5 B. `/ b) C+ |5 N - type : 'post',# F6 {4 |# _/ f4 u
- data : {* s; Y" w" ^7 n3 i
- 'time' : (new Date()).toString(),! Y( X7 h2 S& e. V. r0 t f. S6 A
- 'img' : image7 d; ?' M$ W1 l! x7 a
- },
1 n5 ]1 C- J( d* _ - success : function(result) {
8 K& r; d* h2 W) S2 z: P9 g: E! M6 ]* P" K! J -
. t; i# k- E d! y; t - },
" _% F8 J# R; i1 Y - });
, Z# Z4 n* J* H/ | - }, 5000);
! Q' F4 w9 l: Y5 a5 P - }, false);
0 X0 H a9 {9 [/ P" T9 }; @1 U - </script>
复制代码
* h! b+ o1 M* b" G3 x" F后台部分代码:
4 W0 N5 ?8 N; m% Q/ F y- /**+ [; g! u4 m( H
- * 解析二维码! _1 w( e+ c, L+ k3 Z
- * @Author 张志朋
6 T2 t: [. M, y0 V8 p. K - * @return String
; `/ S2 q9 _& B; t - * @Date 2016年7月9日& _8 ~3 U7 G; \0 R# O
- * 更新日志
- Y/ Y* c' @7 h - * 2016年7月9日 张志朋 首次创建, m7 k0 O$ E Y6 w4 `. ]
- *, ?. N2 H% m5 T* G; ` i
- */; @& t e" Q/ h- t) `/ V
- public String decoderQRCode(){
- g/ x2 P! z' o4 j7 H% Y - try {& Y j' X0 k8 f- x8 o' {
- String realpath = ServletActionContext.getServletContext().getRealPath("/file");* C/ Q% _& R# e2 G9 U! l
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");- s' c) T$ [3 m5 B0 z. I
- String imgName = sdf.format(new Date()) + ".png";. }0 ]6 H, {# V+ F$ k/ i
- String filePath = realpath+Constants.SF_FILE_SEPARATOR+imgName;
- ]$ I) J' T/ F. C - OutputStream out = new FileOutputStream(filePath);
4 n o7 P0 t! M) o' y! ^( q3 m7 r - QRCode.GenerateImage(img,out);//生成图片4 X# D& l3 r8 `& o; x. W: S
- message = QRCode.decoderQRCode(filePath);8 N, D" {& U( {1 k- U0 u
- } catch (Exception e) {
7 t6 u, f6 c2 w5 ~& m5 V8 o - e.printStackTrace();/ S2 e% c% M, o( E& x6 C
- }3 n: I, @* G% p& I* Q
- return Action.SUCCESS; H( s; m: r7 M% J9 `& \* s
- }
复制代码
$ d9 Q8 w' M# w9 P! y2 [' O1 {& f1 ~/ m* l0 N A# s$ c, t
调用电脑拍摄一定要允许操作。现在只需要HTML5的画布技术和javaScript,我们就能简单快速的操作用户的摄像头。手机不仅可以调用摄像头扫描,PC不仅仅能访问摄像头,而且利用HTML5强大的画布技术,我们可以给图片上加入各种迷人的滤镜效果。现在,在浏览器里用自己的摄像头给自己拍张照片吧! |6 `! |, r9 @) X9 r
- t/ P0 q4 u6 J8 ]9 G* l4 [. p. d
+ [& x: F, \: E5 e) e) w: [: v( O
4 f- C- C, ?' c3 B# t9 K9 \, I
- F- h% y9 h; R. x; [) {+ e
有些手机可能无法调出摄像头,那就赶紧换手机吧,别out了。
1 ~, l; z- T4 e- r
6 I B) o: J& E( `' K9 C$ `' s7 _附上演示地址:http://monitor.52itstyle.com/; ] B+ @; F X z" Z, J
" T- I6 e5 s' p4 y: @" R项目源码下载地址
3 P3 ?4 O% g' Q4 J+ c) a- {, B8 @2 r! u
+ k* j: R2 ~' T提取码:
0 J* d: C- u6 V- T- j
9 E' [- H0 d% R7 }" \3 B" w. H) F8 T) L! O- W4 n
4 _1 ?: P% S N4 {
) W) q+ k% n6 J- z6 c3 J |
|