Spaces:
Running
Running
import gradio as gr | |
import tempfile | |
import time | |
from PIL import Image, ImageDraw | |
def generate_animated_sprite(character_description, num_frames, character_action, viewing_direction): | |
""" | |
Funzione di simulazione per generare un'immagine GIF animata. | |
In un'implementazione reale, qui chiameresti il tuo modello di IA. | |
Per ora, questa funzione genera solo un'immagine di esempio per testare l'interfaccia. | |
""" | |
print(f"Generazione sprite con questi parametri:") | |
print(f"- Descrizione: {character_description}") | |
print(f"- Frames: {num_frames}") | |
print(f"- Azione: {character_action}") | |
print(f"- Direzione: {viewing_direction}") | |
# Crea delle immagini di esempio per simulare un'animazione | |
frames = [] | |
for i in range(num_frames): | |
# Crea un'immagine di esempio | |
img = Image.new('RGB', (100, 100), color=(73, 109, 137)) | |
d = ImageDraw.Draw(img) | |
# Disegna qualcosa di diverso in ogni frame per simulare l'animazione | |
x_offset = 10 + (i * 10) % 50 | |
d.ellipse((x_offset, 20, x_offset + 60, 80), fill=(255, 255, 0)) | |
d.text((10, 10), f"{character_action} - {i+1}", fill=(255, 255, 255)) | |
frames.append(img) | |
# Salva i frame come GIF animata | |
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".gif") | |
frames[0].save( | |
temp_file.name, | |
format='GIF', | |
append_images=frames[1:], | |
save_all=True, | |
duration=200, # 200 ms tra i frame | |
loop=0 # 0 = loop infinito | |
) | |
temp_file.close() | |
return temp_file.name | |
# Interface Gradio locale | |
with gr.Blocks(title="Animated Sprite Generator") as demo: | |
gr.Markdown("# 🎮 AI Animated Sprite Generator") | |
gr.Markdown(""" | |
This tool uses an AI model to generate animated sprites based on text descriptions. | |
Enter the character description, number of frames, character action, and viewing direction to generate your animated sprite. | |
""") | |
with gr.Row(): | |
with gr.Column(): | |
# Input components | |
char_desc = gr.Textbox(label="Character Description", | |
placeholder="Ex: a knight with golden armor and a fire sword", | |
lines=3) | |
num_frames = gr.Slider(minimum=1, maximum=8, step=1, value=4, | |
label="Number of Animation Frames") | |
char_action = gr.Dropdown( | |
choices=["idle", "walk", "run", "attack", "jump", "die", "cast spell", "dance"], | |
label="Character Action", | |
value="idle" | |
) | |
view_direction = gr.Dropdown( | |
choices=["front", "back", "left", "right", "front-left", "front-right", "back-left", "back-right"], | |
label="Viewing Direction", | |
value="front" | |
) | |
generate_btn = gr.Button("Generate Animated Sprite") | |
with gr.Column(): | |
# Output component | |
animated_output = gr.Image(label="Animated Sprite (GIF)") | |
# Connect the button to the function | |
generate_btn.click( | |
fn=generate_animated_sprite, | |
inputs=[char_desc, num_frames, char_action, view_direction], | |
outputs=animated_output | |
) | |
# Predefined examples | |
gr.Examples( | |
[ | |
["A wizard with blue cloak and pointed hat", 4, "cast spell", "front"], | |
["A warrior with heavy armor and axe", 6, "attack", "right"], | |
["A ninja with black clothes and throwing stars", 8, "run", "front-left"], | |
["A princess with golden crown and pink dress", 4, "dance", "front"] | |
], | |
inputs=[char_desc, num_frames, char_action, view_direction] | |
) | |
# Launch the Gradio interface | |
if __name__ == "__main__": | |
demo.launch(share=True) # Imposta share=False se non vuoi un URL pubblico temporaneo |