Equityone's picture
Update app.py
3344589 verified
Raw History Blame Contribute Delete
5.93 kB
import gradio as gr
import random
from PIL import Image, ImageDraw, ImageFont
import requests
from io import BytesIO
import os
import time
# Configuration
HF_TOKEN = "hf_..." # Remplacez par votre token Hugging Face
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0"
STYLES = {
"signage": "Signalétique Professionnelle",
"poster": "Affiche Artistique",
"silhouette": "Silhouette Décorative"
}
FORMATS = ["A4", "A3", "A2", "A1"]
MATERIALS = ["Lisse", "Ondulé", "Kraft"]
PROMPT_SUGGESTIONS = {
"signage": [
"Panneau directionnel moderne en carton recyclé, style minimaliste",
"Présentoir écologique pour boutique, motifs naturels",
"Signalétique murale en carton kraft, design épuré"
],
"poster": [
"Affiche artistique sur carton texturé, thème environnemental",
"Poster graphique moderne, motifs géométriques en relief",
"Design abstrait sur carton ondulé, couleurs naturelles"
],
"silhouette": [
"Découpe décorative florale en carton, style organique",
"Silhouette architecturale moderne en carton recyclé",
"Motif géométrique découpé, effet d'ombre et lumière"
]
}
STYLE_PROMPTS = {
"signage": "professional signage design, minimalist, clean, photorealistic",
"poster": "artistic poster design, creative, expressive, highly detailed",
"silhouette": "decorative silhouette, elegant cutout design, clear shape"
}
def create_error_image(message):
"""Crée une image d'erreur avec un message."""
img = Image.new('RGB', (512, 512), color='lightgray')
d = ImageDraw.Draw(img)
font = ImageFont.load_default()
d.text((10,10), message, fill=(0,0,0), font=font)
return img
def generate_image(prompt, style, format_size, material):
"""Génère une image via l'API Hugging Face avec gestion des erreurs et retries."""
enhanced_prompt = f"a {material} cardboard {style} design showing {prompt}, {STYLE_PROMPTS[style]}, professional photography, 8k uhd, detailed"
payload = {
"inputs": enhanced_prompt,
"negative_prompt": "low quality, blurry, bad anatomy, distorted, disfigured, pixelated",
"num_inference_steps": 40,
"guidance_scale": 7.5,
"width": 768,
"height": 768
}
headers = {"Authorization": f"Bearer {HF_TOKEN}"}
max_retries = 3
for attempt in range(max_retries):
try:
response = requests.post(API_URL, headers=headers, json=payload, timeout=30)
response.raise_for_status()
return Image.open(BytesIO(response.content))
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
print(f"Erreur API après {max_retries} tentatives: {str(e)}")
return create_error_image(f"Erreur API: {str(e)}")
time.sleep(2 ** attempt) # Attente exponentielle entre les tentatives
def update_suggestions(style):
"""Met à jour les suggestions de prompts selon le style choisi."""
return gr.Dropdown(choices=PROMPT_SUGGESTIONS.get(style, []))
def apply_watermark(image):
"""Applique un filigrane à l'image générée."""
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
text = "Equity Creation Studio"
textwidth, textheight = draw.textsize(text, font)
width, height = image.size
x = width - textwidth - 10
y = height - textheight - 10
draw.text((x, y), text, font=font, fill=(255, 255, 255, 128))
return image
def generate_and_process(prompt, style, format_size, material):
"""Génère l'image et applique le post-traitement."""
image = generate_image(prompt, style, format_size, material)
return apply_watermark(image)
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# 🎨 Equity Creation Studio
### Studio de Design Éco-responsable
Transformez vos idées en créations durables avec notre générateur d'images IA
"""
)
with gr.Row():
with gr.Column(scale=1):
style = gr.Radio(
choices=list(STYLES.keys()),
value="signage",
label="Style de Création",
info="Choisissez le type de design souhaité"
)
format_size = gr.Radio(
choices=FORMATS,
value="A4",
label="Format",
info="Sélectionnez la taille de votre création"
)
material = gr.Radio(
choices=MATERIALS,
value="Lisse",
label="Type de Carton",
info="Choisissez votre matériau"
)
prompt = gr.Textbox(
lines=3,
label="Description",
placeholder="Décrivez votre vision..."
)
suggestions = gr.Dropdown(
choices=PROMPT_SUGGESTIONS["signage"],
label="Suggestions de prompts",
info="Sélectionnez une suggestion ou écrivez votre propre description"
)
generate_btn = gr.Button("🪄 Générer", variant="primary")
with gr.Column(scale=2):
output = gr.Image(label="Image générée")
style.change(fn=update_suggestions, inputs=[style], outputs=[suggestions])
suggestions.change(fn=lambda x: x, inputs=[suggestions], outputs=[prompt])
generate_btn.click(
fn=generate_and_process,
inputs=[prompt, style, format_size, material],
outputs=[output]
)
gr.Markdown(
"""
### 🌿 Design Éco-responsable
Equity Creation Studio transforme vos déchets carton en œuvres d'art
"""
)
if __name__ == "__main__":
demo.launch()