File size: 2,135 Bytes
4a51a09
713d623
f63ea57
4a51a09
bd3a491
f63ea57
a8a350d
b3f1777
bd3a491
f63ea57
8e448c7
4a51a09
 
f63ea57
f4c1ac5
 
f63ea57
f4c1ac5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f63ea57
f4c1ac5
 
 
f63ea57
f4c1ac5
f63ea57
bd3a491
 
4c9a049
8e448c7
 
 
f4c1ac5
 
 
 
8e448c7
f63ea57
 
8e448c7
f63ea57
 
8e448c7
f4c1ac5
 
 
 
 
 
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
75
76
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"

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

    # Convert the image to SVG using VTracer with default parameters
    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, "rb") as f:
        svg_content = f.read()

    # Clean up temporary files
    os.remove(input_path)
    os.remove(output_path)

    return svg_content

@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')
        # Fallback for multipart/form-data (if needed later)
        elif 'image' in request.files:
            file = request.files['image']
            image = Image.open(file).convert('RGB')
        else:
            return jsonify({'error': 'No image data provided'}), 400

        # Process the image
        svg_content = convert_to_vector(image)

        # Return the SVG as a response
        return send_file(
            io.BytesIO(svg_content),
            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)