mirror the video for user facing cameras

This commit is contained in:
danimoh committed 2018-01-18 17:51:20 -06:00
1 parent 45e8429fd6
commit 67c351ff21
3 files changed
+51 -26

No files matched your search

+7 -6
View File
@@ -1,10 +1,11 @@
'use strict';class QrScanner{constructor(a,b,c=QrScanner.DEFAULT_CANVAS_SIZE){this.$video=a;this.$canvas=document.createElement("canvas");this._onDecode=b;this._active=false;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){if(a&&
!this._active){this._cameraOn();this._active=true}else{this._cameraOff();this._active=false}}_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,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;
!this._active){this._cameraOn();this._active=true}else{this._cameraOff();this._active=false}}_getCameraStream(a,b=false){const c=[{width:{min:1024}},{width:{min:768}},{}];if(a){b&&(a={exact:a});c.forEach((b)=>b.facingMode=a)}return this._getMatchingCameraStream(c)}_getMatchingCameraStream(a){return a.length===0?Promise.reject("Camera not found."):navigator.mediaDevices.getUserMedia({video:a.shift()}).catch(()=>this._getMatchingCameraStream(a))}_cameraOn(){clearTimeout(this._offTimeout);let a="environment";
this._getCameraStream("environment",true).catch(()=>{a="user";return this._getCameraStream()}).then((b)=>{this.$video.srcObject=b;this._setVideoMirror(a)})}_cameraOff(){this.$video.pause();this._offTimeout=setTimeout(()=>{this.$video.srcObject.getTracks()[0].stop();this.$video.srcObject=null},3E3)}_setVideoMirror(a){this.$video.style.transform="scaleX("+(a==="user"?-1:1)+")"}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,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
+1 -1
View File
@@ -1 +1 @@
{"version":3,"sources":["qr-scanner.js"],"names":["QrScanner","video","onDecode","canvasSize","DEFAULT_CANVAS_SIZE","$video","$canvas","document","createElement","_onDecode","_active","width","height","_sourceRect","x","y","addEventListener","_updateSourceRect","_scanFrame","_qrWorker","Worker","sourceRectSize","Math","round","min","smallestDimension","videoWidth","videoHeight","paused","ended","requestAnimationFrame","scanImage","then","error","console","active","_cameraOn","_cameraOff","settingsToTry","clearTimeout","_offTimeout","defaultSettings","facingMode","navigator","mediaDevices","getUserMedia","shift","stream","srcObject","catch","length","Error","pause","setTimeout","getTracks","stop","red","green","blue","postMessage","type","data","imageOrFileOrUrl","sourceRect","worker","canvas","fixedCanvasSize","alsoTryWithoutSourceRect","promise","Promise","resolve","reject","timeout","onMessage","onError","event","removeEventListener","_loadImage","image","imageData","_getImageData","buffer","sourceRectX","sourceRectY","sourceRectWidth","sourceRectHeight","context","getContext","alpha","imageSmoothingEnabled","drawImage","getImageData","HTMLCanvasElement","HTMLVideoElement","window","ImageBitmap","OffscreenCanvas","Image","_awaitImageLoad","File","URL","src","createObjectURL","revokeObjectURL","complete","naturalWidth","onLoad"],"mappings":"A,aAAA,KAAMA,UAAN,CACI,WAAW,CAACC,CAAD,CAAQC,CAAR,CAAkBC,CAAA,CAAaH,SAAAI,oBAA/B,CAA8D,CACrE,IAAAC,OAAA,CAAcJ,CACd,KAAAK,QAAA,CAAeC,QAAAC,cAAA,CAAuB,QAAvB,CACf,KAAAC,UAAA,CAAiBP,CACjB,KAAAQ,QAAA,CAAe,KAEf,KAAAJ,QAAAK,MAAA,CAAqBR,CACrB,KAAAG,QAAAM,OAAA,CAAsBT,CACtB,KAAAU,YAAA,CAAmB,CACfC,EAAG,CADY,CAEfC,EAAG,CAFY,CAGfJ,MAAOR,CAHQ,CAIfS,OAAQT,CAJO,CAOnB,KAAAE,OAAAW,iBAAA,CAA6B,SAA7B,CAAwC,EAAA,EAAM,IAAAC,kBAAA,EAA9C,CACA,KAAAZ,OAAAW,iBAAA,CAA6B,MAA7B,CAAqC,EAAA,EAAM,CACvC,IAAAC,kBAAA,EACA,KAAAC,WAAA,EAFuC,CAA3C,CAGG,KAHH,CAIA,KAAAC,UAAA,CAAiB,IAAIC,MAAJ,CAAW,sCAAX,CApBoD,CAuBzE,iBAAiB,EAAG,CAEhB,MAAMC;AAAiBC,IAAAC,MAAA,CAAW,CAAX,CAAe,CAAf,CADGD,IAAAE,IAAAC,CAAS,IAAApB,OAAAqB,WAATD,CAAiC,IAAApB,OAAAsB,YAAjCF,CACH,CACvB,KAAAZ,YAAAF,MAAA,CAAyB,IAAAE,YAAAD,OAAzB,CAAmDS,CACnD,KAAAR,YAAAC,EAAA,EAAsB,IAAAT,OAAAqB,WAAtB,CAA+CL,CAA/C,EAAiE,CACjE,KAAAR,YAAAE,EAAA,EAAsB,IAAAV,OAAAsB,YAAtB,CAAgDN,CAAhD,EAAkE,CALlD,CAQpB,UAAU,EAAG,CACT,GAAI,IAAAhB,OAAAuB,OAAJ,EAA0B,IAAAvB,OAAAwB,MAA1B,CAA6C,MAAO,MACpDC,sBAAA,CAAsB,EAAA,EAAM,CACxB9B,SAAA+B,UAAA,CAAoB,IAAA1B,OAApB,CAAiC,IAAAQ,YAAjC,CAAmD,IAAAM,UAAnD,CAAmE,IAAAb,QAAnE,CAAiF,IAAjF,CAAA0B,KAAA,CACU,IAAAvB,UADV,CAC0B,CAAAwB,CAAA,CAAA,EAAS,CACvBA,CAAJ,GAAc,oBAAd,EACIC,OAAAD,MAAA,CAAcA,CAAd,CAFuB,CADnC,CAAAD,KAAA,CAMU,EAAA,EAAM,IAAAd,WAAA,EANhB,CADwB,CAA5B,CAFS,CAaT,UAAO,CAAAiB,CAAA,CAAQ,CACf,GAAIA,CAAJ;AAAc,CAAC,IAAAzB,QAAf,CAA6B,CACzB,IAAA0B,UAAA,EACA,KAAA1B,QAAA,CAAe,IAFU,CAA7B,IAGO,CACH,IAAA2B,WAAA,EACA,KAAA3B,QAAA,CAAe,KAFZ,CAJQ,CAUnB,SAAS,CAAC4B,CAAD,CAAgB,CACrBC,YAAA,CAAa,IAAAC,YAAb,CACA,OAAMC,EAAkB,CAAC,CACrBC,WAAY,aADS,CAErB/B,MAAO,CAAEa,IAAK,IAAP,CAFc,CAAD,CAGrB,CACCkB,WAAY,aADb,CAEC/B,MAAO,CAAEa,IAAK,GAAP,CAFR,CAHqB,CAMrB,CACCkB,WAAY,aADb,CANqB,CASxBJ,EAAA,CAAgBA,CAAhB,EAAiCG,CACjCE,UAAAC,aAAAC,aAAA,CAAoC,CAChC5C,MAAOqC,CAAAQ,MAAA,EADyB,CAApC,CAAAd,KAAA,CAGU,CAAAe,CAAA,CAAA,EAAU,IAAA1C,OAAA2C,UAAV,CAAkCD,CAH5C,CAAAE,MAAA,CAIW,EAAA,EAAM,CACT,GAAIX,CAAAY,OAAJ,CAA2B,CAA3B,CACI,IAAAd,UAAA,CAAeE,CAAf,CADJ,KAGI,MAAUa,MAAJ,CAAU,uBAAV,CAAN,CAJK,CAJjB,CAZqB,CAyBzB,UAAU,EAAG,CACT,IAAA9C,OAAA+C,MAAA,EACA,KAAAZ,YAAA,CAAmBa,UAAA,CAAW,EAAA;AAAM,IAAAhD,OAAA2C,UAAAM,UAAA,EAAA,CAAkC,CAAlC,CAAAC,KAAA,EAAjB,CAA8D,GAA9D,CAFV,CAKb,mBAAmB,CAACC,CAAD,CAAMC,CAAN,CAAaC,CAAb,CAAmB,CAClC,IAAAvC,UAAAwC,YAAA,CAA2B,CACvBC,KAAM,kBADiB,CAEvBC,KAAM,CAAEL,IAAAA,CAAF,CAAOC,MAAAA,CAAP,CAAcC,KAAAA,CAAd,CAFiB,CAA3B,CADkC,CAQtC,gBAAgB,CAACI,CAAD,CAAmBC,CAAA,CAAW,IAA9B,CAAoCC,CAAA,CAAO,IAA3C,CAAiDC,CAAA,CAAO,IAAxD,CAA8DC,CAAA,CAAgB,KAA9E,CACCC,CAAA,CAAyB,KAD1B,CACiC,CAC7C,MAAMC,EAAU,IAAIC,OAAJ,CAAY,CAACC,CAAD,CAAUC,CAAV,CAAA,EAAqB,CAC7CP,CAAA,CAASA,CAAT,EAAmB,IAAI5C,MAAJ,CAAW,sCAAX,CAD0B,KAEzCoD,CAFyC,CAEhCC,CAFgC,CAErBC,CACxBD,EAAA,CAAY,CAAAE,CAAA,CAAAF,EAAS,CACjB,GAAIE,CAAAd,KAAAD,KAAJ,GAAwB,UAAxB,CAAA,CAGAI,CAAAY,oBAAA,CAA2B,SAA3B,CAAsCH,CAAtC,CACAT,EAAAY,oBAAA,CAA2B,OAA3B,CAAoCF,CAApC,CACAnC,aAAA,CAAaiC,CAAb,CACIG,EAAAd,KAAAA,KAAJ,GAAwB,IAAxB,CACIS,CAAA,CAAQK,CAAAd,KAAAA,KAAR,CADJ,CAGIU,CAAA,CAAO,oBAAP,CATJ,CADiB,CAarBG,EAAA,CAAU,EAAAA,EAAM,CACZV,CAAAY,oBAAA,CAA2B,SAA3B;AAAsCH,CAAtC,CACAT,EAAAY,oBAAA,CAA2B,OAA3B,CAAoCF,CAApC,CACAnC,aAAA,CAAaiC,CAAb,CACAD,EAAA,CAAO,eAAP,CAJY,CAMhBP,EAAAhD,iBAAA,CAAwB,SAAxB,CAAmCyD,CAAnC,CACAT,EAAAhD,iBAAA,CAAwB,OAAxB,CAAiC0D,CAAjC,CACAF,EAAA,CAAUnB,UAAA,CAAWqB,CAAX,CAAoB,GAApB,CACV1E,UAAA6E,WAAA,CAAqBf,CAArB,CAAA9B,KAAA,CAA4C,CAAA8C,CAAA,CAAA,EAAS,CAC3CC,CAAAA,CAAY/E,SAAAgF,cAAA,CAAwBF,CAAxB,CAA+Bf,CAA/B,CAA2CE,CAA3C,CAAmDC,CAAnD,CAClBF,EAAAL,YAAA,CAAmB,CACfC,KAAM,QADS,CAEfC,KAAMkB,CAFS,CAAnB,CAGG,CAACA,CAAAlB,KAAAoB,OAAD,CAHH,CAFiD,CAArD,CAAAhC,MAAA,CAMSsB,CANT,CAzB6C,CAAjC,CAkChB,OAAIR,EAAJ,EAAkBI,CAAlB,CACWC,CAAAnB,MAAA,CAAc,EAAA,Line truncated
{"version":3,"sources":["qr-scanner.js"],"names":["QrScanner","video","onDecode","canvasSize","DEFAULT_CANVAS_SIZE","$video","$canvas","document","createElement","_onDecode","_active","width","height","_sourceRect","x","y","addEventListener","_updateSourceRect","_scanFrame","_qrWorker","Worker","sourceRectSize","Math","round","min","smallestDimension","videoWidth","videoHeight","paused","ended","requestAnimationFrame","scanImage","then","error","console","active","_cameraOn","_cameraOff","facingMode","exact","constraintsToTry","forEach","constraint","_getMatchingCameraStream","length","Promise","reject","navigator","mediaDevices","getUserMedia","shift","catch","clearTimeout","_offTimeout","_getCameraStream","stream","srcObject","_setVideoMirror","pause","setTimeout","getTracks","stop","style","transform","scaleFactor","red","green","blue","postMessage","type","data","imageOrFileOrUrl","sourceRect","worker","canvas","fixedCanvasSize","alsoTryWithoutSourceRect","promise","resolve","timeout","onMessage","onError","event","removeEventListener","_loadImage","image","imageData","_getImageData","buffer","sourceRectX","sourceRectY","sourceRectWidth","sourceRectHeight","context","getContext","alpha","imageSmoothingEnabled","drawImage","getImageData","HTMLCanvasElement","HTMLVideoElement","window","ImageBitmap","OffscreenCanvas","Image","_awaitImageLoad","File","URL","src","createObjectURL","revokeObjectURL","complete","naturalWidth","onLoad"],"mappings":"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 truncated
+43 -19
View File
@@ -53,34 +53,58 @@ class QrScanner {
}
}
_cameraOn(settingsToTry) {
clearTimeout(this._offTimeout);
const defaultSettings = [{
facingMode: "environment",
_getCameraStream(facingMode, exact = false) {
const constraintsToTry = [{
width: { min: 1024 }
}, {
facingMode: "environment",
width: { min: 768 }
}, {
facingMode: "environment",
}];
settingsToTry = settingsToTry || defaultSettings;
navigator.mediaDevices.getUserMedia({
video: settingsToTry.shift()
})
.then(stream => this.$video.srcObject = stream)
}, {}];
if (facingMode) {
if (exact) {
facingMode = { exact: facingMode };
}
constraintsToTry.forEach(constraint => constraint.facingMode = facingMode);
}
return this._getMatchingCameraStream(constraintsToTry);
}
_getMatchingCameraStream(constraintsToTry) {
if (constraintsToTry.length === 0) {
return Promise.reject('Camera not found.');
}
return navigator.mediaDevices.getUserMedia({
video: constraintsToTry.shift()
}).catch(() => this._getMatchingCameraStream(constraintsToTry));
}
_cameraOn() {
clearTimeout(this._offTimeout);
let facingMode = 'environment';
this._getCameraStream('environment', true)
.catch(() => {
if (settingsToTry.length > 0) {
this._cameraOn(settingsToTry)
} else {
throw new Error('Couldn\'t start camera');
}
// we (probably) don't have an environment camera
facingMode = 'user';
return this._getCameraStream();
})
.then(stream => {
this.$video.srcObject = stream;
this._setVideoMirror(facingMode);
});
}
_cameraOff() {
this.$video.pause();
this._offTimeout = setTimeout(() => this.$video.srcObject.getTracks()[0].stop(), 3000);
this._offTimeout = setTimeout(() => {
this.$video.srcObject.getTracks()[0].stop();
this.$video.srcObject = null;
}, 3000);
}
_setVideoMirror(facingMode) {
// in user facing mode mirror the video to make it easier for the user to position the QR code
const scaleFactor = facingMode==='user'? -1 : 1;
this.$video.style.transform = 'scaleX(' + scaleFactor + ')';
}
setGrayscaleWeights(red, green, blue) {