最近一个需求就是做一个二维码扫描的功能,但是又不想使用安卓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
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
<video id="video"> 6 s E9 x! D7 Q) S+ h
<script>, h% M+ w) I% j* b0 @4 R
var flag = true;4 v4 C' j& F) q" ?# k6 s/ A
window.addEventListener("DOMContentLoaded", function () {/ p- q7 M8 N6 S* z, z" ?' H6 O3 i1 S x
var video = document.getElementById("video"), canvas, context;0 A% }8 G! ^& G3 L( _# |
try {! m& y1 {5 p% i5 L/ _' e
canvas = document.createElement("canvas"); 5 R8 _0 a% M( T# A
canvas.width = 600;( W7 t" I8 p% p# [
canvas.height = 600; 9 `9 z3 p' s; {! _# S/ U5 d
context = canvas.getContext("2d"); 3 n- q& g. x. [
} catch (e) { alert("not support canvas!"); return; } ( X6 Q- e% B1 W0 U