File size: 2,855 Bytes
a8521b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import gradio as gr
from PIL import Image, ImageDraw, ImageFont
import torch
from diffusers import StableDiffusionImg2ImgPipeline
import tempfile
import os

# Carregar modelo de transformação de imagem
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
).to("cuda" if torch.cuda.is_available() else "cpu")

# Prompts por estilo
PROMPTS = {
    "Infantil": "a colorful, playful, cartoon-style kids room, minimal, bright colors, 3D illustration",
    "Adulto": "a modern, elegant, minimalist living room with warm tones and natural textures, stylish interior design"
}

def transformar_imagem(imagem_input, estilo, texto_usuario):
    if imagem_input is None:
        return None
    
    # Converter para RGB
    imagem_input = imagem_input.convert("RGB")

    prompt = PROMPTS.get(estilo, PROMPTS["Adulto"])

    imagem_saida = pipe(prompt=prompt, image=imagem_input, strength=0.75, guidance_scale=7.5).images[0]

    # Adicionar texto com estilo
    draw = ImageDraw.Draw(imagem_saida)
    font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"  # fonte padrão Linux, pode mudar conforme o sistema
    font_size = 40
    font = ImageFont.truetype(font_path, font_size)

    # Centralizar o texto
    w, h = imagem_saida.size
    text_w, text_h = draw.textsize(texto_usuario, font=font)
    text_x = (w - text_w) / 2
    text_y = h - text_h - 30  # posição inferior com margem

    draw.text((text_x, text_y), texto_usuario, fill="white", font=font, stroke_width=2, stroke_fill="black")

    return imagem_saida

# Interface
with gr.Blocks() as demo:
    gr.Markdown("# 🖼️ Estilizador de Ambientes com IA")
    gr.Markdown("Transforme uma foto em um ambiente **infantil ou adulto** estilizado e com mensagem personalizada.")

    with gr.Row():
        imagem_input = gr.Image(label="1. Envie uma imagem do ambiente", type="pil")
        estilo = gr.Radio(choices=["Infantil", "Adulto"], label="2. Escolha o estilo do ambiente")

    texto_usuario = gr.Textbox(label="3. Digite o texto que deseja sobrepor na imagem (ex: frase, dedicatória)")
    gerar_botao = gr.Button("4. Gerar Imagem com Estilo + Texto")

    imagem_saida = gr.Image(label="Imagem Final", type="pil")
    download = gr.File(label="Download da Imagem", interactive=True)

    def gerar(imagem, estilo_escolhido, texto):
        imagem_final = transformar_imagem(imagem, estilo_escolhido, texto)

        # Salvar para download
        with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmpfile:
            imagem_final.save(tmpfile.name)
            return imagem_final, tmpfile.name

    gerar_botao.click(fn=gerar, inputs=[imagem_input, estilo, texto_usuario], outputs=[imagem_saida, download])

# Lançar app
demo.launch()