| const dropZone = document.getElementById('drop-zone');
|
| const imageInput = document.getElementById('image-input');
|
| const previewImg = document.getElementById('preview-img');
|
| const inputPlaceholder = document.getElementById('input-placeholder');
|
| const outputPlaceholder = document.getElementById('output-placeholder');
|
| const transferBtn = document.getElementById('transfer-btn');
|
| const loader = document.getElementById('loader');
|
| const resultImg = document.getElementById('result-img');
|
| const downloadLink = document.getElementById('download-link');
|
| const modeBtns = document.querySelectorAll('.mode-select-btn');
|
|
|
| let currentMode = 'h2z';
|
|
|
|
|
| document.addEventListener('DOMContentLoaded', () => {
|
| document.getElementById('stat-epoch').textContent = '25 / 25';
|
| document.getElementById('stat-gen-loss').textContent = '3.245';
|
| document.getElementById('stat-disc-loss').textContent = '0.457';
|
| });
|
|
|
|
|
| modeBtns.forEach(btn => {
|
| btn.addEventListener('click', (e) => {
|
| modeBtns.forEach(b => b.classList.remove('active'));
|
| btn.classList.add('active');
|
| currentMode = btn.dataset.mode;
|
|
|
|
|
| if (currentMode === 'h2z') {
|
| inputPlaceholder.querySelector('.placeholder-icon').textContent = '🐎';
|
| } else {
|
| inputPlaceholder.querySelector('.placeholder-icon').textContent = '🦓';
|
| }
|
| });
|
| });
|
|
|
|
|
| dropZone.addEventListener('click', () => {
|
| imageInput.click();
|
| });
|
|
|
| imageInput.addEventListener('change', (e) => {
|
| if (e.target.files.length) {
|
| handleFile(e.target.files[0]);
|
| }
|
| });
|
|
|
| function handleFile(file) {
|
| if (!file.type.startsWith('image/')) {
|
| alert('Please select an image file.');
|
| return;
|
| }
|
|
|
| const reader = new FileReader();
|
| reader.onload = (e) => {
|
| previewImg.src = e.target.result;
|
| previewImg.classList.remove('hidden');
|
| inputPlaceholder.classList.add('hidden');
|
| transferBtn.disabled = false;
|
|
|
|
|
| resultImg.classList.add('hidden');
|
| outputPlaceholder.classList.remove('hidden');
|
| };
|
| reader.readAsDataURL(file);
|
| }
|
|
|
|
|
| transferBtn.addEventListener('click', async () => {
|
| const file = imageInput.files[0];
|
| if (!file) return;
|
|
|
|
|
| transferBtn.disabled = true;
|
| loader.classList.remove('hidden');
|
| outputPlaceholder.classList.add('hidden');
|
| resultImg.classList.add('hidden');
|
|
|
| const formData = new FormData();
|
| formData.append('image', file);
|
| formData.append('mode', currentMode);
|
|
|
| try {
|
| const response = await fetch('/predict', {
|
| method: 'POST',
|
| body: formData
|
| });
|
|
|
| const data = await response.json();
|
|
|
| if (data.success) {
|
| resultImg.src = data.result;
|
| resultImg.classList.remove('hidden');
|
| downloadLink.href = data.result;
|
| downloadLink.download = `cyclegan_${currentMode}_${Date.now()}.png`;
|
| } else {
|
| alert('Transfer failed: ' + data.error);
|
| outputPlaceholder.classList.remove('hidden');
|
| }
|
| } catch (err) {
|
| alert('Communication error with server.');
|
| console.error(err);
|
| outputPlaceholder.classList.remove('hidden');
|
| } finally {
|
| loader.classList.add('hidden');
|
| transferBtn.disabled = false;
|
| }
|
| });
|
|
|