import io import gradio as gr import vtracer import tempfile def convert_image(image, color_mode, hierarchical, mode, filter_speckle, color_precision, layer_difference, corner_threshold, length_threshold, max_iterations, splice_threshold, path_precision): """Converts an image to SVG using vtracer optimized for logos.""" if image is None: return None, None # Image to bytes img_byte_array = io.BytesIO() image.save(img_byte_array, format='PNG') img_bytes = img_byte_array.getvalue() # VTracer conversion svg_str = vtracer.convert_raw_image_to_svg( img_bytes, img_format='png', colormode=color_mode.lower(), hierarchical=hierarchical.lower(), mode=mode.lower(), filter_speckle=int(filter_speckle), color_precision=int(color_precision), layer_difference=int(layer_difference), corner_threshold=int(corner_threshold), length_threshold=float(length_threshold), max_iterations=int(max_iterations), splice_threshold=int(splice_threshold), path_precision=int(path_precision) ) # Save to temp file for download temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.svg') temp_file.write(svg_str.encode('utf-8')) temp_file.close() # Preview with responsive container svg_preview = f'
{svg_str}
' return svg_preview, temp_file.name # Simple and clean UI with gr.Blocks(title="Logo & Image Vectorizer") as demo: gr.Markdown("# 🚀 Logo & Image Vectorizer") gr.Markdown("Convert your PNG/JPG logos/images into scalable SVG vectors. Optimized for high-precision paths.") with gr.Row(): with gr.Column(): img_input = gr.Image(type="pil", label="Upload Logo (PNG/JPG)") with gr.Accordion("Fine-Tuning (Logo Optimized)", open=True): with gr.Row(): color_mode = gr.Radio(["Color", "Binary"], value="Color", label="Color Mode") hierarchical = gr.Radio(["Stacked", "Cutout"], value="Stacked", label="Hierarchy") mode = gr.Radio(["Spline", "Polygon", "None"], value="Spline", label="Vector Mode") # Optimized defaults for Logos filter_speckle = gr.Slider(1, 10, value=2, step=1, label="Filter Speckle (Noise Reduction)") color_precision = gr.Slider(1, 8, value=8, step=1, label="Color Precision (Max 8)") layer_difference = gr.Slider(1, 32, value=16, step=1, label="Layer Difference") corner_threshold = gr.Slider(10, 90, value=60, step=1, label="Corner Threshold") length_threshold = gr.Slider(3.5, 10, value=4.0, step=0.5, label="Min Path Length") max_iterations = gr.Slider(1, 20, value=10, step=1, label="Curve Fitting Iterations") splice_threshold = gr.Slider(10, 90, value=45, step=1, label="Splice Threshold") path_precision = gr.Slider(1, 10, value=10, step=1, label="Path Precision (Decimal Places)") btn = gr.Button("Vectorize Now", variant="primary") with gr.Column(): svg_output = gr.HTML(label="SVG Preview") file_output = gr.File(label="Download SVG") btn.click( fn=convert_image, inputs=[ img_input, color_mode, hierarchical, mode, filter_speckle, color_precision, layer_difference, corner_threshold, length_threshold, max_iterations, splice_threshold, path_precision ], outputs=[svg_output, file_output] ) demo.launch()