File size: 2,873 Bytes
3fa54b5
 
 
d541579
3fa54b5
 
edd6021
 
 
 
3fa54b5
edd6021
3fa54b5
edd6021
3fa54b5
 
edd6021
3fa54b5
 
 
edd6021
 
 
 
 
 
 
 
 
 
 
3fa54b5
 
edd6021
 
 
 
3fa54b5
edd6021
3fa54b5
edd6021
3074852
 
 
 
 
edd6021
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bbf7bd0
edd6021
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
import io
import gradio as gr
from PIL import Image
import vtracer
import tempfile

def converter_imagem(imagem, modo_cor, hierarquico, modo, filtro_ruido,
                     precisao_cor, diferenca_camada, limite_canto,
                     limite_comprimento, max_iteracoes, limite_emenda, precisao_caminho):
    """Converte uma imagem para SVG usando vtracer com parâmetros personalizáveis."""

    # Converter a imagem do Gradio para bytes para compatibilidade com o vtracer
    img_byte_array = io.BytesIO()
    imagem.save(img_byte_array, format='PNG')
    img_bytes = img_byte_array.getvalue()

    # Realizar a conversão
    svg_str = vtracer.convert_raw_image_to_svg(
        img_bytes,
        img_format='png',
        colormode=modo_cor.lower(),
        hierarchical=hierarquico.lower(),
        mode=modo.lower(),
        filter_speckle=int(filtro_ruido),
        color_precision=int(precisao_cor),
        layer_difference=int(diferenca_camada),
        corner_threshold=int(limite_canto),
        length_threshold=float(limite_comprimento),
        max_iterations=int(max_iteracoes),
        splice_threshold=int(limite_emenda),
        path_precision=int(precisao_caminho)
    )

    # Salvar o SVG em um arquivo temporário
    arquivo_temporario = tempfile.NamedTemporaryFile(delete=False, suffix='.svg')
    arquivo_temporario.write(svg_str.encode('utf-8'))
    arquivo_temporario.close()

    return gr.HTML(f'<svg viewBox="0 0 {imagem.width} {imagem.height}">{svg_str}</svg>'), arquivo_temporario.name

# Interface Gradio
iface = gr.Blocks()

with iface:
    
    gr.Interface(
        fn=converter_imagem,
        inputs=[
            gr.Image(type="pil", label="Enviar Imagem"),
            gr.Radio(choices=["Colorido", "Binário"], value="Colorido", label="Modo de Cor"),
            gr.Radio(choices=["Empilhado", "Recortado"], value="Empilhado", label="Hierárquico"),
            gr.Radio(choices=["Spline", "Polígono", "Nenhum"], value="Spline", label="Modo"),
            gr.Slider(minimum=1, maximum=10, value=4, step=1, label="Filtro de Ruído"),
            gr.Slider(minimum=1, maximum=8, value=6, step=1, label="Precisão de Cor"),
            gr.Slider(minimum=1, maximum=32, value=16, step=1, label="Diferença de Camada"),
            gr.Slider(minimum=10, maximum=90, value=60, step=1, label="Limite de Canto"),
            gr.Slider(minimum=3.5, maximum=10, value=4.0, step=0.5, label="Limite de Comprimento"),
            gr.Slider(minimum=1, maximum=20, value=10, step=1, label="Máx. Iterações"),
            gr.Slider(minimum=10, maximum=90, value=45, step=1, label="Limite de Emenda"),
            gr.Slider(minimum=1, maximum=10, value=8, step=1, label="Precisão do Caminho")
        ],
        outputs=[
            gr.HTML(label="Saída SVG"),
            gr.File(label="Baixar SVG")
        ]
    )

iface.launch()