Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Virtual Try-On</title> | |
| <link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <script> | |
| // Handle the popup window | |
| function openPopup() { | |
| document.getElementById("popup").style.display = "block"; | |
| document.getElementById("emailInput").style.display = "block"; | |
| document.getElementById("submitBtn").style.display = "block"; | |
| document.getElementById("popupMessage").innerText = "Get a free trial key sent to your email"; | |
| } | |
| function closePopup() { | |
| document.getElementById("popup").style.display = "none"; | |
| document.getElementById("emailInput").value = ""; | |
| document.getElementById("popupMessage").innerText = "Get a free trial key sent to your email"; | |
| } | |
| // Handle email submission | |
| function submitEmail() { | |
| const emailInput = document.getElementById("emailInput").value; | |
| fetch("/send_key", { | |
| method: "POST", | |
| headers: { "Content-Type": "application/json" }, | |
| body: JSON.stringify({ email: emailInput }) | |
| }) | |
| .then(response => response.json()) | |
| .then(data => { | |
| document.getElementById("popupMessage").innerText = data.message; | |
| document.getElementById("emailInput").style.display = "none"; | |
| document.getElementById("submitBtn").style.display = "none"; | |
| }) | |
| .catch(err => alert("Error: " + err)); | |
| } | |
| // Handle drag-and-drop and previews | |
| function enableImagePreview(boxId, inputId, previewId, textId, removeButtonId) { | |
| const box = document.getElementById(boxId); | |
| const input = document.getElementById(inputId); | |
| const preview = document.getElementById(previewId); | |
| const text = document.getElementById(textId); | |
| box.addEventListener("dragover", (e) => { | |
| e.preventDefault(); | |
| box.classList.add("drag-over"); | |
| }); | |
| box.addEventListener("dragleave", () => box.classList.remove("drag-over")); | |
| box.addEventListener("drop", (e) => { | |
| e.preventDefault(); | |
| box.classList.remove("drag-over"); | |
| const file = e.dataTransfer.files[0]; | |
| input.files = e.dataTransfer.files; | |
| showPreview(file, preview, text, removeButtonId); | |
| }); | |
| input.addEventListener("change", () => { | |
| if (input.files.length > 0) { | |
| showPreview(input.files[0], preview, text, removeButtonId); | |
| } | |
| }); | |
| } | |
| function showPreview(file, previewElement, textElement, removeButton) { | |
| const reader = new FileReader(); | |
| reader.onload = (e) => { | |
| previewElement.src = e.target.result; | |
| previewElement.style.display = "block"; | |
| textElement.style.display = "none"; | |
| document.getElementById(removeButton).style.display = "flex"; | |
| }; | |
| reader.readAsDataURL(file); | |
| } | |
| function removeImage(inputId, previewId, textId, removeButtonId) { | |
| const input = document.getElementById(inputId); | |
| const preview = document.getElementById(previewId); | |
| const text = document.getElementById(textId); | |
| const removeButton = document.getElementById(removeButtonId); | |
| input.value = ""; // Clear the file input | |
| preview.src = ""; // Clear the preview image | |
| preview.style.display = "none"; | |
| text.style.display = "block"; | |
| removeButton.style.display = "none"; | |
| } | |
| // Submit form with AJAX | |
| function submitForm(event) { | |
| event.preventDefault(); | |
| const formData = new FormData(document.getElementById("imageForm")); | |
| document.getElementById("outputImage").style.display = "none"; | |
| const spinner = document.getElementById("spinner"); | |
| spinner.style.display = "block"; // Unhide the spinner | |
| // Get the key input value and add it to the form data | |
| const keyInput = document.querySelector('.key-input').value; | |
| formData.append('key', keyInput); | |
| fetch("/process", { | |
| method: "POST", | |
| body: formData | |
| }) | |
| .then(response => response.json()) | |
| .then(data => { | |
| if (data.output_image) { | |
| spinner.style.display = "none"; | |
| document.getElementById("outputImage").src = data.output_image; | |
| document.getElementById("outputImage").style.display = "block"; | |
| } else if (data.error) { | |
| alert(data.error); | |
| } | |
| }) | |
| .catch(err => { | |
| spinner.style.display = "none"; // Hide the spinner on error | |
| alert("Error: " + err); | |
| }) | |
| .finally(() => { | |
| spinner.style.display = "none"; // Ensure spinner hides after completion | |
| }); | |
| } | |
| window.onload = () => { | |
| enableImagePreview("box1", "input1", "preview1", "text1", "remove1"); | |
| enableImagePreview("box2", "input2", "preview2", "text2", "remove2"); | |
| document.getElementById("imageForm").addEventListener("submit", submitForm); | |
| }; | |
| </script> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <!-- Title --> | |
| <h1 class="title">Virtual Try-On</h1> | |
| <p> Reach out to <a href="mailto:[email protected]">[email protected]</a> for inquiries. </p> | |
| <!-- Key Input --> | |
| <div class="key-container"> | |
| <input type="text" class="key-input" placeholder="Input your key here"> | |
| </div> | |
| <button type="button" class="get-key-btn" onclick="openPopup()">Get a free key</button> | |
| <!-- Form --> | |
| <form id="imageForm"> | |
| <div class="input-container"> | |
| <div class="box-wrapper"> | |
| <p>Person</p> | |
| <div class="drag-drop-box" id="box1"> | |
| <p id="text1">Person/Model Image</p> | |
| <input type="file" id="input1" name="image1" accept="image/*" required> | |
| <img id="preview1" class="preview" style="display: none;"> | |
| <span class="remove-btn" id="remove1" style="display: none;" onclick="removeImage('input1', 'preview1', 'text1', 'remove1')">Γ</span> | |
| </div> | |
| </div> | |
| <!-- Input Box 2 --> | |
| <div class="box-wrapper"> | |
| <p>Garment</p> | |
| <div class="drag-drop-box" id="box2"> | |
| <p id="text2">Garment Image</p> | |
| <input type="file" id="input2" name="image2" accept="image/*" required> | |
| <img id="preview2" class="preview" style="display: none;"> | |
| <span class="remove-btn" id="remove2" style="display: none;" onclick="removeImage('input2', 'preview2', 'text2', 'remove2')">Γ</span> | |
| </div> | |
| </div> | |
| <!-- Output Container --> | |
| <div class="box-wrapper"> | |
| <p>Result</p> | |
| <div class="output-container"> | |
| <div class="output-box"> | |
| <img id="spinner" src="{{ url_for('static', filename='spinner.gif') }}" style="display: none;" alt="Loading..."> | |
| <img id="outputImage" style="display: none;" alt="Output Image"> | |
| </div> | |
| <!-- Generate Button --> | |
| <button type="submit" class="generate-btn">Generate (~20 sec)</button> | |
| </div> | |
| </div> | |
| </div> | |
| </form> | |
| <div class="image-container"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/kim1.jpg" alt="Image 1"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/kim2.jpg" alt="Image 2"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro-Dev/resolve/main/examples/kim3.jpg" alt="Image 3"> | |
| </div> | |
| <div class="image-container"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/meg1.jpg" alt="Image 1"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/meg2.jpg" alt="Image 2"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/meg3.jpg" alt="Image 3"> | |
| </div> | |
| <div class="image-container"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/bella1.jpg" alt="Image 1"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/bella2.jpg" alt="Image 2"> | |
| <img src="https://huggingface.co/spaces/tonyassi/Virtual-Try-On-Pro/resolve/main/examples/bella3.jpg" alt="Image 3"> | |
| </div> | |
| </div> | |
| <!-- Popup Window --> | |
| <div id="popup" class="popup"> | |
| <div class="popup-content"> | |
| <span class="close-btn" onclick="closePopup()">Γ</span> | |
| <p id="popupMessage">Get a free trial key sent to your gmail</p> | |
| <input type="email" id="emailInput" class="popup-input" placeholder="Email"> | |
| <button id="submitBtn" type="button" class="submit-btn" onclick="submitEmail()">Submit</button> | |
| </div> | |
| </div> | |
| </body> | |
| </html> | |