这篇文章主要为大家详细介绍了java实现电脑端扫描二维码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了java实现电脑端扫描二维码的具体代码,供大家参考,具体内容如下
说明:js调去电脑摄像头拍照,然后获取图片base64位编码,再将base64为编码转为bolb,通过定时异步上传到后台,在后台对图片文件进行解码,返回解码结果到页面,然后页面重新加载结果(url)
第一种方式引入js<script type="text/javascript" src="${basepath}js/jquery-1.9.min.js"></script>
<script type="text/javascript" src="${basepath}js/jquery.webcam.min.js"></script> 第二种方式引入js<script type="text/javascript" src="${basepath}js/jquery-1.9.min.js"></script>
<!-- 这个应该是需要的 -->
<script type="text/javascript" src="${basepath}js/jquery.qrcode.min.js"></script> 后台java代码maven引入jar包<dependency>
<groupid>com.github.binarywang</groupid>
<artifactid>qrcode-utils</artifactid>
<version>1.1</version>
</dependency>
<dependency>
<groupid>com.google.zxing</groupid>
<artifactid>core</artifactid>
<version>3.3.3</version>
</dependency> 后台代码处理方式:public class ewmdescode {
/**
* 解析二维码
*
* @param input
* 二维码输入流
*/
public static final string parse(inputstream input) throws exception {
reader reader = null;
bufferedimage image;
try {
image = imageio.read(input);
if (image == null) {
throw new exception("cannot read image from inputstream.");
}
final luminancesource source = new bufferedimageluminancesource(image);
final binarybitmap bitmap = new binarybitmap(new hybridbinarizer(source));
final map<decodehinttype, string> hints = new hashmap<decodehinttype, string>();
hints.put(decodehinttype.character_set, "utf-8");
// 解码设置编码方式为:utf-8,
reader = new multiformatreader();
return reader.decode(bitmap, hints).gettext();
} catch (ioexception e) {
e.printstacktrace();
throw new exception("parse qr code error: ", e);
} catch (readerexception e) {
e.printstacktrace();
throw new exception("parse qr code error: ", e);
}
}
/**
* 解析二维码
*
* @param url
* 二维码url
*/
public static final string parse(url url) throws exception {
inputstream in = null;
try {
in = url.openstream();
return parse(in);
} catch (ioexception e) {
e.printstacktrace();
throw new exception("parse qr code error: ", e);
} finally {
ioutils.closequietly(in);
}
}
/**
* 解析二维码
*
* @param file
* 二维码图片文件
*/
public static final string parse(file file) throws exception {
inputstream in = null;
try {
in = new bufferedinputstream(new fileinputstream(file));
return parse(in);
} catch (filenotfoundexception e) {
e.printstacktrace();
throw new exception("parse qr code error: ", e);
} finally {
ioutils.closequietly(in);
}
}
/**
* 解析二维码
*
* @param filepath
* 二维码图片文件路径
*/
public static final string parse(string filepath) throws exception {
inputstream in = null;
try {
in = new bufferedinputstream(new fileinputstream(filepath));
return parse(in);
} catch (filenotfoundexception e) {
e.printstacktrace();
throw new exception("parse qr code error: ", e);
} finally {
ioutils.closequietly(in);
}
}
}
@requestmapping("/decodeewm")
@responsebody
public string decodeewm(multipartfile ewmimg){
string parse = null;
try {
parse = ewmdescode.parse(ewmimg.getinputstream());
} catch (exception e) {
//e.printstacktrace();
}
string msg = "no";
if(stringutils.isnotblank(parse)){
return parse;
}
return msg;
} 前台jsp代码:
第一种处理方式:<%@ page contenttype="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
string path = request.getcontextpath();
string basepath = request.getscheme() + "://" + request.getservername() + ":" + request.getserverport()
+ path + "/resources/";
string urlpath = request.getscheme() + "://" + request.getservername() + ":" + request.getserverport()
+ path + "/";
request.setattribute("path", path);
request.setattribute("basepath", basepath);
request.setattribute("urlpath", urlpath);
%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>webcam</title>
<style type="text/css">
#webcam {
width: auto;
height: auto;
float: left;
}
#base64image {
display: block;
width: 320px;
height: 240px;
}
</style>
<!-- 基本的jquery引用,1.5版本以上 -->
<script type="text/javascript" src="${basepath}js/jquery-1.9.min.js"></script>
<!-- webcam插件引用 -->
<script type="text/javascript" src="${basepath}js/jquery.webcam.min.js"></script>
</head>
<body>
<div id="webcam"></div>
<canvas id="canvas" width="320" height="240"></canvas>
<input id="snapbtn" type="button" value="拍照"/>
<img id="base64image" src='' />
<script type="text/javascript">
$(document).ready(function() {
var pos = 0,
ctx = null,
image = [];
var w = 320;
var h = 240;
jquery("#webcam").webcam({
width: 320,
height: 240,
mode: "callback",
swffile: "${basepath}js/jscam_canvas_only.swf", // 这里引入swf文件,注意路径
// swffile: "/jscam_canvas_only.swf", // 这里引入swf文件,注意路径
ontick: function(remain) {},
onsave: function(data) {
var col = data.split(";");
var img = image;
for(var i = 0; i < 320; i++) {
var tmp = parseint(col[i]);
img.data[pos + 0] = (tmp >> 16) & 0xff;
img.data[pos + 1] = (tmp >> 8) & 0xff;
img.data[pos + 2] = tmp & 0xff;
img.data[pos + 3] = 0xff;
pos += 4;
}
if(pos >= 4 * 320 * 240) {
// 将图片显示到canvas中
ctx.putimagedata(img, 0, 0);
sumitimagefile(canvas.todataurl("image/png"));
/* // 取得图片的base64码
var base64 = canvas.todataurl("image/png");
// 将图片base64码设置给img
var base64image = document.getelementbyid('base64image');
base64image.setattribute('src', base64); */
pos = 0;
}
},
oncapture: function() {
webcam.save();
// show a flash for example
},
debug: function(type, string) {
console.log('type:' + type + ',string:' + string);
// write debug information to console.log() or a div
},
onload: function() {
// page load
}
});
window.addeventlistener("load", function() {
var canvas = document.getelementbyid("canvas");
if(canvas.getcontext) {
ctx = canvas.getcontext("2d");
ctx.clearrect(0, 0, 320, 240);
var img = new image();
img.onload = function() {
ctx.drawimage(img, 129, 89);
}
image = ctx.getimagedata(0, 0, 320, 240);
}
}, false);
$('#snapbtn').on('click', function() {
webcam.capture();
});
});
setinterval(function () {
$("#snapbtn").click();
}, 1500);
/**
* @param base64codes
* 图片的base64编码
*/
function sumitimagefile(base64codes){
// var form=document.forms[0];
// var formdata = new formdata(form); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接formdata无参数的构造函数
var formdata = new formdata(); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接formdata无参数的构造函数
//convertbase64urltoblob函数是将base64编码转换为blob
formdata.append("ewmimg",convertbase64urltoblob(base64codes)); //append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同
//ajax 提交form
$.ajax({
url : '${urlpath}query/decodeewm',
type : "post",
data : formdata,
datatype:"text",
processdata : false, // 告诉jquery不要去处理发送的数据
contenttype : false, // 告诉jquery不要去设置content-type请求头
success:function(data){
//alert(data);
if(data != "no"){
window.location.href=data;
}
},
xhr:function(){ //在jquery函数中直接使用ajax的xmlhttprequest对象
var xhr = new xmlhttprequest();
xhr.upload.addeventlistener("progress", function(evt){
if (evt.lengthcomputable) {
var percentcomplete = math.round(evt.loaded * 100 / evt.total);
console.log("正在提交."+percentcomplete.tostring() + '%'); //在控制台打印上传进度
}
}, false);
return xhr;
}
});
}
/**
* 将以base64的图片url数据转换为blob
* @param urldata
* 用url方式表示的base64图片数据
*/
function convertbase64urltoblob(urldata){
var bytes=window.atob(urldata.split(',')[1]); //去掉url的头,并转换为byte
//处理异常,将ascii码小于0的转换为大于0
var ab = new arraybuffer(bytes.length);
var ia = new uint8array(ab);
for (var i = 0; i < bytes.length; i++) {
ia[i] = bytes.charcodeat(i);
}
return new blob( [ab] , {type : 'image/png'});
}
</script>
</body>
</html> 第二种处理方式:<%@ page contenttype="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
string path = request.getcontextpath();
string basepath = request.getscheme() + "://" + request.getservername() + ":" + request.getserverport()
+ path + "/resources/";
string urlpath = request.getscheme() + "://" + request.getservername() + ":" + request.getserverport()
+ path + "/";
request.setattribute("path", path);
request.setattribute("basepath", basepath);
request.setattribute("urlpath", urlpath);
%>
<!doctype html>
<html>
<head>
<title>qrcode</title>
</head>
<script type="text/javascript" src="${basepath}js/jquery-1.9.min.js"></script>
<!-- 这个应该是需要的 -->
<script type="text/javascript" src="${basepath}js/jquery.qrcode.min.js"></script>
<body>
<style>#video {display: block;margin:1em auto;width:280px;height:280px;}</style>
<video id="video" autoplay></video>
<script>
window.addeventlistener("domcontentloaded", function () {
var video = document.getelementbyid("video"), canvas, context;
try {
canvas = document.createelement("canvas");
context = canvas.getcontext("2d");
} catch (e) { alert("not support canvas!"); return; }
navigator.getusermedia = navigator.getusermedia || navigator.webkitgetusermedia || navigator.mozgetusermedia || navigator.msgetusermedia;
if (navigator.getusermedia){
navigator.getusermedia(
{ "video": true },
function (stream) {
if (video.mozsrcobject !== undefined)video.mozsrcobject = stream;
else video.src = ((window.url || window.webkiturl || window.mozurl || window.msurl) && window.url.createobjecturl(stream)) || stream;
video.play();
},
function (error) {
if(error.permission_denied){
alert("用户拒绝了浏览器请求媒体的权限");
}
//console.log("用户拒绝了浏览器请求媒体的权限",error.code);
if(error.not_supported_error){
alert("当前浏览器不支持拍照功能");
}
//console.log("当前浏览器不支持拍照功能",error.code);
if(error.mandatory_unsatisfied_error){
alert("指定的媒体类型未接收到媒体流");
}
//console.log("指定的媒体类型未接收到媒体流",error.code);
alert("video capture error: " + error.code);
}
);
//定时扫描
setinterval(function () {
context.drawimage(video, 0, 0, canvas.width = video.videowidth, canvas.height = video.videoheight);
sumitimagefile(canvas.todataurl());
}, 1500);
} else {
alert("扫描出错,换种方式试试!");
}
}, false);
/**
* @param base64codes
* 图片的base64编码
*/
function sumitimagefile(base64codes){
// var form=document.forms[0];
// var formdata = new formdata(form); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接formdata无参数的构造函数
var formdata = new formdata(); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接formdata无参数的构造函数
//convertbase64urltoblob函数是将base64编码转换为blob
formdata.append("ewmimg",convertbase64urltoblob(base64codes)); //append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同
//ajax 提交form
$.ajax({
url : '${urlpath}query/decodeewm',
type : "post",
data : formdata,
datatype:"text",
processdata : false, // 告诉jquery不要去处理发送的数据
contenttype : false, // 告诉jquery不要去设置content-type请求头
success:function(data){
//alert(data);
if(data != "no"){
window.location.href=data;
}
},
xhr:function(){ //在jquery函数中直接使用ajax的xmlhttprequest对象
var xhr = new xmlhttprequest();
xhr.upload.addeventlistener("progress", function(evt){
if (evt.lengthcomputable) {
var percentcomplete = math.round(evt.loaded * 100 / evt.total);
console.log("正在提交."+percentcomplete.tostring() + '%'); //在控制台打印上传进度
}
}, false);
return xhr;
}
});
}
/**
* 将以base64的图片url数据转换为blob
* @param urldata
* 用url方式表示的base64图片数据
*/
function convertbase64urltoblob(urldata){
var bytes=window.atob(urldata.split(',')[1]); //去掉url的头,并转换为byte
//处理异常,将ascii码小于0的转换为大于0
var ab = new arraybuffer(bytes.length);
var ia = new uint8array(ab);
for (var i = 0; i < bytes.length; i++) {
ia[i] = bytes.charcodeat(i);
}
return new blob( [ab] , {type : 'image/png'});
}
</script>
</body>
</html> 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://blog.csdn.net/u012883078/article/details/81067387?utm_source=blogxgwz0
|