class ImageHandler { constructor( maxImageSize = 10e6, //10MB clearOnInit = true ) { this.resultImg = document.getElementById('resultImg'); this.maxImageSize = maxImageSize; this.validTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; this.scDropZone = document.getElementById('scDropZone'); this.scDropImages = document.getElementById('scDropImages'); this.scRunBtn = document.getElementById('scRunBtn'); this.scDeleteBtn = document.getElementById('scDeleteBtn'); if (clearOnInit) this.clearImages(); else { for (var i = 0; i < this.scDropImages.children.length; i++) { let child = this.scDropImages.children[i]; if (child.tagName == 'IMG') { if (child.className == "hoverDropImage") child.className = ""; this.processNewImage(child); } } } this.initButtons(); this.scDropZone.addEventListener('drop', e => this.processDrop(e)); this.scDropZone.addEventListener('dragover', e => this.processDragOver(e)); } initButtons() { var scBtnBox = document.getElementById('scBtnBox'); for (var i = 0; i < scBtnBox.children.length; i++) { let child = scBtnBox.children[i]; if (child.tagName == "BUTTON") { child.addEventListener( 'mouseover', function () { child.className = 'hoverScBtn'; } ); child.addEventListener( 'mouseout', function () { child.className = ''; } ); } } // TODO: scRunBtn this.scRunBtn.addEventListener( 'mouseup', (e) => this.run() ); // scDeleteBtn this.scDeleteBtn.addEventListener( 'mouseup', (e) => this.deleteSelectedImage() ); } deleteSelectedImage() { for (var i = this.scDropImages.children.length - 1; i >= 0; i--) { let child = this.scDropImages.children[i]; if (child.tagName == 'IMG') { if (child.className == "selectedDropImage") { this.scDropImages.removeChild(child); break; } } } } clearImages() { this.scDropImages.innerHTML = ""; } validateDroppedImage(image) { if (this.validTypes.indexOf(image.type) == -1) { console.log('Invalid File Type: ' + image.type); return false; } if (image.size > this.maxImageSize) { console.log('File is too large: ' + image.size); return false } return true; } processNewImage(img) { img.addEventListener( 'mouseover', function () { if (img.className != "selectedDropImage") img.className = "hoverDropImage"; } ); img.addEventListener( 'mouseout', function () { if (img.className != "selectedDropImage") img.className = ""; } ); img.addEventListener( 'mouseup', function () { if (img.className == "hoverDropImage") { var existingSelectedImages = document.getElementsByClassName("selectedDropImage"); for (var i = 0; i < existingSelectedImages.length; i++) existingSelectedImages[i].className = ""; img.className = "selectedDropImage"; } } ) } /** * Refer to https://soshace.com/the-ultimate-guide-to-drag-and-drop-image-uploading-with-pure-javascript/ * @param {object} event */ processDrop(event) { // Prevent default behavior (Prevent file from being opened) event.preventDefault(); var dt = event.dataTransfer; var files = dt.files; if (files.length > 0) { for (var i = 0; i < files.length; i++) { if (this.validateDroppedImage(files[i])) { var img = document.createElement('img'); var reader = new FileReader(); reader.onload = function (e) { img.src = e.target.result; // imageNav.sources.push(e.target.result); } this.processNewImage(img); reader.readAsDataURL(files[i]); this.scDropImages.appendChild(img); } } } else { // console.log('Dropped ' + files.length + ' files.'); } } processDragOver(event) { // console.log('File(s) in drop zone'); // Prevent default behavior (Prevent file from being opened) event.preventDefault(); } get maxSideLength() { var result = document.getElementById('scMaxSidePromptInput').value; return Number(result); } get numIterations() { var result = document.getElementById('scNumItersInput').value; return Number(result); } async infer(imgData) { try { let url = '../../superres?maxSideLength=' + this.maxSideLength + '&&numIterations=' + this.numIterations; let res = await fetch( url, { method: 'POST', body: imgData } ); return await res.json(); } catch (error) { console.log(error); } } async run() { let imgData = null; for (var i = this.scDropImages.children.length - 1; i >= 0; i--) { let child = this.scDropImages.children[i]; if (child.tagName == 'IMG') { if (child.className == "selectedDropImage") { imgData = child.src; break; } } } if (imgData != null) { this.resultImg.src = '../static/img/loadingScreen.webp'; let result = await this.infer(imgData); // result['isError'] if (result == null) { this.resultImg.src = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR_0fzX1q44MiXQupdeYQTpGd_vAHs9zvTTVLxkfJu6g0RL9oawDeC5Edf-kRt27ygD4ZQ&usqp=CAU'; } else this.resultImg.src = result.data; } } } var imageHandler = new ImageHandler( maxImageSize = 10e6, clearOnInit = true );