Няма описание

utils.js 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. function Utils(errorOutputId) { // eslint-disable-line no-unused-vars
  2. let self = this;
  3. this.errorOutput = document.getElementById(errorOutputId);
  4. const OPENCV_URL = 'opencv.js';
  5. this.loadOpenCv = function(onloadCallback) {
  6. let script = document.createElement('script');
  7. script.setAttribute('async', '');
  8. script.setAttribute('type', 'text/javascript');
  9. script.addEventListener('load', () => {
  10. if (cv.getBuildInformation)
  11. {
  12. console.log(cv.getBuildInformation());
  13. onloadCallback();
  14. }
  15. else
  16. {
  17. // WASM
  18. cv['onRuntimeInitialized']=()=>{
  19. console.log(cv.getBuildInformation());
  20. onloadCallback();
  21. }
  22. }
  23. });
  24. script.addEventListener('error', () => {
  25. self.printError('Failed to load ' + OPENCV_URL);
  26. });
  27. script.src = OPENCV_URL;
  28. let node = document.getElementsByTagName('script')[0];
  29. node.parentNode.insertBefore(script, node);
  30. };
  31. this.createFileFromUrl = function(path, url, callback) {
  32. let request = new XMLHttpRequest();
  33. request.open('GET', url, true);
  34. request.responseType = 'arraybuffer';
  35. request.onload = function(ev) {
  36. if (request.readyState === 4) {
  37. if (request.status === 200) {
  38. let data = new Uint8Array(request.response);
  39. cv.FS_createDataFile('/', path, data, true, false, false);
  40. callback();
  41. } else {
  42. self.printError('Failed to load ' + url + ' status: ' + request.status);
  43. }
  44. }
  45. };
  46. request.send();
  47. };
  48. this.loadImageToCanvas = function(url, cavansId) {
  49. let canvas = document.getElementById(cavansId);
  50. let ctx = canvas.getContext('2d');
  51. let img = new Image();
  52. img.crossOrigin = 'anonymous';
  53. img.onload = function() {
  54. canvas.width = img.width;
  55. canvas.height = img.height;
  56. ctx.drawImage(img, 0, 0, img.width, img.height);
  57. };
  58. img.src = url;
  59. };
  60. this.executeCode = function(textAreaId) {
  61. try {
  62. this.clearError();
  63. let code = document.getElementById(textAreaId).value;
  64. eval(code);
  65. } catch (err) {
  66. this.printError(err);
  67. }
  68. };
  69. this.clearError = function() {
  70. this.errorOutput.innerHTML = '';
  71. };
  72. this.printError = function(err) {
  73. if (typeof err === 'undefined') {
  74. err = '';
  75. } else if (typeof err === 'number') {
  76. if (!isNaN(err)) {
  77. if (typeof cv !== 'undefined') {
  78. err = 'Exception: ' + cv.exceptionFromPtr(err).msg;
  79. }
  80. }
  81. } else if (typeof err === 'string') {
  82. let ptr = Number(err.split(' ')[0]);
  83. if (!isNaN(ptr)) {
  84. if (typeof cv !== 'undefined') {
  85. err = 'Exception: ' + cv.exceptionFromPtr(ptr).msg;
  86. }
  87. }
  88. } else if (err instanceof Error) {
  89. err = err.stack.replace(/\n/g, '<br>');
  90. }
  91. this.errorOutput.innerHTML = err;
  92. };
  93. this.loadCode = function(scriptId, textAreaId) {
  94. let scriptNode = document.getElementById(scriptId);
  95. let textArea = document.getElementById(textAreaId);
  96. if (scriptNode.type !== 'text/code-snippet') {
  97. throw Error('Unknown code snippet type');
  98. }
  99. textArea.value = scriptNode.text.replace(/^\n/, '');
  100. };
  101. this.addFileInputHandler = function(fileInputId, canvasId) {
  102. let inputElement = document.getElementById(fileInputId);
  103. inputElement.addEventListener('change', (e) => {
  104. let files = e.target.files;
  105. if (files.length > 0) {
  106. let imgUrl = URL.createObjectURL(files[0]);
  107. self.loadImageToCanvas(imgUrl, canvasId);
  108. }
  109. }, false);
  110. };
  111. function onVideoCanPlay() {
  112. if (self.onCameraStartedCallback) {
  113. self.onCameraStartedCallback(self.stream, self.video);
  114. }
  115. };
  116. this.startCamera = function(resolution, callback, videoId) {
  117. const constraints = {
  118. 'qvga': {width: {exact: 320}, height: {exact: 240}},
  119. 'vga': {width: {exact: 640}, height: {exact: 480}}};
  120. let video = document.getElementById(videoId);
  121. if (!video) {
  122. video = document.createElement('video');
  123. }
  124. let videoConstraint = constraints[resolution];
  125. if (!videoConstraint) {
  126. videoConstraint = true;
  127. }
  128. navigator.mediaDevices.getUserMedia({video: videoConstraint, audio: false})
  129. .then(function(stream) {
  130. video.srcObject = stream;
  131. video.play();
  132. self.video = video;
  133. self.stream = stream;
  134. self.onCameraStartedCallback = callback;
  135. video.addEventListener('canplay', onVideoCanPlay, false);
  136. })
  137. .catch(function(err) {
  138. self.printError('Camera Error: ' + err.name + ' ' + err.message);
  139. });
  140. };
  141. this.stopCamera = function() {
  142. if (this.video) {
  143. this.video.pause();
  144. this.video.srcObject = null;
  145. this.video.removeEventListener('canplay', onVideoCanPlay);
  146. }
  147. if (this.stream) {
  148. this.stream.getVideoTracks()[0].stop();
  149. }
  150. };
  151. };