-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathqrscan.js
118 lines (112 loc) · 4.33 KB
/
qrscan.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/**
* html5调用摄像头扫码
*/
;(function (win, doc) {
function QRScan(div_id) {
this.div_id = div_id;
this.div_can = null;
this.videos = [];
this.medioConfig = {};
this.can_open = false;
this.init();
}
QRScan.prototype = {
init: function () {
win.URL = (win.URL || win.webkitURL || win.mozURL || win.msURL);
var promisifiedOldGUM = function(constraints) {
var getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia || navigator.mozGetUserMedia);
if (!getUserMedia) {
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
}
return new Promise(function (resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
};
if(navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if(navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = promisifiedOldGUM;
}
var self = this;
self.div_can = doc.getElementById(self.div_id);
navigator.mediaDevices.enumerateDevices().then(function(devices) {
devices.forEach(function (dv) {
var kind = dv.kind;
if (kind.match(/^video.*/)) {
self.videos.push(dv.deviceId);
console.log(dv);
}
});
var len = self.videos.length;
self.can_open = true;
self.medioConfig = {
audio: false,
video: { deviceId: self.videos[len - 1] }
}
});
},
openScan: function () {
var self = this;
if (self.can_open) {
var vd = doc.createElement('video');
vd.setAttribute('id', 'video_id');
navigator.mediaDevices.getUserMedia(self.medioConfig).then(function (stream) {
vd.src = win.URL.createObjectURL(stream);
// vd.srcObject = stream 在新的浏览器中需使用此代替createObjectURL
self.div_can.appendChild(vd);
}).catch(function (err) {
var p = doc.createElement('p');
p.innerHTML = 'ERROR: ' + err.name +
'<br>该浏览器不支持调用摄像头,请使用夸克浏览器';
self.div_can.appendChild(p);
});
vd.play();
}
},
closeScan: function () {
this.div_can.innerHTML = '';
},
// 截图上传
getImgDecode: function (func) {
var self = this;
var video = doc.getElementById('video_id');
var canvas = doc.createElement('canvas');
canvas.width = 340;
canvas.height = 305;
var ctx = canvas.getContext('2d');
ctx.drawImage(video, 0, 0, 340, 305);
if (canvas.toBlob === undefined) {
var base64 = canvas.toDataURL();
var blob = self.Base64ToBlob(base64);
self.sendBlob(blob, func);
} else {
canvas.toBlob(function (blob) {
self.sendBlob(blob, func);
});
}
},
sendBlob: function (blob, func) {
var fd = new FormData();
fd.append('auth', 'lkl123456');
fd.append('file', blob);
var xhr = new XMLHttpRequest();
xhr.open('post', 'http://123.206.7.80:10082/api/parse', true);
xhr.onload = function () {
func ? func(JSON.parse(xhr.responseText)) : null;
};
xhr.send(fd);
},
Base64ToBlob: function (base64) {
var code = win.atob(base64.split(',')[1]);
var len = code.length;
var as = new Uint8Array(len);
for (var i = 0; i < len; i++) {
as[i] = code.charCodeAt(i);
}
return new Blob([as], {type: 'image/png'});
}
}
win.QRScan = QRScan;
}(window, document));