PerfectVector
Por Jay

Como vetorizar uma imagem em Python com uma API

Envie um PNG, JPEG ou WebP a uma API de vetorização pelo Python. Salve o SVG, verifique a resposta de teste e recupere a conversão se a conexão cair.

7 min de leitura
Nesta página

Um script Python pode enviar uma imagem rasterizada à API do PerfectVector e salvar o SVG ao lado do original. O exemplo mostra o ID de conversão antes de baixar o arquivo. Se a conexão cair, você pode recuperar o resultado usando o ID ou a chave da requisição que escolheu.

Experimente com a sua própria imagem
Abrir a ferramenta completa
Teste grátis. Solte uma imagem e veja a prévia do seu vetor, sem precisar criar conta.

Prepare uma chave de teste e uma imagem

Crie uma chave de teste pela página da API para desenvolvedores. Defina a chave no terminal como PERFECTVECTOR_API_KEY e mantenha-a fora do script e do controle de versão. Instale o Requests no ambiente Python do projeto com python -m pip install requests.

No primeiro teste, use um PNG, JPEG ou WebP de quadro único, como um logo de 512 × 512 pixels chamado logo.png. A API aceita arquivos de até 5 MiB e imagens com 100 a 4096 pixels de cada lado. O modo de teste valida o envio e retorna sem cobrança um SVG fixo marcado como “TEST MODE”. O arquivo permite verificar a requisição e o download. Para avaliar a qualidade do traçado da sua imagem, faça uma conversão em produção. Modo de teste da API do PerfectVector

Executamos o script com uma chave de teste, baixamos um SVG válido e repetimos o upload com a mesma chave de requisição. As duas execuções retornaram o mesmo ID de conversão.

Diagrama do fluxo
Um arquivo rasterizado local segue em uma requisição identificada para um serviço na nuvem e volta como um arquivo vetorial em disco.
Guarde a chave junto com o envio e salve o ID de conversão antes de baixar o SVG.

Envie a imagem e salve o SVG em Python

Salve o código abaixo como vectorize.py. O argumento files faz o Requests montar um upload multipart com os dados originais no campo image. Uploads multipart com 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])

Execute a partir do diretório que contém logo.png. Escolha um identificador para a conversão e anote-o antes de rodar o comando. A API chama esse valor de chave de idempotência. Ele associa repetições de um mesmo envio a uma única conversão. O exemplo usa logo-asset-0001. Use outro valor para outra imagem ou operação. Repetições seguras no PerfectVector

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

Um teste bem-sucedido mostra o ID de conversão e a contagem de bytes e salva logo.svg ao lado de logo.png. Abra logo.svg para confirmar que o exemplo aparece. O script substitui um SVG com o mesmo nome depois que baixa o arquivo novo. Use uma pasta temporária no primeiro teste.

O script pede ao servidor que espere até 10 segundos antes de retornar uma conversão inacabada. Ele consulta os estados queued e processing a cada dois segundos, em média, e só baixa o resultado quando o status chega a succeeded. Conversões de teste terminam na hora. Simule uma resposta pendente em um teste local para verificar essa etapa antes de usá-la em produção. Espera e requisições assíncronas no PerfectVector

Recupere uma conversão após o tempo limite

Se o Python exibiu um ID, consulte-o com GET /v1/vectorizations/{id}. Quando a conversão terminar com sucesso, use GET /v1/vectorizations/{id}/result na mesma conta e modo para baixar o SVG. Os links expiram 24 horas após o término. Copie o arquivo para seu próprio armazenamento se precisar dele mais tarde. Downloads de resultados do PerfectVector

Se o Python parou antes de exibir o ID, execute o comando de novo com os mesmos dados e a mesma chave de idempotência em até 24 horas da primeira requisição. A API retorna a conversão existente se aceitou o primeiro envio. Após esse prazo, um envio com a mesma chave pode iniciar outra conversão. Repetições seguras no PerfectVector

O que apareceO que conferir
401 invalid_api_keyConfigure uma chave de teste válida no ambiente que o Python usa. Se revogou a chave, crie outra no mesmo modo.
415 unsupported_media_type ou 422 invalid_imageAbra o original e confira o formato real e as dimensões em pixels. Salve uma imagem corrigida e dê uma chave própria a esse envio.
Um ID de conversão seguido de processing_failedA API criou o registro, mas não conseguiu vetorizar a imagem. Examine o original e reenvie um arquivo corrigido como nova operação.
409 idempotency_conflictA mesma chave foi usada com outros dados ou opções. Recupere com o original ou dê uma nova chave à nova entrada.

Se precisar falar com o suporte, guarde o ID da requisição na exceção ou o ID de conversão exibido pelo script. A referência de erros da API indica quando é seguro tentar de novo.

Perguntas frequentes

O mesmo script Python vetoriza JPEG ou WebP?

Sim. Passe o JPEG ou WebP como primeiro argumento. Valem as mesmas regras de tamanho, dimensões e quadro único. A saída usa a extensão SVG.

Posso usar esse exemplo em Python para uma pasta inteira?

Primeiro, verifique um upload e um download. Para uma pasta, guarde a chave, o ID de conversão e o caminho de saída de cada arquivo em uma fila persistente. Por padrão, o PerfectVector permite uma conversão em produção por vez em cada conta. Espere o fim de cada uma antes de enviar a próxima. Limites da API do PerfectVector

Fontes

  1. Requests — Início rápido — Arquivos multipart, tempos limite e respostas binárias.
  2. PerfectVector — Modo de teste — Limites de upload, SVG fixo e créditos em modo de teste.
  3. PerfectVector — Espera e requisições assíncronas — Preferência de espera, consultas de status e conclusão de pedidos de teste.
  4. PerfectVector — Idempotência — Prazo, escopo, conflitos e regras de repetição da chave.
  5. PerfectVector — Resultados — Endpoint, autenticação e validade.
  6. PerfectVector — Erros — Códigos de erro HTTP e instruções para recuperação.
  7. PerfectVector — Limites — Simultaneidade em produção e limites de arquivo.

Obtenha uma chave de teste na página da API do PerfectVector e execute o script com uma imagem sua. Confirme que o SVG salvo abre e que o terminal mostra o ID de conversão.

Mais do blog

PerfectVector

Transforme sua imagem em
caminhos vetoriais limpos e editáveis

Vetorize e confira a visualização grátis, sem limite diário.