Xlnk commited on
Commit
3292460
·
verified ·
1 Parent(s): 62c5a78

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +98 -82
app.py CHANGED
@@ -1,89 +1,105 @@
1
- import gradio as gr
2
  from rembg import remove
3
  from rembg.session_factory import new_session
4
  from PIL import Image
5
- import io, base64, os
6
 
7
- PORT = int(os.environ.get("PORT", 7860))
8
 
9
- # 🧠 FULL MODEL (not lite)
10
  session = new_session("u2net")
11
 
12
- def process(image):
13
- if image is None:
14
- return None, ""
15
-
16
- # PIL → bytes
17
- buf = io.BytesIO()
18
- image.save(buf, format="PNG")
19
- input_bytes = buf.getvalue()
20
-
21
- # Background removal (FULL U²-Net)
22
- output_bytes = remove(
23
- input_bytes,
24
- session=session,
25
- alpha_matting=False
26
- )
27
-
28
- # Bytes → PIL
29
- out_img = Image.open(io.BytesIO(output_bytes)).convert("RGBA")
30
-
31
- # PIL base64 (auto-download)
32
- out_buf = io.BytesIO()
33
- out_img.save(out_buf, format="PNG")
34
- b64 = base64.b64encode(out_buf.getvalue()).decode()
35
-
36
- html = f"""
37
- <script>
38
- const a = document.createElement("a");
39
- a.href = "data:image/png;base64,{b64}";
40
- a.download = "xlnk-rmbg.png";
41
- document.body.appendChild(a);
42
- a.click();
43
- a.remove();
44
- </script>
45
- """
46
-
47
- return out_img, html
48
-
49
-
50
- with gr.Blocks(
51
- title="Xlnk Rmbg – AI Background Remover",
52
- css="""
53
- body { background:#0b0f19; }
54
- h1, h2, p { color:white; }
55
- """
56
- ) as demo:
57
-
58
- gr.Markdown("""
59
- # ✂️ Xlnk Rmbg
60
- **High-Quality AI Background Removal (U²-Net)**
61
-
62
- Drag & drop → preview → auto-download
63
- No storage. No tracking.
64
- """)
65
-
66
- with gr.Row():
67
- input_img = gr.Image(type="pil", label="Upload image")
68
- output_img = gr.Image(type="pil", label="Preview (Transparent PNG)")
69
-
70
- html = gr.HTML()
71
-
72
- input_img.change(
73
- fn=process,
74
- inputs=input_img,
75
- outputs=[output_img, html]
76
- )
77
-
78
- gr.Markdown("""
79
- ### 🔒 Privacy
80
- - Images processed in memory
81
- - Nothing saved
82
- - Open-source (Rembg + U²-Net)
83
- """)
84
-
85
- demo.launch(
86
- server_name="0.0.0.0",
87
- server_port=PORT,
88
- show_error=True
89
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, Response
2
  from rembg import remove
3
  from rembg.session_factory import new_session
4
  from PIL import Image
5
+ import io
6
 
7
+ app = Flask(__name__)
8
 
9
+ # FULL U²-Net
10
  session = new_session("u2net")
11
 
12
+ HTML = """
13
+ <!DOCTYPE html>
14
+ <html>
15
+ <head>
16
+ <title>Xlnk RMBG</title>
17
+ <style>
18
+ html, body {
19
+ height: 100%;
20
+ margin: 0;
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ background: #0b0f19;
25
+ color: white;
26
+ font-family: sans-serif;
27
+ }
28
+ #dropZone {
29
+ width: 100vw;
30
+ height: 100vh;
31
+ border: 2px dashed #555;
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ cursor: pointer;
36
+ text-align: center;
37
+ }
38
+ #dropZone.dragover {
39
+ background-color: #1b2030;
40
+ }
41
+ input { display: none; }
42
+ </style>
43
+ </head>
44
+ <body>
45
+ <div id="dropZone">
46
+ <form id="uploadForm" method="post" enctype="multipart/form-data">
47
+ <input id="fileInput" type="file" name="file" />
48
+ Drop image or click anywhere
49
+ </form>
50
+ </div>
51
+
52
+ <script>
53
+ const dropZone = document.getElementById("dropZone");
54
+ const fileInput = document.getElementById("fileInput");
55
+ const uploadForm = document.getElementById("uploadForm");
56
+
57
+ dropZone.addEventListener("click", () => fileInput.click());
58
+
59
+ fileInput.addEventListener("change", () => {
60
+ if(fileInput.files.length > 0) uploadForm.submit();
61
+ });
62
+
63
+ dropZone.addEventListener("dragover", e => {
64
+ e.preventDefault();
65
+ dropZone.classList.add("dragover");
66
+ });
67
+
68
+ dropZone.addEventListener("dragleave", e => {
69
+ dropZone.classList.remove("dragover");
70
+ });
71
+
72
+ dropZone.addEventListener("drop", e => {
73
+ e.preventDefault();
74
+ dropZone.classList.remove("dragover");
75
+ fileInput.files = e.dataTransfer.files;
76
+ uploadForm.submit();
77
+ });
78
+ </script>
79
+ </body>
80
+ </html>
81
+ """
82
+
83
+ @app.route("/", methods=["GET", "POST"])
84
+ def index():
85
+ if request.method == "POST":
86
+ file = request.files.get("file")
87
+ if not file:
88
+ return "No file uploaded", 400
89
+
90
+ input_bytes = file.read()
91
+
92
+ # Remove background
93
+ output_bytes = remove(input_bytes, session=session, alpha_matting=False)
94
+
95
+ # Return as downloadable PNG
96
+ return Response(
97
+ output_bytes,
98
+ mimetype="image/png",
99
+ headers={"Content-Disposition": "attachment; filename=xlnk-rmbg.png"}
100
+ )
101
+
102
+ return HTML
103
+
104
+ if __name__ == "__main__":
105
+ app.run(host="0.0.0.0", port=7860)