Spaces:
Sleeping
Sleeping
import gradio as gr | |
from PIL import Image, ImageDraw | |
# Configurações gerais | |
GRID_SIZE = 32 # Tamanho da grade | |
PIXEL_SIZE = 20 # Tamanho de cada pixel no desenho | |
CANVAS_SIZE = GRID_SIZE * PIXEL_SIZE # Tamanho total do canvas | |
FRAME_COUNT = 4 # Número de frames padrão na animação | |
# Função para criar uma imagem em branco | |
def create_blank_frame(): | |
return Image.new("RGB", (GRID_SIZE, GRID_SIZE), color="white") | |
# Função para desenhar no frame | |
def draw_pixel(frame, x, y, color): | |
draw = ImageDraw.Draw(frame) | |
draw.rectangle( | |
[x, y, x + 1, y + 1], fill=color | |
) # Cada pixel é um pequeno quadrado 1x1 | |
return frame | |
# Função para converter frames em um GIF | |
def create_animation(frames, duration): | |
gif_path = "animation.gif" | |
frames[0].save( | |
gif_path, | |
save_all=True, | |
append_images=frames[1:], | |
duration=duration, | |
loop=0, | |
) | |
return gif_path | |
# Função principal do editor | |
def editor(frames, frame_index, x, y, color, duration): | |
frame = frames[frame_index] | |
frame = draw_pixel(frame, x, y, color) | |
frames[frame_index] = frame | |
gif_path = create_animation(frames, duration) | |
return gif_path, frames | |
# Inicializa frames em branco | |
initial_frames = [create_blank_frame() for _ in range(FRAME_COUNT)] | |
# Interface com Gradio | |
with gr.Blocks() as app: | |
gr.Markdown("# Editor de Sprites e Animação") | |
with gr.Row(): | |
canvas = gr.Image(label="Canvas", type="pil", tool=None) | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown("### Ferramentas de Desenho") | |
x = gr.Slider(0, GRID_SIZE - 1, step=1, label="Posição X") | |
y = gr.Slider(0, GRID_SIZE - 1, step=1, label="Posição Y") | |
color = gr.ColorPicker(label="Cor", value="#ff0000") | |
frame_index = gr.Slider( | |
0, FRAME_COUNT - 1, step=1, label="Frame Atual" | |
) | |
duration = gr.Slider(50, 500, step=10, label="Duração (ms)", value=100) | |
with gr.Column(): | |
gr.Markdown("### Animação") | |
animation_output = gr.Image(label="Prévia da Animação") | |
with gr.Row(): | |
update_button = gr.Button("Atualizar Frame") | |
save_button = gr.Button("Salvar Animação") | |
# Estados | |
frames_state = gr.State(value=initial_frames) | |
# Atualizar o frame | |
update_button.click( | |
editor, | |
inputs=[frames_state, frame_index, x, y, color, duration], | |
outputs=[animation_output, frames_state], | |
) | |
app.launch() | |