¿Listo para probarlo?
Sube una foto de cuerpo entero para ver cómo te queda.
Al usar este servicio, aceptas nuestros Términos de Servicio y Política de Privacidad.
LA IA PUEDE COMETER ERRORES.
'; document.body.appendChild(mask); } function hideUploadMask(){ let mask = document.getElementById('dutUploadMask'); if(mask) mask.remove(); } // DOM元素 var btnSelectPhoto = document.getElementById('btnSelectPhoto'); var selectPhotoInput = document.getElementById('selectPhotoInput'); var uploadPage = document.getElementById('uploadPage'); var loadingPage = document.getElementById('loadingPage'); var resultPage = document.getElementById('resultPage'); var progressBar = document.getElementById('progressBar'); var progressText = document.getElementById('progressText'); var btnTryAgain = document.getElementById('btnTryAgain'); var loadUserImg = document.getElementById('loadUserImg'); var finalResultImg = document.getElementById('finalResultImg'); // 初始化 setActiveStep(1); initTryCount(); updateCountTip(); // 选择图片 无弹窗,禁用按钮 btnSelectPhoto.addEventListener('click', ()=>{ if(isOverTryLimit()) return; selectPhotoInput.value = ''; selectPhotoInput.click(); }); // 图片上传逻辑 selectPhotoInput.addEventListener('change', async (e)=>{ const file = e.target.files[0]; if(!file) return; // 显示加载蒙层 showUploadMask(); // 禁用选图按钮 btnSelectPhoto.disabled = true; const localUrl = URL.createObjectURL(file); loadUserImg.src = localUrl; const formData = new FormData(); formData.append("file", file); try { const response = await fetch(UPLOAD_API, { method:"POST", body:formData }); const uploadData = await response.json(); const signResponse = await fetch(SIGN_URL_API, { method:"POST", headers:{ "Content-Type":"application/json" }, body:JSON.stringify({ pathname: uploadData.pathname }) }); const signData = await signResponse.json(); const personImage = signData.url; // 切到第二步 setActiveStep(2); uploadPage.classList.add("dut-try-on-hidden"); loadingPage.style.display = "flex"; loadingPage.classList.remove("fade-out"); resultPage.classList.remove("show"); startProgress(); const aiResponse = await fetch("https://app.dutties.com/api/tryon", { method:"POST", headers:{ "Content-Type":"application/json" }, body:JSON.stringify({ personImage: personImage, garmentImage: document.getElementById('dutTryOnGoodsShowImg').src || "", }) }); const aiData = await aiResponse.json(); const taskId = aiData.id; if(!taskId) throw new Error("没有返回任务ID"); checkStatus(taskId); } catch(error){ console.error("错误:", error); resetPage(); }finally{ // 关闭蒙层 恢复按钮 hideUploadMask(); btnSelectPhoto.disabled = false; } }); // 轮询任务状态 async function checkStatus(taskId){ const timer = setInterval(async ()=>{ try{ const res = await fetch(`${CHECK_TASK_API}?id=${taskId}`,{ method:"GET" }); const resData = await res.json(); if(resData.status === "succeeded" || resData.code === 200){ clearInterval(timer); let resultImg = resData.generation_url || resData.imgUrl || ""; finalResultImg.src = resultImg; var product = getProductCache(); if (product) { var thumb = document.querySelector('#dutTryOnResultGarmentThumb img'); if (thumb && product.image) { thumb.src = 'https://dutties.com/cdn/shop/' + product.image; } let nameDom = document.getElementById('tryOnGoodsName'); let priceDom = document.getElementById('tryOnGoodsPrice'); if(nameDom && product.title){ nameDom.innerText = product.title; } if(priceDom && product.price){ priceDom.innerText = product.price; } } setActiveStep(3); loadingPage.classList.add("fade-out"); setTimeout(()=>{ loadingPage.style.display = "none"; resultPage.style.display = "flex"; setTimeout(()=>resultPage.classList.add("show"),50); },600); addTryCount(); } if(resData.status === "fail" || resData.status === "canceled"){ clearInterval(timer); resetPage(); } }catch(e){ clearInterval(timer); console.error("轮询出错",e); } },1500); } // 立即购买 document.getElementById('btnBuyNow').addEventListener('click',function(){ const cartBtn = document.querySelector('.t4s-product-form__submit'); const escBtn = document.querySelector('.mfp-close'); if(cartBtn) cartBtn.click(); if(escBtn) escBtn.click(); }) // 进度条 function startProgress(){ let progress = 0; const timer = setInterval(()=>{ if(progress