option to scan on the whole image if scanning within sourceRect failed

This commit is contained in:
danimoh
2018-01-12 15:35:37 +01:00
parent 5b7f4685ac
commit b49910729d
3 changed files with 15 additions and 8 deletions
+5 -5
View File
@@ -1,10 +1,10 @@
'use strict';class QrScanner{constructor(a,b,c=QrScanner.DEFAULT_CANVAS_SIZE){this.$video=a;this.$canvas=document.createElement("canvas");this._onDecode=b;this.$canvas.width=c;this.$canvas.height=c;this._sourceRect={x:0,y:0,width:c,height:c};this.$video.addEventListener("canplay",()=>this._updateSourceRect());this.$video.addEventListener("play",()=>{this._updateSourceRect();this._scanFrame()},false);this._qrWorker=new Worker("/qr-scanner/qr-scanner-worker.min.js")}_updateSourceRect(){const a=Math.round(2/
3*Math.min(this.$video.videoWidth,this.$video.videoHeight));this._sourceRect.width=this._sourceRect.height=a;this._sourceRect.x=(this.$video.videoWidth-a)/2;this._sourceRect.y=(this.$video.videoHeight-a)/2}_scanFrame(){if(this.$video.paused||this.$video.ended)return false;requestAnimationFrame(()=>{QrScanner.scanImage(this.$video,this._sourceRect,this._qrWorker,this.$canvas,true).then(this._onDecode,(a)=>{a!=="QR code not found."&&console.error(a)}).then(()=>this._scanFrame())})}set active(a){a?this._cameraOn():
this._cameraOff()}_cameraOn(a){clearTimeout(this._offTimeout);const b=[{facingMode:"environment",width:{min:1024}},{facingMode:"environment",width:{min:768}},{facingMode:"environment"}];a=a||b;navigator.mediaDevices.getUserMedia({video:a.shift()}).then((a)=>this.$video.srcObject=a).catch(()=>{if(a.length>0)this._cameraOn(a);else throw Error("Couldn't start camera");})}_cameraOff(){this.$video.pause();this._offTimeout=setTimeout(()=>this.$video.srcObject.getTracks()[0].stop(),3E3)}setGrayscaleWeights(a,
b,c){this._qrWorker.postMessage({type:"grayscaleWeights",data:{red:a,green:b,blue:c}})}static scanImage(a,b=null,c=null,d=null,e=false){return new Promise((k,f)=>{c=c||new Worker("/qr-scanner/qr-scanner-worker.min.js");let l,h,g;h=(a)=>{if(a.data.type==="qrResult"){c.removeEventListener("message",h);c.removeEventListener("error",g);clearTimeout(l);a.data.data!==null?k(a.data.data):f("QR code not found.")}};g=()=>{c.removeEventListener("message",h);c.removeEventListener("error",g);clearTimeout(l);
f("Worker error.")};c.addEventListener("message",h);c.addEventListener("error",g);l=setTimeout(g,3E3);QrScanner._loadImage(a).then((a)=>{a=QrScanner._getImageData(a,b,d,e);c.postMessage({type:"decode",data:a},[a.data.buffer])}).catch(f)})}static _getImageData(a,b=null,c=null,d=false){c=c||document.createElement("canvas");const e=b&&b.x?b.x:0,k=b&&b.y?b.y:0,f=b&&b.width?b.width:a.width||a.videoWidth;b=b&&b.height?b.height:a.height||a.videoHeight;if(!d&&(c.width!==f||c.height!==b)){c.width=f;c.height=
b}d=c.getContext("2d",{alpha:false});d.imageSmoothingEnabled=false;d.drawImage(a,e,k,f,b,0,0,c.width,c.height);return d.getImageData(0,0,c.width,c.height)}static _loadImage(a){if(a instanceof HTMLCanvasElement||a instanceof HTMLVideoElement||window.ImageBitmap&&a instanceof window.ImageBitmap||window.OffscreenCanvas&&a instanceof window.OffscreenCanvas)return Promise.resolve(a);if(a instanceof Image)return QrScanner._awaitImageLoad(a).then(()=>a);if(a instanceof File||a instanceof URL||typeof a===
"string"){const b=new Image;b.src=a instanceof File?URL.createObjectURL(a):a;return QrScanner._awaitImageLoad(b).then(()=>{a instanceof File&&URL.revokeObjectURL(b.src);return b})}return Promise.reject("Unsupported image type.")}static _awaitImageLoad(a){return new Promise((b,c)=>{if(a.complete&&a.naturalWidth!==0)b();else{let d,e;d=()=>{a.removeEventListener("load",d);a.removeEventListener("error",e);b()};e=()=>{a.removeEventListener("load",d);a.removeEventListener("error",e);c("Image load error")};
a.addEventListener("load",d);a.addEventListener("error",e)}})}}QrScanner.DEFAULT_CANVAS_SIZE=400;
b,c){this._qrWorker.postMessage({type:"grayscaleWeights",data:{red:a,green:b,blue:c}})}static scanImage(a,b=null,c=null,d=null,e=false,g=false){const f=new Promise((f,g)=>{c=c||new Worker("/qr-scanner/qr-scanner-worker.min.js");let l,k,h;k=(a)=>{if(a.data.type==="qrResult"){c.removeEventListener("message",k);c.removeEventListener("error",h);clearTimeout(l);a.data.data!==null?f(a.data.data):g("QR code not found.")}};h=()=>{c.removeEventListener("message",k);c.removeEventListener("error",h);clearTimeout(l);
g("Worker error.")};c.addEventListener("message",k);c.addEventListener("error",h);l=setTimeout(h,3E3);QrScanner._loadImage(a).then((a)=>{a=QrScanner._getImageData(a,b,d,e);c.postMessage({type:"decode",data:a},[a.data.buffer])}).catch(g)});return b&&g?f.catch(()=>QrScanner.scanImage(a,null,c,d,e)):f}static _getImageData(a,b=null,c=null,d=false){c=c||document.createElement("canvas");const e=b&&b.x?b.x:0,g=b&&b.y?b.y:0,f=b&&b.width?b.width:a.width||a.videoWidth;b=b&&b.height?b.height:a.height||a.videoHeight;
if(!d&&(c.width!==f||c.height!==b)){c.width=f;c.height=b}d=c.getContext("2d",{alpha:false});d.imageSmoothingEnabled=false;d.drawImage(a,e,g,f,b,0,0,c.width,c.height);return d.getImageData(0,0,c.width,c.height)}static _loadImage(a){if(a instanceof HTMLCanvasElement||a instanceof HTMLVideoElement||window.ImageBitmap&&a instanceof window.ImageBitmap||window.OffscreenCanvas&&a instanceof window.OffscreenCanvas)return Promise.resolve(a);if(a instanceof Image)return QrScanner._awaitImageLoad(a).then(()=>
a);if(a instanceof File||a instanceof URL||typeof a==="string"){const b=new Image;b.src=a instanceof File?URL.createObjectURL(a):a;return QrScanner._awaitImageLoad(b).then(()=>{a instanceof File&&URL.revokeObjectURL(b.src);return b})}return Promise.reject("Unsupported image type.")}static _awaitImageLoad(a){return new Promise((b,c)=>{if(a.complete&&a.naturalWidth!==0)b();else{let d,e;d=()=>{a.removeEventListener("load",d);a.removeEventListener("error",e);b()};e=()=>{a.removeEventListener("load",d);
a.removeEventListener("error",e);c("Image load error")};a.addEventListener("load",d);a.addEventListener("error",e)}})}}QrScanner.DEFAULT_CANVAS_SIZE=400;
//# sourceMappingURL=qr-scanner.min.js.map
File diff suppressed because one or more lines are too long
+9 -2
View File
@@ -87,8 +87,9 @@ class QrScanner {
}
/* async */
static scanImage(imageOrFileOrUrl, sourceRect=null, worker=null, canvas=null, fixedCanvasSize=false) {
return new Promise((resolve, reject) => {
static scanImage(imageOrFileOrUrl, sourceRect=null, worker=null, canvas=null, fixedCanvasSize=false,
alsoTryWithoutSourceRect=false) {
const promise = new Promise((resolve, reject) => {
worker = worker || new Worker('/qr-scanner/qr-scanner-worker.min.js');
let timeout, onMessage, onError;
onMessage = event => {
@@ -121,6 +122,12 @@ class QrScanner {
}, [imageData.data.buffer]);
}).catch(reject);
});
if (sourceRect && alsoTryWithoutSourceRect) {
return promise.catch(() => QrScanner.scanImage(imageOrFileOrUrl, null, worker, canvas, fixedCanvasSize));
} else {
return promise;
}
}
/* async */