Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import vtracer | |
| import os | |
| from fastapi import FastAPI, File, UploadFile, Form | |
| from fastapi.responses import JSONResponse | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from PIL import Image | |
| import io | |
| # Initialize FastAPI app | |
| app = FastAPI() | |
| # Configure CORS to allow requests from Figma plugin | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["https://www.figma.com"], # Restrict to Figma's domain | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # Existing vtracer conversion function | |
| def convert_to_vector( | |
| image, | |
| colormode="color", | |
| hierarchical="stacked", | |
| mode="spline", | |
| filter_speckle=4, | |
| color_precision=6, | |
| layer_difference=16, | |
| corner_threshold=60, | |
| length_threshold=4.0, | |
| max_iterations=10, | |
| splice_threshold=45, | |
| path_precision=3 | |
| ): | |
| input_path = "temp_input.jpg" | |
| output_path = "svg_output.svg" | |
| # Save the input image to a temporary file | |
| image.save(input_path) | |
| # Convert the image to SVG using VTracer | |
| vtracer.convert_image_to_svg_py( | |
| input_path, | |
| output_path, | |
| colormode=colormode, | |
| hierarchical=hierarchical, | |
| mode=mode, | |
| 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) | |
| ) | |
| # Read the SVG output | |
| with open(output_path, "r") as f: | |
| svg_content = f.read() | |
| # Clean up temporary files | |
| os.remove(input_path) | |
| os.remove(output_path) | |
| return svg_content | |
| # FastAPI endpoint for vector conversion | |
| async def convert_image( | |
| file: UploadFile = File(...), | |
| colormode: str = Form("color"), | |
| hierarchical: str = Form("stacked"), | |
| mode: str = Form("spline"), | |
| filter_speckle: int = Form(4), | |
| color_precision: int = Form(6), | |
| layer_difference: int = Form(16), | |
| corner_threshold: int = Form(60), | |
| length_threshold: float = Form(4.0), | |
| max_iterations: int = Form(10), | |
| splice_threshold: int = Form(45), | |
| path_precision: int = Form(3) | |
| ): | |
| try: | |
| # Read the uploaded image | |
| image_data = await file.read() | |
| image = Image.open(io.BytesIO(image_data)) | |
| # Convert to SVG | |
| svg_content = convert_to_vector( | |
| image, | |
| colormode, | |
| hierarchical, | |
| mode, | |
| filter_speckle, | |
| color_precision, | |
| layer_difference, | |
| corner_threshold, | |
| length_threshold, | |
| max_iterations, | |
| splice_threshold, | |
| path_precision | |
| ) | |
| return JSONResponse(content={"svg": svg_content}) | |
| except Exception as e: | |
| return JSONResponse(content={"error": str(e)}, status_code=500) | |
| # Existing Gradio interface (unchanged) | |
| with gr.Blocks(css=...) as gradio_app: | |
| # Your existing Gradio code here (omitted for brevity) | |
| pass | |
| # Mount Gradio app to FastAPI | |
| app.mount("/", gradio_app) | |
| # Note: app.launch() is not needed for Hugging Face Spaces; it will be handled by the platform |