Spaces:
Sleeping
Sleeping
File size: 2,526 Bytes
4a51a09 713d623 f63ea57 4a51a09 bd3a491 f63ea57 a8a350d b3f1777 bd3a491 f63ea57 bd3a491 4a51a09 f63ea57 bd3a491 f63ea57 bd2dc2e bd3a491 f63ea57 e545804 f63ea57 bd3a491 f63ea57 bd3a491 f63ea57 bd3a491 4c9a049 bd3a491 4a51a09 f63ea57 bd3a491 f63ea57 bd3a491 a8a350d 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 |
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, 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 = "temp_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
@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
# Convert image to SVG with default parameters (can be extended with query params if needed)
svg_content = convert_to_vector(image)
# Save SVG content to a bytes buffer
svg_io = io.StringIO(svg_content)
svg_bytes = io.BytesIO(svg_content.encode('utf-8'))
svg_bytes.seek(0)
# Return the SVG as a file response
return send_file(svg_bytes, 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) |