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()