PerfectVector
Autor: Jay

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.

5 min czytania
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.

Wypróbuj na własnym obrazie
Otwórz pełne narzędzie
Za darmo i bez rejestracji: upuść obraz, aby zobaczyć podgląd swojego wektora.

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.

Schemat konwersji
Lokalny plik rastrowy trafia do żądania w chmurze z etykietą i wraca na dysk jako plik wektorowy.
Zachowaj klucz razem z danymi przesłanego pliku i zapisz identyfikator konwersji przed pobraniem SVG.

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-0001

Udana 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 widziszCo sprawdzić
401 invalid_api_keyUstaw 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_imageOtwórz oryginał i sprawdź rzeczywisty format i wymiary. Zapisz poprawiony obraz i użyj nowego klucza dla tej operacji.
Identyfikator konwersji, a potem processing_failedAPI utworzyło wpis, ale obrazu nie udało się przekształcić. Sprawdź oryginał i wyślij poprawiony plik jako nową operację.
409 idempotency_conflictTego 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

  1. Requests — szybki start — pliki multipart, limity czasu i bajty odpowiedzi.
  2. PerfectVector — tryb testowy — limity przesyłania, stały SVG i kredyty w trybie testowym.
  3. PerfectVector — oczekiwanie i tryb asynchroniczny — oczekiwanie na serwerze, sprawdzanie stanu i zakończenie żądania testowego.
  4. PerfectVector — idempotencja — czas ważności i zakres klucza, konflikty i ponowienia.
  5. PerfectVector — wyniki — punkt końcowy wyniku, uwierzytelnianie i wygaśnięcie.
  6. PerfectVector — błędy — kody problemów HTTP i odzyskiwanie wyników.
  7. 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

PerfectVector

Zamień obraz w
czyste, edytowalne ścieżki wektorowe

Wektoryzuj i sprawdzaj podgląd za darmo, bez dziennego limitu.