Update app.py
Browse files
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 |
-
#
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
| 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=
|
| 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 |
-
|
| 88 |
-
thread.start()
|
| 89 |
return result_container
|
| 90 |
|
| 91 |
|
| 92 |
# ---------------------------
|
| 93 |
-
# UI
|
| 94 |
# ---------------------------
|
| 95 |
st.set_page_config(page_title="Omni Image Studio", layout="wide")
|
| 96 |
|
| 97 |
st.title("🎨 Omni Image Studio")
|
| 98 |
|
| 99 |
-
#
|
| 100 |
page = st.radio(
|
| 101 |
"Navigation",
|
| 102 |
-
["🖼️ Generieren", "✨ Bearbeiten", "🧪
|
| 103 |
-
index=["🖼️ Generieren", "✨ Bearbeiten", "🧪
|
| 104 |
horizontal=True
|
| 105 |
)
|
| 106 |
|
| 107 |
st.session_state.page = page
|
| 108 |
|
| 109 |
# ---------------------------
|
| 110 |
-
#
|
| 111 |
# ---------------------------
|
| 112 |
if page == "🖼️ Generieren":
|
| 113 |
prompt = st.text_area("Bildbeschreibung")
|
|
@@ -139,32 +175,25 @@ if page == "🖼️ Generieren":
|
|
| 139 |
})
|
| 140 |
|
| 141 |
# ---------------------------
|
| 142 |
-
#
|
| 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 |
-
|
| 153 |
else:
|
| 154 |
-
uploaded = st.file_uploader("Bild hochladen", type=["png", "jpg"
|
|
|
|
| 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 |
-
#
|
| 191 |
# ---------------------------
|
| 192 |
-
elif page == "🧪
|
| 193 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
|
| 195 |
-
if st.button("
|
| 196 |
-
if
|
| 197 |
status = st.empty()
|
| 198 |
progress = st.progress(0)
|
| 199 |
|
| 200 |
-
job = run_with_progress(process_image,
|
| 201 |
|
| 202 |
percent = 0
|
| 203 |
while not job["done"]:
|
| 204 |
percent = min(percent + 5, 95)
|
| 205 |
progress.progress(percent)
|
| 206 |
-
status.text(f"
|
| 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": "
|
| 219 |
})
|
| 220 |
else:
|
| 221 |
st.write(result)
|
| 222 |
|
| 223 |
# ---------------------------
|
| 224 |
-
#
|
| 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
|
| 236 |
-
prompt_text = item
|
| 237 |
|
| 238 |
with cols[i % 3]:
|
| 239 |
st.image(url, caption=prompt_text)
|
| 240 |
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 = []
|