PerfectVector
Von Jay

Ein Bild in Python mit einer API vektorisieren

Sende ein PNG, JPEG oder WebP aus Python an eine Vektorisierungs-API. Speichere das SVG, prüfe die Testantwort und setze denselben Auftrag nach einem Verbindungsabbruch fort.

6 Min. Lesezeit
Auf dieser Seite

Ein Python-Skript kann ein Rasterbild an die Vektorisierungs-API von PerfectVector senden und das SVG neben der Vorlage speichern. Das Beispiel gibt die Konvertierungs-ID aus, bevor es die Datei herunterlädt. Bei einem Verbindungsabbruch kannst du das Ergebnis über diese ID oder über einen selbst gewählten Anfrageschlüssel wieder abrufen.

Probier es mit deinem eigenen Bild
Vollständiges Tool öffnen
Kostenlos und ohne Anmeldung: Lege ein Bild ab und sieh dir die Vorschau deines Vektors an.

Testschlüssel und Bild vorbereiten

Erstelle einen Testschlüssel auf der Developer-API-Seite. Setze ihn im Terminal als PERFECTVECTOR_API_KEY und halte ihn aus Skript und Versionsverwaltung heraus. Installiere Requests mit python -m pip install requests in der Python-Umgebung deines Projekts.

Nutze für den ersten Lauf ein PNG, JPEG oder WebP mit einem Einzelbild, etwa ein Logo mit 512 × 512 Pixeln namens logo.png. Die API akzeptiert Dateien bis 5 MiB und Bilder mit 100 bis 4096 Pixeln pro Seite. Der Testmodus prüft den Upload und liefert kostenlos ein festes SVG mit der Aufschrift „TEST MODE“. Damit prüfst du Anfrage und Download. Die Vektorisierungsqualität beurteilst du mit einer Live-Konvertierung deiner eigenen Vorlage. Testmodus der PerfectVector API

Wir führten das Python-Skript mit einem Testschlüssel aus, prüften das heruntergeladene SVG auf gültige Syntax und wiederholten den Upload mit demselben Anfrageschlüssel. Beide Läufe lieferten dieselbe Konvertierungs-ID.

Schematischer Ablauf
Eine lokale Rasterdatei wird in einer gekennzeichneten Anfrage an einen Cloud-Dienst gesendet und kommt als Vektordatei auf den Rechner zurück.
Bewahre den Anfrageschlüssel zusammen mit dem Upload auf und speichere die Konvertierungs-ID vor dem SVG-Download.

Bild senden und SVG in Python speichern

Speichere das folgende Skript als vectorize.py. Das Argument files veranlasst Requests, die ursprünglichen Dateidaten in einem Multipart-Upload im Formularfeld image zu senden. Multipart-Uploads mit 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])

Führe den Befehl im Ordner mit logo.png aus. Lege vor der Ausführung eine Kennung für die Konvertierung fest und notiere sie. Die API nennt sie Idempotenzschlüssel. Der Wert ordnet Wiederholungen desselben Uploads einer Konvertierung zu. Im Beispiel steht dafür logo-asset-0001. Nutze für ein anderes Bild oder einen anderen Vorgang einen eigenen Wert. Anfragen sicher wiederholen

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

Ein erfolgreicher Testlauf gibt die Konvertierungs-ID und die Anzahl der Bytes aus und speichert logo.svg neben logo.png. Öffne logo.svg, um die Darstellung zu prüfen. Das Skript ersetzt ein gleichnamiges SVG, nachdem es die neue Datei heruntergeladen hat. Verwende beim ersten Lauf einen Testordner.

Das Skript bittet den Server, bis zu 10 Sekunden zu warten, bevor er eine noch laufende Konvertierung zurückgibt. Es fragt für Aufträge mit queued und processing etwa alle zwei Sekunden den Status ab und lädt das Ergebnis erst bei succeeded herunter. Testkonvertierungen sind sofort fertig. Verwende eine lokale Testantwort für den ausstehenden Zustand, bevor du den Abruf im Produktivbetrieb einsetzt. Wartezeiten und asynchrone Antworten bei PerfectVector

Konvertierung nach einer Zeitüberschreitung wieder abrufen

Wenn Python eine Konvertierungs-ID ausgegeben hat, prüfe sie mit GET /v1/vectorizations/{id}. Nach erfolgreichem Abschluss kannst du das SVG mit GET /v1/vectorizations/{id}/result im selben Konto und Modus herunterladen. Ergebnislinks verfallen 24 Stunden nach Abschluss. Kopiere die Datei in deinen eigenen Speicher, wenn du sie später brauchst. Ergebnisdownloads bei PerfectVector

Wenn Python vor Ausgabe der ID abbricht, wiederhole den Befehl innerhalb von 24 Stunden ab der ersten Anfrage mit denselben Dateidaten und demselben Idempotenzschlüssel. Wenn die API den ersten Upload angenommen hat, liefert sie die vorhandene Konvertierung. Nach Ablauf der Frist kann eine Anfrage mit demselben Schlüssel eine neue Konvertierung starten. Anfragen sicher wiederholen

Was du siehstWas du prüfen solltest
401 invalid_api_keyHinterlege einen gültigen Testschlüssel in der Umgebung, die Python verwendet. Falls du den Schlüssel widerrufen hast, erstelle einen Ersatz im selben Modus.
415 unsupported_media_type oder 422 invalid_imageÖffne die Quelldatei und prüfe das tatsächliche Format und die Pixelmaße. Speichere ein korrigiertes Bild und nutze dafür einen eigenen Schlüssel.
Eine Konvertierungs-ID, gefolgt von processing_failedDie API hat einen Datensatz angelegt, konnte das Bild aber nicht vektorisieren. Prüfe die Vorlage und sende eine korrigierte Datei als neuen Auftrag.
409 idempotency_conflictDerselbe Schlüssel wurde mit anderen Bilddaten oder Optionen verwendet. Verwende zur Wiederherstellung die Originaldatei oder vergib für die neue Eingabe einen neuen Schlüssel.

Wenn du den Support kontaktierst, halte die Anfrage-ID aus der Fehlermeldung oder die Konvertierungs-ID aus dem Skript bereit. Die API-Fehlerreferenz erklärt, welche Anfragen du gefahrlos wiederholen kannst.

Häufige Fragen

Kann Python mit demselben Skript JPEG oder WebP vektorisieren?

Ja. Übergib die JPEG- oder WebP-Datei als erstes Argument. Die Anforderungen an Dateigröße, Abmessungen und Einzelbilder bleiben gleich. Die Ausgabe hat die Endung SVG.

Kann ich dieses Python-Beispiel für einen ganzen Ordner verwenden?

Prüfe damit zuerst einen Upload und Download. Für einen Ordner speicherst du den Schlüssel, die Konvertierungs-ID und den Ausgabepfad pro Datei in einer dauerhaften Warteschlange. PerfectVector erlaubt standardmäßig eine laufende Live-Konvertierung pro Konto. Warte jeweils auf den Abschluss, bevor du die nächste einreichst. Limits der PerfectVector API

Quellen

  1. Requests – Schnellstart – Multipart-Dateien, Zeitlimits und Antworten als Bytes.
  2. PerfectVector – Testmodus – Upload-Grenzen, festes Test-SVG und Credits im Testmodus.
  3. PerfectVector – Wartezeiten und asynchrone Antworten – Warte-Header, Statusabfragen und Abschluss von Testanfragen.
  4. PerfectVector – Idempotenz – Gültigkeitsdauer, Geltungsbereich, Konflikte und Wiederholungen von Schlüsseln.
  5. PerfectVector – Ergebnisse – Ergebnis-Endpunkt, Anmeldung und Ablauf.
  6. PerfectVector – Fehler – HTTP-Problemcodes und Hinweise zur Wiederherstellung.
  7. PerfectVector – Limits – Standardlimit für parallele Live-Konvertierungen und Dateigrenzen.

Erstelle über die API-Seite von PerfectVector einen Testschlüssel und führe das Skript mit einem eigenen Bild aus. Prüfe, ob sich das gespeicherte SVG öffnen lässt und ob das Terminal seine Konvertierungs-ID ausgibt.

Mehr aus dem Blog

PerfectVector

Verwandle dein Bild in
saubere, bearbeitbare Vektorpfade

Vektorisieren und Vorschau prüfen: kostenlos und ohne Tageslimit.