Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -207,45 +207,182 @@ def generate_poster(
|
|
207 |
def create_interface():
|
208 |
"""Create Gradio interface"""
|
209 |
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
243 |
|
244 |
inputs_list = [
|
245 |
prompt_input, enable_recap_checkbox, height_input, width_input,
|
246 |
num_inference_steps_input, guidance_scale_input, seed_number_input
|
247 |
]
|
248 |
-
outputs_list = [image_output,
|
249 |
|
250 |
generate_button.click(fn=generate_poster, inputs=inputs_list, outputs=outputs_list)
|
251 |
|
|
|
207 |
def create_interface():
|
208 |
"""Create Gradio interface"""
|
209 |
|
210 |
+
custom_css = """
|
211 |
+
.gradio-container {
|
212 |
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
213 |
+
}
|
214 |
+
|
215 |
+
.contain {
|
216 |
+
background: rgba(255, 255, 255, 0.95);
|
217 |
+
border-radius: 15px;
|
218 |
+
padding: 25px;
|
219 |
+
margin: 15px auto;
|
220 |
+
max-width: 1200px;
|
221 |
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
|
222 |
+
}
|
223 |
+
|
224 |
+
.title-container {
|
225 |
+
text-align: center;
|
226 |
+
margin-bottom: 25px;
|
227 |
+
padding: 20px;
|
228 |
+
background: linear-gradient(135deg, #ff6b6b, #ee5a52);
|
229 |
+
border-radius: 12px;
|
230 |
+
box-shadow: 0 5px 20px rgba(255, 107, 107, 0.3);
|
231 |
+
}
|
232 |
+
|
233 |
+
.title-container h1 {
|
234 |
+
color: white;
|
235 |
+
font-size: 2.2em;
|
236 |
+
font-weight: bold;
|
237 |
+
margin: 0;
|
238 |
+
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3);
|
239 |
+
}
|
240 |
+
|
241 |
+
.section-header {
|
242 |
+
background: linear-gradient(135deg, #a8edea, #fed6e3);
|
243 |
+
padding: 12px;
|
244 |
+
border-radius: 8px;
|
245 |
+
margin-bottom: 15px;
|
246 |
+
border-left: 4px solid #ff6b6b;
|
247 |
+
}
|
248 |
+
|
249 |
+
.section-header h3 {
|
250 |
+
margin: 0;
|
251 |
+
color: #333;
|
252 |
+
font-weight: 600;
|
253 |
+
}
|
254 |
+
|
255 |
+
.input-group {
|
256 |
+
background: rgba(255, 255, 255, 0.8);
|
257 |
+
padding: 18px;
|
258 |
+
border-radius: 12px;
|
259 |
+
margin-bottom: 15px;
|
260 |
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
261 |
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.05);
|
262 |
+
}
|
263 |
+
|
264 |
+
.result-section {
|
265 |
+
background: rgba(255, 255, 255, 0.9);
|
266 |
+
padding: 18px;
|
267 |
+
border-radius: 12px;
|
268 |
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
269 |
+
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.05);
|
270 |
+
}
|
271 |
+
|
272 |
+
.tip-box {
|
273 |
+
background: linear-gradient(135deg, #ffeaa7, #fdcb6e);
|
274 |
+
padding: 10px;
|
275 |
+
border-radius: 6px;
|
276 |
+
margin: 8px 0;
|
277 |
+
border-left: 3px solid #f39c12;
|
278 |
+
color: #8b4513;
|
279 |
+
font-weight: 500;
|
280 |
+
}
|
281 |
+
|
282 |
+
button.primary {
|
283 |
+
background: linear-gradient(135deg, #ff6b6b, #ee5a52) !important;
|
284 |
+
border: none !important;
|
285 |
+
border-radius: 20px !important;
|
286 |
+
padding: 12px 25px !important;
|
287 |
+
color: white !important;
|
288 |
+
font-weight: bold !important;
|
289 |
+
font-size: 15px !important;
|
290 |
+
box-shadow: 0 5px 15px rgba(255, 107, 107, 0.4) !important;
|
291 |
+
transition: all 0.2s ease-in-out;
|
292 |
+
}
|
293 |
+
|
294 |
+
button.primary:hover {
|
295 |
+
box-shadow: 0 8px 25px rgba(255, 107, 107, 0.6) !important;
|
296 |
+
transform: translateY(-2px);
|
297 |
+
opacity: 0.95 !important;
|
298 |
+
}
|
299 |
+
|
300 |
+
.examples .gallery {
|
301 |
+
gap: 8px !important;
|
302 |
+
}
|
303 |
+
|
304 |
+
.examples .gallery-item {
|
305 |
+
border-radius: 8px !important;
|
306 |
+
background-color: #f0f0f0 !important;
|
307 |
+
border: 1px solid #ddd !important;
|
308 |
+
padding: 10px !important;
|
309 |
+
text-align: left !important;
|
310 |
+
transition: background-color 0.2s, border-color 0.2s;
|
311 |
+
}
|
312 |
+
|
313 |
+
.examples .gallery-item:hover {
|
314 |
+
background-color: #e0e0e0 !important;
|
315 |
+
border-color: #ccc !important;
|
316 |
+
}
|
317 |
+
|
318 |
+
.examples .gallery-item span {
|
319 |
+
font-size: 14px !important;
|
320 |
+
white-space: normal !important;
|
321 |
+
width: 100% !important;
|
322 |
+
}
|
323 |
+
|
324 |
+
.image-output-container {
|
325 |
+
display: flex;
|
326 |
+
justify-content: center;
|
327 |
+
align-items: center;
|
328 |
+
min-height: 512px;
|
329 |
+
background: #f0f2f5;
|
330 |
+
border-radius: 12px;
|
331 |
+
overflow: hidden;
|
332 |
+
}
|
333 |
+
|
334 |
+
.image-output-container img {
|
335 |
+
max-height: 512px;
|
336 |
+
max-width: 100%;
|
337 |
+
object-fit: contain;
|
338 |
+
}
|
339 |
+
"""
|
340 |
+
|
341 |
+
with gr.Blocks(theme=gr.themes.Soft(), css=custom_css) as demo:
|
342 |
+
with gr.Column(elem_classes="contain"):
|
343 |
+
gr.HTML('<div class="title-container"><h1>π¨ PosterCraft-v1.0</h1></div>')
|
344 |
+
|
345 |
+
with gr.Row(equal_height=False):
|
346 |
+
with gr.Column(scale=1, elem_classes="input-group"):
|
347 |
+
gr.HTML('<div class="section-header"><h3>βοΈ 1. Configuration</h3></div>')
|
348 |
+
prompt_input = gr.Textbox(label="π‘ Prompt", lines=3, placeholder="Enter your creative prompt...")
|
349 |
+
|
350 |
+
enable_recap_checkbox = gr.Checkbox(label="π Enable Prompt Recap", value=True, info=f"Uses {DEFAULT_QWEN_MODEL_PATH} for rewriting.")
|
351 |
+
|
352 |
+
gr.Examples(
|
353 |
+
examples=[
|
354 |
+
["Urban Canvas Street Art Expo poster with bold graffiti-style lettering and dynamic colorful splashes"],
|
355 |
+
["This poster for 'PixelPlay Retro Game Console' features the console with classic 8-bit game graphics, evoking nostalgia and fun with a vibrant, playful, and retro-gaming aesthetic."],
|
356 |
+
["Poster about Mars Tourism Campaign, text:\"NEXT STOP MARS\\nBOOK YOUR TICKET NOW\", astronaut_on_red_planet, rocket_launch, sunrise_horizon_glow, retro_futurism_style, dust_clouds, panoramic_view, bold_headline_text, sci-fi_palette, highres, 16x9_ratio"],
|
357 |
+
["This intriguing poster for \"CODE OF THE SAMURAI\" presents a stark contrast. On one side, a traditional samurai warrior in full armor, holding a katana, is depicted in a sepia-toned, historical style. On the other side, a futuristic cyborg warrior with glowing blue optics and sleek armor is shown in a cool, modern, digital style. The two figures are back-to-back, divided by a shimmering energy line. The title \"CODE OF THE SAMURAI\" is written in a font that blends traditional Japanese calligraphy with modern digital elements, in a metallic silver, positioned horizontally across the center where the two styles meet. The tagline, \"HONOR IS TIMELESS,\" is in a smaller, clean white sans-serif font at the bottom. The layout highlights the duality and the clash or merging of ancient traditions with future technology."]
|
358 |
+
],
|
359 |
+
inputs=[prompt_input],
|
360 |
+
label="π Example Prompts",
|
361 |
+
examples_per_page=5,
|
362 |
+
)
|
363 |
+
|
364 |
+
with gr.Row():
|
365 |
+
width_input = gr.Slider(label="π Width", minimum=256, maximum=2048, value=832, step=64)
|
366 |
+
height_input = gr.Slider(label="π Height", minimum=256, maximum=2048, value=1216, step=64)
|
367 |
+
gr.HTML('<div class="tip-box">π‘ Tip: Recommended size is 832x1216 for best results.</div>')
|
368 |
+
|
369 |
+
num_inference_steps_input = gr.Slider(label="π Inference Steps", minimum=1, maximum=100, value=28, step=1)
|
370 |
+
guidance_scale_input = gr.Slider(label="π― Guidance Scale (CFG)", minimum=0.0, maximum=20.0, value=3.5, step=0.1)
|
371 |
+
seed_number_input = gr.Number(label="π² Seed", value=-1, minimum=-1, step=1, info="Leave blank or set to -1 for a random seed.")
|
372 |
+
generate_button = gr.Button("π Generate Image", variant="primary")
|
373 |
+
|
374 |
+
with gr.Column(scale=1, elem_classes="result-section"):
|
375 |
+
gr.HTML('<div class="section-header"><h3>π¨ 2. Results</h3></div>')
|
376 |
+
with gr.Box(elem_classes=["image-output-container"]):
|
377 |
+
image_output = gr.Image(label="πΌοΈ Generated Image", type="pil", show_download_button=True, show_label=False, elem_classes=["image-output"])
|
378 |
+
recapped_prompt_output = gr.Textbox(label="π Final Prompt Used", lines=5, interactive=False)
|
379 |
+
status_output = gr.Textbox(label="π Status Log", lines=4, interactive=False)
|
380 |
|
381 |
inputs_list = [
|
382 |
prompt_input, enable_recap_checkbox, height_input, width_input,
|
383 |
num_inference_steps_input, guidance_scale_input, seed_number_input
|
384 |
]
|
385 |
+
outputs_list = [image_output, status_output, recapped_prompt_output]
|
386 |
|
387 |
generate_button.click(fn=generate_poster, inputs=inputs_list, outputs=outputs_list)
|
388 |
|