PerfectVector
Por Jay

Cómo vectorizar una imagen en Python con una API

Envía un PNG, JPEG o WebP desde Python a una API de vectorización. Guarda el SVG, comprueba una respuesta de prueba y recupera la conversión si se corta la conexión.

7 min de lectura
En esta página

Un script de Python puede enviar una imagen rasterizada a la API de PerfectVector y guardar el SVG junto al original. El ejemplo imprime el ID de conversión antes de descargar el archivo. Si se interrumpe la conexión, puedes recuperar el resultado con ese ID o con la clave de solicitud que hayas elegido.

Pruébalo con tu propia imagen
Abrir la herramienta completa
Puedes probarlo gratis. Suelta una imagen y mira la vista previa de tu vector, sin registrarte.

Consigue una clave de prueba y una imagen

Crea una clave de prueba en la página de la API para desarrolladores. Configúrala en la terminal como PERFECTVECTOR_API_KEY y mantenla fuera del script y del control de versiones. Instala Requests en el entorno de Python del proyecto con python -m pip install requests.

Para la primera ejecución, usa un PNG, JPEG o WebP de un solo fotograma, como un logotipo de 512 × 512 llamado logo.png. La API admite archivos de hasta 5 MiB e imágenes de 100 a 4096 píxeles por lado. El modo de prueba valida la subida y devuelve sin costo un SVG fijo con la marca «TEST MODE». Ese archivo permite comprobar la solicitud y la descarga. Para evaluar la calidad del trazado, convierte tu imagen en producción. Modo de prueba de la API de PerfectVector

Ejecutamos el script con una clave de prueba, descargamos un SVG válido y repetimos la subida con la misma clave de solicitud. Las dos ejecuciones devolvieron el mismo ID de conversión.

Esquema del proceso
Un archivo rasterizado local viaja en una solicitud identificada a un servicio en la nube y vuelve como archivo vectorial al disco.
Guarda la clave junto con la subida y registra el ID de conversión antes de descargar el SVG.

Envía la imagen y guarda el SVG desde Python

Guarda el siguiente código como vectorize.py. El argumento files indica a Requests que prepare una subida multipart, que incluye los datos originales en el campo de formulario image. Subidas multipart con Requests

import os
import sys
import time
from pathlib import Path
 
import requests
 
API = "https://api.perfectvector.com/v1"
AUTH = {"Authorization": f"Bearer {os.environ['PERFECTVECTOR_API_KEY']}"}
 
 
def checked(response):
    content_type = response.headers.get("Content-Type", "").split(";")[0]
    if response.status_code >= 400 and content_type == "application/problem+json":
        problem = response.json()
        raise RuntimeError(f"{problem['code']} (request {problem['request_id']})")
    response.raise_for_status()
    return response
 
 
def vectorize(source, destination, operation_id):
    with source.open("rb") as image:
        response = checked(requests.post(
            f"{API}/vectorizations",
            headers={**AUTH, "Idempotency-Key": operation_id, "Prefer": "wait=10"},
            files={"image": (source.name, image)},
            timeout=30,
        ))
 
    conversion = response.json()
    conversion_id = conversion["id"]
    print(f"Conversion ID: {conversion_id}", flush=True)
    deadline = time.monotonic() + 720
    while conversion["status"] in {"queued", "processing"}:
        if time.monotonic() >= deadline:
            raise TimeoutError(f"Stopped polling {conversion_id}")
        time.sleep(2)
        conversion = checked(requests.get(
            f"{API}/vectorizations/{conversion_id}", headers=AUTH, timeout=30,
        )).json()
 
    if conversion["status"] != "succeeded":
        error = conversion["results"][0].get("error") or {}
        raise RuntimeError(f"{conversion_id}: {error.get('code', conversion['status'])}")
 
    svg = checked(requests.get(
        f"{API}/vectorizations/{conversion_id}/result", headers=AUTH, timeout=30,
    ))
    if svg.headers.get("Content-Type", "").split(";")[0] != "image/svg+xml":
        raise ValueError("Expected an SVG response")
    partial = destination.with_suffix(".svg.part")
    partial.write_bytes(svg.content)
    partial.replace(destination)
    print(f"{destination} saved ({len(svg.content)} bytes)")
 
 
if __name__ == "__main__":
    source = Path(sys.argv[1])
    if source.suffix.lower() not in {".png", ".jpg", ".jpeg", ".webp"}:
        raise SystemExit("Choose a PNG, JPEG or WebP file")
    if source.stat().st_size > 5 * 1024 * 1024:
        raise SystemExit("Choose a file no larger than 5 MiB")
    vectorize(source, source.with_suffix(".svg"), sys.argv[2])

Ejecuta el comando desde el directorio que contiene logo.png. Elige un identificador para la conversión y anótalo antes de ejecutar el comando. La API lo llama clave de idempotencia. Es un valor que vincula los reenvíos de una misma subida a una sola conversión. El ejemplo usa logo-asset-0001. Usa otro valor para otra imagen u operación. Reintentos seguros en PerfectVector

python vectorize.py logo.png logo-asset-0001

Una prueba correcta imprime el ID y el número de bytes, y guarda logo.svg junto a logo.png. Abre logo.svg para comprobar que la muestra se ve bien. El script reemplaza un SVG del mismo nombre después de descargar el archivo nuevo. Haz la primera prueba en una carpeta temporal.

El script pide al servidor que espere hasta 10 segundos antes de devolver una conversión sin terminar. Consulta estados queued y processing aproximadamente cada dos segundos y descarga el SVG solo al recibir succeeded. Las conversiones de prueba terminan al instante. Usa una respuesta local simulada sin terminar para probar la consulta antes de emplearla en producción. Espera y solicitudes asíncronas en PerfectVector

Recupera una conversión tras agotar el tiempo de espera

Si Python ya imprimió el ID de conversión, consúltalo con GET /v1/vectorizations/{id}. Cuando termine correctamente, usa GET /v1/vectorizations/{id}/result en la misma cuenta y modo para descargar el SVG. El enlace caduca 24 horas después del fin de la conversión. Copia el archivo a tu almacenamiento si lo necesitas más adelante. Descarga de resultados de PerfectVector

Si Python se detuvo antes de imprimir el ID, repite el comando con los mismos datos y la misma clave de idempotencia dentro de 24 horas desde la primera solicitud. La API devuelve la conversión existente si aceptó el envío original. Una vez pasado el plazo, la misma clave puede iniciar una conversión nueva. Reintentos seguros en PerfectVector

Qué apareceQué revisar
401 invalid_api_keyConfigura una clave de prueba vigente en el entorno que usa Python. Si revocaste la clave, crea otra en el mismo modo.
415 unsupported_media_type o 422 invalid_imageAbre el original y comprueba el formato real y las dimensiones en píxeles. Guarda la imagen corregida y asigna su propia clave al nuevo envío.
Un ID de conversión seguido de processing_failedLa API registró una conversión, pero no pudo vectorizar la imagen. Revisa el original y reintenta con una imagen corregida como operación nueva.
409 idempotency_conflictUsaste la misma clave con otros datos u opciones. Recupera la conversión con el archivo original o asigna una clave nueva a la entrada nueva.

Si necesitas contactar con soporte, conserva el ID de solicitud de la excepción o el ID de conversión que imprimió el script. La referencia de errores de la API explica cuándo es seguro reintentar.

Preguntas frecuentes

¿Python puede vectorizar un JPEG o WebP con el mismo script?

Sí. Pasa el JPEG o WebP como primer argumento. Se aplican los mismos requisitos de tamaño, dimensiones y fotograma único. La salida tiene extensión SVG.

¿Puedo usar el ejemplo de Python para toda una carpeta?

Úsalo primero para comprobar una subida y una descarga. Para una carpeta, registra la clave, el ID de conversión y la ruta de salida de cada archivo en una cola persistente. PerfectVector admite por defecto una conversión en producción a la vez por cuenta. Espera a que termine cada una antes de enviar la siguiente. Límites de la API de PerfectVector

Fuentes

  1. Requests — Inicio rápido — Archivos multipart, tiempos de espera y datos binarios de respuesta.
  2. PerfectVector — Modo de prueba — Límites de subida, SVG de muestra y créditos en pruebas.
  3. PerfectVector — Espera y solicitudes asíncronas — Preferencia de espera, consulta de estado y finalización de solicitudes de prueba.
  4. PerfectVector — Idempotencia — Vigencia, alcance, conflictos y reglas de reenvío de claves.
  5. PerfectVector — Resultados — Punto de conexión, autenticación y caducidad.
  6. PerfectVector — Errores — Códigos de problema HTTP y pasos para recuperar solicitudes.
  7. PerfectVector — Límites — Simultaneidad en producción y límites de archivo.

Consigue una clave de prueba en la página de la API de PerfectVector y ejecuta el script con una imagen propia. Comprueba que el SVG guardado se abre y que la terminal imprime el ID de conversión.

Más del blog

PerfectVector

Convierte tu imagen en
trazados vectoriales limpios y editables

Vectoriza y revisa la vista previa gratis, sin límite diario.