SLSLK commited on
Commit
ab1fc99
·
verified ·
1 Parent(s): 7f3d2e1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -41
app.py CHANGED
@@ -3,6 +3,8 @@ from gradio_client import Client, handle_file
3
  import re
4
  import threading
5
  import time
 
 
6
 
7
  # ---------------------------
8
  # Clients
@@ -23,13 +25,33 @@ if "page" not in st.session_state:
23
  st.session_state.page = "🖼️ Generieren"
24
 
25
  # ---------------------------
26
- # Funktionen
27
  # ---------------------------
28
  def extract_url(html):
29
  match = re.search(r"src='([^']+)'", html)
30
  return match.group(1) if match else None
31
 
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  def generate_image(prompt):
34
  try:
35
  result = client_main.predict(
@@ -38,15 +60,19 @@ def generate_image(prompt):
38
  api_name="/text_to_image_interface"
39
  )
40
  return extract_url(result[0])
 
41
  except Exception as e:
42
- st.error(e)
43
  return None
44
 
45
 
46
  def edit_image(input_image, prompt):
47
  try:
48
  if isinstance(input_image, str) and input_image.startswith("http"):
49
- image_input = input_image
 
 
 
50
  else:
51
  image_input = handle_file(input_image)
52
 
@@ -57,20 +83,31 @@ def edit_image(input_image, prompt):
57
  )
58
 
59
  return extract_url(result[0])
 
60
  except Exception as e:
61
- st.error(e)
62
  return None
63
 
64
 
65
  def process_image(input_image):
66
  try:
 
 
 
 
 
 
 
 
67
  result = client_process.predict(
68
- image=handle_file(input_image),
69
  api_name="/process_image"
70
  )
 
71
  return result
 
72
  except Exception as e:
73
- st.error(e)
74
  return None
75
 
76
 
@@ -84,30 +121,29 @@ def run_with_progress(func, *args):
84
  result_container["result"] = func(*args)
85
  result_container["done"] = True
86
 
87
- thread = threading.Thread(target=task)
88
- thread.start()
89
  return result_container
90
 
91
 
92
  # ---------------------------
93
- # UI Setup
94
  # ---------------------------
95
  st.set_page_config(page_title="Omni Image Studio", layout="wide")
96
 
97
  st.title("🎨 Omni Image Studio")
98
 
99
- # 🔥 Navigation (ersetzt Tabs → erlaubt Auto-Switch)
100
  page = st.radio(
101
  "Navigation",
102
- ["🖼️ Generieren", "✨ Bearbeiten", "🧪 Process", "📚 Galerie"],
103
- index=["🖼️ Generieren", "✨ Bearbeiten", "🧪 Process", "📚 Galerie"].index(st.session_state.page),
104
  horizontal=True
105
  )
106
 
107
  st.session_state.page = page
108
 
109
  # ---------------------------
110
- # PAGE: GENERATE
111
  # ---------------------------
112
  if page == "🖼️ Generieren":
113
  prompt = st.text_area("Bildbeschreibung")
@@ -139,32 +175,25 @@ if page == "🖼️ Generieren":
139
  })
140
 
141
  # ---------------------------
142
- # PAGE: EDIT
143
  # ---------------------------
144
  elif page == "✨ Bearbeiten":
145
  st.subheader("✨ Bild bearbeiten")
146
 
147
- use_gallery = False
148
-
149
- # 👉 Bild aus Galerie übernommen
150
  if st.session_state.selected_image:
151
  st.image(st.session_state.selected_image, caption="Aus Galerie")
152
- use_gallery = True
153
  else:
154
- uploaded = st.file_uploader("Bild hochladen", type=["png", "jpg", "jpeg"])
 
155
 
156
  edit_prompt = st.text_area("Bearbeitung")
157
 
158
  if st.button("Bearbeiten"):
159
- if edit_prompt:
160
  status = st.empty()
161
  progress = st.progress(0)
162
 
163
- if use_gallery:
164
- input_image = st.session_state.selected_image
165
- else:
166
- input_image = uploaded
167
-
168
  job = run_with_progress(edit_image, input_image, edit_prompt)
169
 
170
  percent = 0
@@ -187,23 +216,30 @@ elif page == "✨ Bearbeiten":
187
  })
188
 
189
  # ---------------------------
190
- # PAGE: PROCESS
191
  # ---------------------------
192
- elif page == "🧪 Process":
193
- uploaded = st.file_uploader("Bild auswählen", type=["png", "jpg", "jpeg"])
 
 
 
 
 
 
 
194
 
195
- if st.button("Verarbeiten"):
196
- if uploaded:
197
  status = st.empty()
198
  progress = st.progress(0)
199
 
200
- job = run_with_progress(process_image, uploaded)
201
 
202
  percent = 0
203
  while not job["done"]:
204
  percent = min(percent + 5, 95)
205
  progress.progress(percent)
206
- status.text(f"Verarbeite Bild... {percent}%")
207
  time.sleep(0.2)
208
 
209
  progress.progress(100)
@@ -215,13 +251,13 @@ elif page == "🧪 Process":
215
  st.image(result)
216
  st.session_state.gallery.append({
217
  "url": result,
218
- "prompt": "Processed Image"
219
  })
220
  else:
221
  st.write(result)
222
 
223
  # ---------------------------
224
- # PAGE: GALLERY
225
  # ---------------------------
226
  elif page == "📚 Galerie":
227
  st.subheader("📸 Galerie")
@@ -232,17 +268,27 @@ elif page == "📚 Galerie":
232
  cols = st.columns(3)
233
 
234
  for i, item in enumerate(st.session_state.gallery):
235
- url = item.get("url")
236
- prompt_text = item.get("prompt", "Kein Prompt")
237
 
238
  with cols[i % 3]:
239
  st.image(url, caption=prompt_text)
240
 
241
- # 🔥 AUTO SWITCH
242
- if st.button("✏️ Edit", key=f"edit_{i}"):
243
- st.session_state.selected_image = url
244
- st.session_state.page = "✨ Bearbeiten"
245
- st.rerun()
 
 
 
 
 
 
 
 
 
 
246
 
247
  if st.button("🗑️ Galerie leeren"):
248
  st.session_state.gallery = []
 
3
  import re
4
  import threading
5
  import time
6
+ import tempfile
7
+ import requests
8
 
9
  # ---------------------------
10
  # Clients
 
25
  st.session_state.page = "🖼️ Generieren"
26
 
27
  # ---------------------------
28
+ # Helper
29
  # ---------------------------
30
  def extract_url(html):
31
  match = re.search(r"src='([^']+)'", html)
32
  return match.group(1) if match else None
33
 
34
 
35
+ def url_to_file(url):
36
+ try:
37
+ r = requests.get(url)
38
+ if r.status_code != 200:
39
+ st.error(f"❌ Download Error: HTTP {r.status_code}")
40
+ return None
41
+
42
+ tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
43
+ tmp.write(r.content)
44
+ tmp.close()
45
+ return tmp.name
46
+
47
+ except Exception as e:
48
+ st.error(f"❌ URL Download Exception: {e}")
49
+ return None
50
+
51
+
52
+ # ---------------------------
53
+ # API FUNCTIONS
54
+ # ---------------------------
55
  def generate_image(prompt):
56
  try:
57
  result = client_main.predict(
 
60
  api_name="/text_to_image_interface"
61
  )
62
  return extract_url(result[0])
63
+
64
  except Exception as e:
65
+ st.error(f"❌ Generate Error: {e}")
66
  return None
67
 
68
 
69
  def edit_image(input_image, prompt):
70
  try:
71
  if isinstance(input_image, str) and input_image.startswith("http"):
72
+ file_path = url_to_file(input_image)
73
+ if not file_path:
74
+ return None
75
+ image_input = handle_file(file_path)
76
  else:
77
  image_input = handle_file(input_image)
78
 
 
83
  )
84
 
85
  return extract_url(result[0])
86
+
87
  except Exception as e:
88
+ st.error(f"❌ Edit Error: {e}")
89
  return None
90
 
91
 
92
  def process_image(input_image):
93
  try:
94
+ if isinstance(input_image, str) and input_image.startswith("http"):
95
+ file_path = url_to_file(input_image)
96
+ if not file_path:
97
+ return None
98
+ image_input = handle_file(file_path)
99
+ else:
100
+ image_input = handle_file(input_image)
101
+
102
  result = client_process.predict(
103
+ image=image_input,
104
  api_name="/process_image"
105
  )
106
+
107
  return result
108
+
109
  except Exception as e:
110
+ st.error(f"❌ Process Error: {e}")
111
  return None
112
 
113
 
 
121
  result_container["result"] = func(*args)
122
  result_container["done"] = True
123
 
124
+ threading.Thread(target=task).start()
 
125
  return result_container
126
 
127
 
128
  # ---------------------------
129
+ # UI
130
  # ---------------------------
131
  st.set_page_config(page_title="Omni Image Studio", layout="wide")
132
 
133
  st.title("🎨 Omni Image Studio")
134
 
135
+ # Navigation
136
  page = st.radio(
137
  "Navigation",
138
+ ["🖼️ Generieren", "✨ Bearbeiten", "🧪 Analyse", "📚 Galerie"],
139
+ index=["🖼️ Generieren", "✨ Bearbeiten", "🧪 Analyse", "📚 Galerie"].index(st.session_state.page),
140
  horizontal=True
141
  )
142
 
143
  st.session_state.page = page
144
 
145
  # ---------------------------
146
+ # GENERATE
147
  # ---------------------------
148
  if page == "🖼️ Generieren":
149
  prompt = st.text_area("Bildbeschreibung")
 
175
  })
176
 
177
  # ---------------------------
178
+ # EDIT
179
  # ---------------------------
180
  elif page == "✨ Bearbeiten":
181
  st.subheader("✨ Bild bearbeiten")
182
 
 
 
 
183
  if st.session_state.selected_image:
184
  st.image(st.session_state.selected_image, caption="Aus Galerie")
185
+ input_image = st.session_state.selected_image
186
  else:
187
+ uploaded = st.file_uploader("Bild hochladen", type=["png", "jpg"])
188
+ input_image = uploaded
189
 
190
  edit_prompt = st.text_area("Bearbeitung")
191
 
192
  if st.button("Bearbeiten"):
193
+ if input_image and edit_prompt:
194
  status = st.empty()
195
  progress = st.progress(0)
196
 
 
 
 
 
 
197
  job = run_with_progress(edit_image, input_image, edit_prompt)
198
 
199
  percent = 0
 
216
  })
217
 
218
  # ---------------------------
219
+ # ANALYSE (PROCESS)
220
  # ---------------------------
221
+ elif page == "🧪 Analyse":
222
+ st.subheader("🧪 Bild Analyse")
223
+
224
+ if st.session_state.selected_image:
225
+ st.image(st.session_state.selected_image, caption="Aus Galerie")
226
+ input_image = st.session_state.selected_image
227
+ else:
228
+ uploaded = st.file_uploader("Bild auswählen", type=["png", "jpg"])
229
+ input_image = uploaded
230
 
231
+ if st.button("Analysieren"):
232
+ if input_image:
233
  status = st.empty()
234
  progress = st.progress(0)
235
 
236
+ job = run_with_progress(process_image, input_image)
237
 
238
  percent = 0
239
  while not job["done"]:
240
  percent = min(percent + 5, 95)
241
  progress.progress(percent)
242
+ status.text(f"Analysiere Bild... {percent}%")
243
  time.sleep(0.2)
244
 
245
  progress.progress(100)
 
251
  st.image(result)
252
  st.session_state.gallery.append({
253
  "url": result,
254
+ "prompt": "Analyse Ergebnis"
255
  })
256
  else:
257
  st.write(result)
258
 
259
  # ---------------------------
260
+ # GALLERY
261
  # ---------------------------
262
  elif page == "📚 Galerie":
263
  st.subheader("📸 Galerie")
 
268
  cols = st.columns(3)
269
 
270
  for i, item in enumerate(st.session_state.gallery):
271
+ url = item["url"]
272
+ prompt_text = item["prompt"]
273
 
274
  with cols[i % 3]:
275
  st.image(url, caption=prompt_text)
276
 
277
+ col1, col2 = st.columns(2)
278
+
279
+ # 🔥 EDIT BUTTON
280
+ with col1:
281
+ if st.button("✏️ Edit", key=f"edit_{i}"):
282
+ st.session_state.selected_image = url
283
+ st.session_state.page = "✨ Bearbeiten"
284
+ st.rerun()
285
+
286
+ # 🔥 ANALYSE BUTTON
287
+ with col2:
288
+ if st.button("🧪 Analyse", key=f"proc_{i}"):
289
+ st.session_state.selected_image = url
290
+ st.session_state.page = "🧪 Analyse"
291
+ st.rerun()
292
 
293
  if st.button("🗑️ Galerie leeren"):
294
  st.session_state.gallery = []