最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓APP的方式实现,百度了一下貌似HTML5可以实现。0 x2 ]- S. y2 D, d! S
$ a: N# q w X: T$ {" d7 y
9 n, b) B8 j& K8 B, i& d% {: E9 m& i项目使用环境以及工具:7 W. s. u& Y8 |1 U' a
% l5 R% q) n5 H, h+ x8 {3 H
Eclipse,JDK1.7,struts2,HTML5,Jquery,QRCode . D5 h w' q8 G; U, I$ ]: ?3 s
) N: S, [5 Y1 e+ U' p一、视频流 {- F. i" e" Q0 F
# d' R9 a' }7 z- A9 j
HTML5 的 The Media Capture(媒体捕捉) API 提供了对摄像头的可编程访问,用户可以直接用 getUserMedia (请注意目前仅Chrome和Opera支持)获得摄像头提供的视频流。我们需要做的是添加一个HTML5 的 Video 标签,并将从摄像头获得的视频作为这个标签的输入来源。1 ]+ B: z* O6 ?3 \6 {7 h
1 D# R8 F+ f1 t二、拍照 / u8 E- h: G$ i; S! J- L9 _/ r( D( u5 D8 Y
拍照是采用HTML5的Canvas功能,实时捕获Video标签的内容,因为Video元素可以作为Canvas图像的输入,所以这一点很好实现。 ~: P- E8 W! v- u' V
a" Q: u V: J' E% z; q% ?三、 获取图片3 y: w. ~7 S7 A2 S
: O+ B4 R! r5 I/ l" }2 E: [. A 从Canvas获取图片数据的核心思路是用canvas的toDataURL将Canvas的数据转换为base64位编码的PNG图像,类似于“data:image/png;base64,xxxxx”的格式。# h. B( ~; E9 T; j. Y* ?
/ e R/ a0 G# b! y+ xvar imgData=canvas.toDataURL(“image/png”); 5 _' C$ \3 F2 T! Y ) _- c- {: r3 I- K$ V这样,imgData变量就存储了一长串的字符数据内容,表示的就是一个PNG图像的base64编码。因为真正的图像数据是base64编码逗号之后的部分,所以要让实际服务器接收的图像数据应该是这部分,我们可以用两种办法来获取。 L1 T( k- j" w6 M; M
第一种:是在前端截取22位以后的字符串作为图像数据,例如:0 r, a9 g2 u/ J4 T7 r
& q5 t/ _8 D2 u. T0 A
var data=imgData.substr(22); 3 n5 `) ~( J0 r7 [- x/ H* C ( h. m6 I9 ^6 J7 C- n; N 第二种:就是替换;前面的部分为""; ! w, C) {! S: Q8 G. u# W- H ( L8 N' s# ?3 q7 K, ]var image = canvas.toDataURL("image/png").replace("data:image/png;base64,", "");! B" y6 o6 ]4 z
: ~: c* b3 }! n$ _5 x0 [- S. g( j反正不管如何实现,能获取到图片流即可、 # Z& x* N ]8 |# j2 j+ V ; g0 M. y7 T& D. u! C F: k& {四、上传图片并解析) I$ y- w, V; ~/ Z! t. m8 ^
" }. M- B, F7 ^# F
使用 setInterval定时上传到项目后台使用开源QRCode.jar 解析图片获取二维码信息。 / @4 t+ s" c0 ^2 |* t ) Y, H0 n. V% U$ Q前台部分代码:, { Y0 z% ?& P7 q x
<video id="video">$ D, f( y! P/ ?- ~0 ?9 L1 I
<script>! l. j1 y% n8 x9 N" D9 x
var flag = true;& A( g7 `7 k# }% F
window.addEventListener("DOMContentLoaded", function () { $ j% i, [* G! I* c& l( U O3 a
var video = document.getElementById("video"), canvas, context; ) L0 [$ l- ~1 O. V
try {% c5 w6 ~# N( u: N: V! U
canvas = document.createElement("canvas");; h0 ?& h+ V- q" W. @7 @+ m# f
canvas.width = 600; $ o |$ o1 Q8 Z* Q1 e+ h& @% r) m
canvas.height = 600; : y# S' n( ~1 m0 G
context = canvas.getContext("2d"); ' _4 o R1 s6 }: n0 @- g5 x- y
} catch (e) { alert("not support canvas!"); return; }5 r$ o, N9 m# ?
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;$ t! A# m) [: v8 i/ E: v' O
p5 z" y; i+ K* x% q" T* y
if (navigator.getUserMedia) y. W' @6 W N5 H, o
navigator.getUserMedia(: p. D, [; _( X% o" n& L
{ "video": true }, + s& O) s# }# r! C) |
function (stream) { 3 J+ ?+ N- q, X: x0 E0 h
if (video.mozSrcObject !== undefined)video.mozSrcObject = stream; ; M9 t$ h' e& i