18 lines
No EOL
15 KiB
JavaScript
18 lines
No EOL
15 KiB
JavaScript
(()=>{var e={};e.id=2460,e.ids=[2460],e.modules={3295:e=>{"use strict";e.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},10846:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},17791:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});let a=(0,r(12907).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/app/app/background-remover/page.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/app/app/background-remover/page.tsx","default")},19121:e=>{"use strict";e.exports=require("next/dist/server/app-render/action-async-storage.external.js")},23002:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var a=r(60687),n=r(43210);let s=(0,r(62688).A)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]),l=[2048,1536,1280,1024,864,720];async function i(e,t=2048){let r=await createImageBitmap(e),{width:a,height:n}=r,s=Math.min(1,t/Math.max(a,n)),l=Math.max(1,Math.round(a*s)),o=Math.max(1,Math.round(n*s)),d=document.createElement("canvas");return d.width=l,d.height=o,d.getContext("2d").drawImage(r,0,0,l,o),r.close(),await new Promise(e=>d.toBlob(t=>e(t),"image/png"))}function o(e){if(e)try{URL.revokeObjectURL(e)}catch{}}let d=[{key:"ormbg",label:"ORMBG"},{key:"u2net",label:"U2NET"},{key:"basnet",label:"BASNET"},{key:"deeplab",label:"DEEPLAB"},{key:"tracer",label:"TRACER-B7"},{key:"u2net_human_seg",label:"U2NET (Human)"},{key:"isnet-general-use",label:"ISNET (General)"},{key:"isnet-anime",label:"ISNET (Anime)"},{key:"bria",label:"BRIA RMBG1.4"},{key:"inspyrenet",label:"INSPYRENET"}];function c(){let[e,t]=(0,n.useState)(null),[r,c]=(0,n.useState)(null),[u,m]=(0,n.useState)(null),[p,h]=(0,n.useState)(()=>Object.fromEntries(d.map(e=>[e.key,"idle"]))),[b,g]=(0,n.useState)({}),x=(0,n.useRef)({}),[f,v]=(0,n.useState)(null),[w,k]=(0,n.useState)(50),[y,j]=(0,n.useState)(!0),N=(0,n.useRef)(null),P=(0,n.useRef)(!1),R=(0,n.useRef)(new Map),z=(0,a.jsx)("style",{children:`
|
|
html, body { width: 100%; overflow-x: hidden; }
|
|
:root { font-size: 17px; }
|
|
.checkerboard {
|
|
background-size: 24px 24px;
|
|
background-image:
|
|
linear-gradient(45deg,#2a2a2a 25%,transparent 25%),
|
|
linear-gradient(-45deg,#2a2a2a 25%,transparent 25%),
|
|
linear-gradient(45deg,transparent 75%,#2a2a2a 75%),
|
|
linear-gradient(-45deg,transparent 75%,#2a2a2a 75%);
|
|
background-position: 0 0,0 12px,12px -12px,-12px 0;
|
|
}
|
|
.slider-handle { position: absolute; top: 0; bottom: 0; width: 0; left: calc(var(--reveal, 50) * 1%); }
|
|
.slider-handle::before { content: ""; position: absolute; top: 0; bottom: 0; width: 2px; left: -1px; background: rgba(255,255,255,0.85); }
|
|
.slider-thumb { position: absolute; top: 50%; transform: translate(-50%, -50%); width: 26px; height: 26px; border-radius: 9999px; background: rgba(24,24,27,0.9); border: 1px solid rgba(255,255,255,0.85); display: grid; place-items: center; cursor: ew-resize; }
|
|
/* Mobile: keep the page from panning left/right while using the slider */
|
|
.app-frame { touch-action: pan-y; overscroll-behavior-x: contain; }
|
|
`}),C=(0,n.useCallback)(async e=>{if(o(r),Object.values(x.current).forEach(e=>o(e?.previewUrl)),R.current.clear(),t(e),g({}),v(null),k(50),h(Object.fromEntries(d.map(e=>[e.key,"idle"]))),!e){c(null),m(null);return}try{let t=await createImageBitmap(e);m({w:t.width,h:t.height}),t.close()}catch{}let a=await i(e,2048);c(URL.createObjectURL(a))},[r]),E=(0,n.useCallback)(async t=>{let r=R.current;if(r.has(t))return r.get(t);if(!e)throw Error("No file selected");let a=await i(e,t);return r.set(t,a),a},[e]),M=(0,n.useCallback)(async()=>{if(!e)return;g({}),h(e=>{let t={...e};return d.forEach(e=>t[e.key]="pending"),t});let t=async t=>{let r=y?l:[Math.max(u?.w||0,u?.h||0)||4096],a=performance.now();for(let n of r)try{let r=y?await E(n):e,s=new FormData;s.append("file",r),s.append("method",t);let l=await fetch("/api/bgremove",{method:"POST",body:s});if(!l.ok){let e=await l.text().catch(()=>""),t=/out of memory|onnxruntime|cuda|allocate|500/i.test(e);if(y&&t){e||l.status;continue}throw Error(e||`HTTP ${l.status}`)}let o=await l.blob(),d=performance.now()-a,c=await i(o),u=URL.createObjectURL(c);g(e=>({...e,[t]:{fullBlob:o,previewUrl:u,bytes:o.size,ms:d}})),h(e=>({...e,[t]:"ok"})),await new Promise(e=>setTimeout(e,150));return}catch(e){if(e?.message||String(e),!y)break}h(e=>({...e,[t]:"error"}))},r=y?1:2,a=[...d.map(e=>e.key)],n=[],s=()=>{for(;n.length<r&&a.length;){let e=t(a.shift()).finally(()=>{n=n.filter(t=>t!==e)});n.push(e)}};for(s();n.length;)await Promise.race(n),s();v(e=>{if(e)return e;for(let e of d)if(x.current[e.key])return e.key;return d[0]?.key??null})},[e,y,u,E]),S=(0,n.useMemo)(()=>u&&u.w/u.h||16/9,[u]),U=(0,n.useCallback)(e=>{let t=N.current;if(!t)return;let r=t.getBoundingClientRect();k(Math.min(100,Math.max(0,(e-r.left)/r.width*100)))},[]),_=()=>P.current=!1,B=f?b[f]:void 0,L=!!(f&&B?.fullBlob),T=(0,n.useCallback)(async()=>{if(!e||!f)return;h(e=>({...e,[f]:"pending"}));let t=performance.now();try{let r=new FormData;r.append("file",e),r.append("method",f);let a=await fetch("/api/bgremove",{method:"POST",body:r});if(!a.ok)throw Error(await a.text());let n=await a.blob(),s=performance.now()-t,l=await i(n),d=URL.createObjectURL(l),c=x.current[f];c&&o(c.previewUrl),g(e=>({...e,[f]:{fullBlob:n,previewUrl:d,bytes:n.size,ms:s}})),h(e=>({...e,[f]:"ok"}))}catch{h(e=>({...e,[f]:"error"}))}},[e,f]),$=(0,n.useMemo)(()=>d.filter(e=>"ok"===p[e.key]).length,[p]),A=(0,n.useMemo)(()=>d.filter(e=>"pending"===p[e.key]).length,[p]);function D({s:e}){return(0,a.jsx)("span",{className:`inline-block w-2 h-2 rounded-full ${"ok"===e?"bg-emerald-500":"pending"===e?"bg-amber-400 animate-pulse":"error"===e?"bg-rose-500":"bg-zinc-600"}`})}return(0,a.jsxs)("div",{className:"p-6 text-zinc-100 overflow-x-hidden",children:[z,(0,a.jsxs)("div",{className:"mx-auto w-full max-w-[1200px] px-4",children:[(0,a.jsxs)("div",{className:"mb-4 flex items-center justify-between gap-3",children:[(0,a.jsx)("h1",{className:"text-2xl font-semibold",children:"Background Remover"}),(0,a.jsx)("a",{href:"https://makearmy.io",className:"px-3 py-1 rounded-md border border-zinc-700 hover:bg-zinc-800/60 text-sm",children:"Back to main"})]}),(0,a.jsxs)("div",{className:"text-zinc-400 mb-3",children:[(0,a.jsx)("span",{className:"text-zinc-300",children:"Source:"})," ",e?.name??(0,a.jsx)("span",{className:"italic",children:"— none —"})]}),(0,a.jsxs)("div",{ref:N,className:"app-frame checkerboard relative w-full rounded-2xl border border-zinc-800/80 shadow-inner",style:{aspectRatio:`${S}`,maxWidth:"1200px",maxHeight:"80vh",marginInline:"auto"},onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let t=e.dataTransfer.files?.[0];t&&C(t)},onMouseDown:e=>{P.current=!0,U(e.clientX)},onMouseMove:e=>{P.current&&U(e.clientX)},onMouseLeave:_,onMouseUp:_,onTouchStart:e=>{P.current=!0,U(e.touches[0].clientX)},onTouchMove:e=>{P.current&&(e.preventDefault(),U(e.touches[0].clientX))},onTouchEnd:()=>P.current=!1,children:[!r&&(0,a.jsxs)("label",{className:"absolute inset-0 grid place-items-center cursor-pointer",children:[(0,a.jsx)("input",{type:"file",accept:"image/*",className:"hidden",onChange:e=>{C(e.target.files?.[0]??null)}}),(0,a.jsx)("div",{className:"text-zinc-400 border-2 border-dashed border-zinc-600/70 rounded-xl px-6 py-10",children:(0,a.jsxs)("div",{className:"text-center",children:[(0,a.jsx)("div",{className:"mb-1",children:"Drop an image here"}),(0,a.jsx)("div",{className:"text-zinc-500",children:"or click to select a file"})]})})]}),r&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("img",{src:r,loading:"lazy",decoding:"async",className:"absolute inset-0 w-full h-full object-contain select-none",alt:"Source",style:{clipPath:`inset(0 0 0 ${w}%)`},draggable:!1}),B?(0,a.jsx)("img",{src:B.previewUrl,loading:"lazy",decoding:"async",className:"absolute inset-0 w-full h-full object-contain select-none pointer-events-none",alt:"Result",style:{clipPath:`inset(0 ${100-w}% 0 0)`},draggable:!1}):"pending"===p[f]?(0,a.jsx)("div",{className:"absolute inset-0 grid place-items-center",children:(0,a.jsx)(s,{className:"animate-spin"})}):null,(0,a.jsx)("div",{className:"slider-handle",style:{"--reveal":`${Math.min(100,Math.max(0,w))}`},children:(0,a.jsx)("div",{className:"slider-thumb",children:(0,a.jsx)("div",{className:"w-1.5 h-4 bg-white/80 rounded"})})})]})]}),(0,a.jsx)("div",{className:"mt-4 grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-2",children:d.map(({key:t,label:r})=>(0,a.jsxs)("button",{className:`w-full justify-center px-3 py-2 rounded-md border flex items-center gap-2 ${f===t?"border-blue-400 bg-blue-500/20":"border-zinc-700 hover:bg-zinc-800/60"}`,onClick:()=>v(t),disabled:!e,title:e?r:"Select a file first",children:[(0,a.jsx)(D,{s:p[t]}),(0,a.jsx)("span",{className:"truncate",children:r})]},t))}),(0,a.jsxs)("div",{className:"mt-4 flex items-center gap-3 flex-wrap",children:[(0,a.jsxs)("button",{onClick:M,className:"px-3 py-1 rounded-md border border-zinc-700 hover:bg-zinc-800/60 flex items-center gap-2 order-0",disabled:!e||A>0,title:e?A>0?"Running…":"Run all methods":"Select a file first",children:[A>0&&(0,a.jsx)(s,{className:"animate-spin w-4 h-4"})," ",A>0?`Running… ${$}/${d.length}`:"Run all methods"]}),(0,a.jsxs)("label",{className:"flex items-center gap-2 text-sm text-zinc-300 cursor-pointer select-none order-1",children:[(0,a.jsx)("input",{type:"checkbox",checked:y,onChange:e=>j(e.target.checked)})," GPU-safe mode"]}),(0,a.jsx)("div",{className:"text-zinc-400 text-sm order-2",children:e?A>0?(0,a.jsxs)("span",{children:["Processing… ",$,"/",d.length," finished"]}):$>0?(0,a.jsxs)("span",{children:["Done: ",$," methods succeeded"]}):(0,a.jsx)("span",{children:"Ready. Click Run all methods"}):(0,a.jsx)("span",{children:"Drop an image to begin"})}),(0,a.jsxs)("div",{className:"sm:ml-auto flex items-center gap-3 w-full sm:w-auto order-3",children:[(0,a.jsx)("input",{type:"range",min:0,max:100,value:w,onChange:e=>k(parseInt(e.target.value,10)),className:"w-full sm:w-56",title:"Slide to compare before/after"}),(0,a.jsx)("button",{onClick:T,disabled:!e||!f,className:`px-3 py-1 rounded-md border ${e&&f?"border-sky-600 bg-sky-600/20 hover:bg-sky-600/30":"border-zinc-700 text-zinc-400 cursor-not-allowed"}`,title:e?f?"Render selected method at full resolution":"Choose a method":"Select a file first",children:"Full-res render"}),(0,a.jsx)("button",{onClick:()=>{if(!f||!B)return;let t=document.createElement("a"),r=e?.name?.replace(/\.[^.]+$/,"")||"image",a=URL.createObjectURL(B.fullBlob);t.href=a,setTimeout(()=>o(a),5e3),t.download=`${r}_${f}.png`,document.body.appendChild(t),t.click(),t.remove()},disabled:!L,className:`px-3 py-1 rounded-md border ${L?"border-emerald-600 bg-emerald-600/20 hover:bg-emerald-600/30":"border-zinc-700 text-zinc-400 cursor-not-allowed"}`,children:"Download"})]})]})]})]})}},29294:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33873:e=>{"use strict";e.exports=require("path")},36319:()=>{},56444:(e,t,r)=>{Promise.resolve().then(r.t.bind(r,16444,23)),Promise.resolve().then(r.t.bind(r,16042,23)),Promise.resolve().then(r.t.bind(r,88170,23)),Promise.resolve().then(r.t.bind(r,49477,23)),Promise.resolve().then(r.t.bind(r,29345,23)),Promise.resolve().then(r.t.bind(r,12089,23)),Promise.resolve().then(r.t.bind(r,46577,23)),Promise.resolve().then(r.t.bind(r,31307,23))},58014:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>s,metadata:()=>n});var a=r(37413);r(90061);let n={title:"LE-DB",description:"Laser Everything Community Database"};function s({children:e}){return(0,a.jsx)("html",{lang:"en",className:"dark",children:(0,a.jsx)("body",{children:e})})}},62688:(e,t,r)=>{"use strict";r.d(t,{A:()=>u});var a=r(43210);let n=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),s=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase()),l=e=>{let t=s(e);return t.charAt(0).toUpperCase()+t.slice(1)},i=(...e)=>e.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim(),o=e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0};var d={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let c=(0,a.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:s="",children:l,iconNode:c,...u},m)=>(0,a.createElement)("svg",{ref:m,...d,width:t,height:t,stroke:e,strokeWidth:n?24*Number(r)/Number(t):r,className:i("lucide",s),...!l&&!o(u)&&{"aria-hidden":"true"},...u},[...c.map(([e,t])=>(0,a.createElement)(e,t)),...Array.isArray(l)?l:[l]])),u=(e,t)=>{let r=(0,a.forwardRef)(({className:r,...s},o)=>(0,a.createElement)(c,{ref:o,iconNode:t,className:i(`lucide-${n(l(e))}`,`lucide-${e}`,r),...s}));return r.displayName=l(e),r}},63033:e=>{"use strict";e.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},63405:(e,t,r)=>{Promise.resolve().then(r.bind(r,17791))},66172:(e,t,r)=>{Promise.resolve().then(r.t.bind(r,86346,23)),Promise.resolve().then(r.t.bind(r,27924,23)),Promise.resolve().then(r.t.bind(r,35656,23)),Promise.resolve().then(r.t.bind(r,40099,23)),Promise.resolve().then(r.t.bind(r,38243,23)),Promise.resolve().then(r.t.bind(r,28827,23)),Promise.resolve().then(r.t.bind(r,62763,23)),Promise.resolve().then(r.t.bind(r,97173,23))},87373:(e,t,r)=>{Promise.resolve().then(r.bind(r,23002))},90061:()=>{},91636:(e,t,r)=>{"use strict";r.r(t),r.d(t,{GlobalError:()=>l.a,__next_app__:()=>u,pages:()=>c,routeModule:()=>m,tree:()=>d});var a=r(65239),n=r(48088),s=r(88170),l=r.n(s),i=r(30893),o={};for(let e in i)0>["default","tree","pages","GlobalError","__next_app__","routeModule"].indexOf(e)&&(o[e]=()=>i[e]);r.d(t,o);let d={children:["",{children:["background-remover",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(r.bind(r,17791)),"/app/app/background-remover/page.tsx"]}]},{}]},{layout:[()=>Promise.resolve().then(r.bind(r,58014)),"/app/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(r.t.bind(r,57398,23)),"next/dist/client/components/not-found-error"],forbidden:[()=>Promise.resolve().then(r.t.bind(r,89999,23)),"next/dist/client/components/forbidden-error"],unauthorized:[()=>Promise.resolve().then(r.t.bind(r,65284,23)),"next/dist/client/components/unauthorized-error"]}]}.children,c=["/app/app/background-remover/page.tsx"],u={require:r,loadChunk:()=>Promise.resolve()},m=new a.AppPageRouteModule({definition:{kind:n.RouteKind.APP_PAGE,page:"/background-remover/page",pathname:"/background-remover",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:d}})},96999:()=>{}};var t=require("../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),a=t.X(0,[7719,4825],()=>r(91636));module.exports=a})(); |