File size: 2,214 Bytes
4a51a09
713d623
f63ea57
4a51a09
bd3a491
f63ea57
a8a350d
b3f1777
bd3a491
f63ea57
8e448c7
4a51a09
 
f63ea57
7099760
 
 
f63ea57
8e448c7
7099760
 
 
8e448c7
 
 
 
 
 
 
 
 
 
 
7099760
f63ea57
7099760
 
 
f63ea57
7099760
 
 
 
 
 
 
f63ea57
bd3a491
 
4c9a049
8e448c7
 
 
 
f63ea57
 
8e448c7
f63ea57
 
8e448c7
 
 
 
 
 
a8a350d
c956e8d
 
8e448c7
c956e8d
bd3a491
c956e8d
 
 
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
from flask import Flask, request, jsonify, send_file
from flask_cors import CORS
from PIL import Image
import vtracer
import io
import os

app = Flask(__name__)
CORS(app, resources={r"/convert-to-vector": {"origins": "*"}})

def convert_to_vector(image):
    input_path = "temp_input.jpg"
    output_path = "temp_output.svg"

    try:
        # Save the input image to a temporary file
        image.save(input_path)

        # Convert the image to SVG using VTracer with default parameters from Gradio app
        vtracer.convert_image_to_svg_py(
            input_path,
            output_path,
            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
        )

        # Read the SVG output
        with open(output_path, "r") as f:
            svg_content = f.read()

        return svg_content
    finally:
        # Clean up temporary files
        if os.path.exists(input_path):
            os.remove(input_path)
        if os.path.exists(output_path):
            os.remove(output_path)

@app.route('/convert-to-vector', methods=['POST'])
def convert_to_vector_endpoint():
    try:
        # Handle raw image data in the request body
        if request.data:
            image = Image.open(io.BytesIO(request.data)).convert('RGB')
        else:
            return jsonify({'error': 'No image data provided'}), 400

        # Process the image
        svg_content = convert_to_vector(image)

        # Save the result to a bytes buffer
        svg_io = io.BytesIO(svg_content.encode('utf-8'))
        svg_io.seek(0)

        # Return the SVG as a response
        return send_file(svg_io, mimetype='image/svg+xml', as_attachment=True, download_name='vector_output.svg')
    except Exception as e:
        return jsonify({'error': str(e)}), 500

@app.route('/')
def index():
    return jsonify({'status': 'Image to Vector Converter API is running'})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860)