Wektoryzacja obrazu w Pythonie za pomocą API
Prześlij PNG, JPEG lub WebP do API wektoryzacji z Pythona. Zapisz SVG, sprawdź odpowiedź testową i odzyskaj tę samą konwersję po zerwaniu połączenia.
Na tej stronie
Skrypt Pythona może wysłać obraz rastrowy do API wektoryzacji PerfectVector i zapisać otrzymany SVG obok pliku źródłowego. Poniższy przykład wyświetla identyfikator konwersji przed pobraniem. Po zerwaniu połączenia możesz odzyskać wynik za pomocą tego identyfikatora lub wybranego wcześniej klucza żądania.
Przygotuj klucz testowy i jeden obraz
Utwórz klucz testowy na stronie Developer API. Ustaw go w terminalu jako PERFECTVECTOR_API_KEY i nie zapisuj w skrypcie ani w kontroli wersji. Zainstaluj Requests w środowisku Pythona projektu poleceniem python -m pip install requests.
Na pierwszy test wybierz jednoklatkowy PNG, JPEG lub WebP, np. logo 512 × 512 o nazwie logo.png. API przyjmuje pliki do 5 MiB o bokach od 100 do 4096 pikseli. Tryb testowy sprawdza plik i bezpłatnie zwraca stały SVG z oznaczeniem „TEST MODE”. Ten plik sprawdza żądanie i pobieranie. Jakość wektoryzacji oceń na własnym obrazie w trybie produkcyjnym. Tryb testowy PerfectVector API
Uruchomiliśmy skrypt Pythona z kluczem testowym, pobraliśmy prawidłowy SVG i ponowiliśmy przesłanie z tym samym kluczem żądania. Oba wywołania zwróciły ten sam identyfikator konwersji.

Wyślij obraz i zapisz SVG w Pythonie
Zapisz poniższy kod jako vectorize.py. Argument files nakazuje bibliotece Requests utworzyć żądanie multipart, w którym oryginalne bajty są w polu formularza image. Przesyłanie multipart w 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])Uruchom polecenie z katalogu zawierającego logo.png. Wybierz identyfikator tej operacji i zapisz go przed uruchomieniem. API nazywa go kluczem idempotencji. Łączy on ponowienia tego samego przesłania z jedną konwersją. Przykład używa logo-asset-0001. Użyj innej wartości dla innego obrazu lub operacji. Bezpieczne ponawianie w PerfectVector
python vectorize.py logo.png logo-asset-0001Udana próba wypisuje identyfikator konwersji i liczbę bajtów oraz zapisuje logo.svg obok logo.png. Otwórz logo.svg, aby sprawdzić wyświetlanie próbki. Po pobraniu nowego pliku skrypt zastępuje istniejący SVG o tej samej nazwie. Pierwszy test wykonaj w katalogu tymczasowym.
Skrypt prosi serwer o maksymalnie 10 sekund oczekiwania przed zwróceniem niezakończonej konwersji. Sprawdza stany queued i processing mniej więcej co dwie sekundy i pobiera wynik po stanie succeeded. Konwersja testowa kończy się natychmiast. Aby sprawdzić ścieżkę oczekiwania przed wdrożeniem, użyj lokalnej odpowiedzi testowej z nieukończoną konwersją. Oczekiwanie i tryb asynchroniczny w PerfectVector
Odzyskaj konwersję po przekroczeniu limitu czasu
Jeśli Python wypisał identyfikator, sprawdź go przez GET /v1/vectorizations/{id}. Po powodzeniu użyj GET /v1/vectorizations/{id}/result na tym samym koncie i w tym samym trybie, aby pobrać SVG. Link wygasa 24 godziny po zakończeniu konwersji. Zapisz plik we własnym magazynie, jeśli przyda się później. Pobieranie wyników z PerfectVector
Jeśli skrypt zatrzymał się przed wypisaniem identyfikatora, ponów polecenie z identycznymi bajtami i kluczem idempotencji w ciągu 24 godzin od pierwszego żądania. Jeśli API przyjęło pierwsze żądanie, zwróci istniejącą konwersję. Po tym czasie żądanie z tym samym kluczem może rozpocząć nową. Bezpieczne ponawianie w PerfectVector
| Co widzisz | Co sprawdzić |
|---|---|
401 invalid_api_key | Ustaw aktualny klucz testowy w środowisku Pythona. Jeśli został odwołany, utwórz nowy w tym samym trybie. |
415 unsupported_media_type lub 422 invalid_image | Otwórz oryginał i sprawdź rzeczywisty format i wymiary. Zapisz poprawiony obraz i użyj nowego klucza dla tej operacji. |
Identyfikator konwersji, a potem processing_failed | API utworzyło wpis, ale obrazu nie udało się przekształcić. Sprawdź oryginał i wyślij poprawiony plik jako nową operację. |
409 idempotency_conflict | Tego samego klucza użyto z innymi bajtami lub opcjami. Do odzyskania wyniku użyj oryginału. Dla nowych danych ustaw nowy klucz. |
Jeśli potrzebujesz pomocy, zachowaj identyfikator żądania z wyjątku lub identyfikator konwersji ze skryptu. Dokumentacja błędów API wyjaśnia, przy których błędach można bezpiecznie ponowić żądanie.
Najczęstsze pytania
Czy tym samym skryptem przekształcę JPEG lub WebP?
Tak. Podaj JPEG lub WebP jako pierwszy argument. Obowiązują te same limity wielkości, wymiarów i jednej klatki. Plik wynikowy ma rozszerzenie SVG.
Czy tego przykładu w Pythonie mogę użyć dla całego folderu?
Najpierw sprawdź przesłanie i pobranie jednego pliku. Dla folderu zapisuj klucz, identyfikator i ścieżkę każdego pliku w trwałej kolejce. PerfectVector domyślnie pozwala na jedną aktywną konwersję produkcyjną na konto. Poczekaj na jej zakończenie przed wysłaniem kolejnej. Limity PerfectVector API
Źródła
- Requests — szybki start — pliki multipart, limity czasu i bajty odpowiedzi.
- PerfectVector — tryb testowy — limity przesyłania, stały SVG i kredyty w trybie testowym.
- PerfectVector — oczekiwanie i tryb asynchroniczny — oczekiwanie na serwerze, sprawdzanie stanu i zakończenie żądania testowego.
- PerfectVector — idempotencja — czas ważności i zakres klucza, konflikty i ponowienia.
- PerfectVector — wyniki — punkt końcowy wyniku, uwierzytelnianie i wygaśnięcie.
- PerfectVector — błędy — kody problemów HTTP i odzyskiwanie wyników.
- PerfectVector — limity — domyślny limit aktywnych konwersji i ograniczenia plików.
Pobierz klucz testowy na stronie PerfectVector API, uruchom skrypt na własnym obrazie i sprawdź, czy zapisany SVG się otwiera, a terminal wyświetla identyfikator konwersji.
Więcej z bloga
Najlepsze narzędzia AI do wektoryzacji 2026: wybór według zastosowania
Nasz werdykt na 2026: PerfectVector to pierwszy wybór do logo, ikon, ilustracji i plików do cięcia. Sprawdź, która alternatywa pasuje do pełnego koloru, API, darmowej pracy lub Adobe.
Konwersja folderu obrazów do SVG w Claude Code
Zaplanuj konwersję całego folderu do SVG w Claude Code i PerfectVector MCP. Nadaj wynikom unikalne ścieżki i sprawdź lokalnie, których plików brakuje.


