API de vetorização de imagens

O Vectorizer.AI oferece uma API completa para rastreamento de bitmap. A API rastreia pixels para vetores com fidelidade inigualável, de forma totalmente automática.

Obter a chave de API

Guia de início rápido

Entre com uma imagem bitmap e obtenha como retorno o resultado vetorizado:

$ curl https://pt.vectorizer.ai/api/v1/vectorize \
 -u xyz123:[secret] \
 -F image=@example.jpeg \
 -o result.svg
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://pt.vectorizer.ai/api/v1/vectorize")
   .addHeader("Authorization", "Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd")
   .body(
      MultipartEntityBuilder.create()
         .addBinaryBody("image", new File("example.jpeg")) // TODO: Replace with your image
         // TODO: Add more upload parameters here
         .build()
      );
ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse();

if (response.getCode() == 200) {
   // Write result to disk, TODO: or wherever you'd like
   try (FileOutputStream out = new FileOutputStream("result.svg")) {
      response.getEntity().writeTo(out);
   }
} else {
   System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase());
}
using (var client = new HttpClient())
using (var form = new MultipartFormDataContent())
{
   client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE");
   form.Add(new ByteArrayContent(File.ReadAllBytes("example.jpeg")), "image", "example.jpeg"); // TODO: Replace with your image
   // TODO: Add more upload parameters here

   var response = client.PostAsync("https://pt.vectorizer.ai/api/v1/vectorize", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("result.svg", FileMode.Create, FileAccess.Write, FileShare.None);
      response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); });
   }
   else
   {
       Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase);
   }
}
// Requires "request" to be installed (see https://www.npmjs.com/package/request)
var request = require('request');
var fs = require('fs');

request.post({
  url: 'https://pt.vectorizer.ai/api/v1/vectorize',
  formData: {
    image: fs.createReadStream('example.jpeg'), // TODO: Replace with your image
    // TODO: Add more upload options here
  },
  auth: {user: 'xyz123', pass: '[secret]'},
  followAllRedirects: true,
  encoding: null
}, function(error, response, body) {
  if (error) {
    console.error('Request failed:', error);
  } else if (!response || response.statusCode != 200) {
    console.error('Error:', response && response.statusCode, body.toString('utf8'));
  } else {
    // Save result
    fs.writeFileSync("result.svg", body);
  }
});
$ch = curl_init('https://pt.vectorizer.ai/api/v1/vectorize');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
      'image' => curl_file_create('example.jpeg'),
      // TODO: Add more upload options here
    ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$data = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) {
  // Save result
  file_put_contents("result.svg", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Either use the sample code below, or this SDK: https://pypi.org/project/vectorizer-ai/
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://pt.vectorizer.ai/api/v1/vectorize',
    files={'image': open('example.jpeg', 'rb')},
    data={
        # TODO: Add more upload options here
    },
    auth=('xyz123', '[secret]')
)
if response.status_code == requests.codes.ok:
    # Save result
    with open('result.svg', 'wb') as out:
        out.write(response.content)
else:
    print("Error:", response.status_code, response.text)
# Requires: gem install httpclient
require 'httpclient'

client = HTTPClient.new default_header: {
  "Authorization" => "Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd"
}

response = client.post("https://pt.vectorizer.ai/api/v1/vectorize", {
  "image" => File.open("example.jpeg", "rb"), # TODO: Replace with your image
  # TODO: Add more upload parameters here
})

if response.status == 200 then
  # Write result to disk, TODO: or wherever you'd like
  File.open("result.svg", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end
$ curl https://pt.vectorizer.ai/api/v1/vectorize \
 -u xyz123:[secret] \
 -F 'image.url=https://example.com/example.jpeg' \
 -o result.svg
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://pt.vectorizer.ai/api/v1/vectorize")
   .addHeader("Authorization", "Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd")
   .body(
      MultipartEntityBuilder.create()
         .addTextBody("image.url", "https://example.com/example.jpeg") // TODO: Replace with your image URL
         // TODO: Add more upload parameters here
         .build()
      );
ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse();

if (response.getCode() == 200) {
   // Write result to disk, TODO: or wherever you'd like
   try (FileOutputStream out = new FileOutputStream("result.svg")) {
      response.getEntity().writeTo(out);
   }
} else {
   System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase());
}
using (var client = new HttpClient())
using (var form = new MultipartFormDataContent())
{
   client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE");
   form.Add(new StringContent("https://example.com/example.jpeg"), "image.url"); // TODO: Replace with your image URL
   // TODO: Add more upload parameters here

   var response = client.PostAsync("https://pt.vectorizer.ai/api/v1/vectorize", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("result.svg", FileMode.Create, FileAccess.Write, FileShare.None);
      response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); });
   }
   else
   {
       Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase);
   }
}
// Requires "request" to be installed (see https://www.npmjs.com/package/request)
var request = require('request');
var fs = require('fs');

request.post({
  url: 'https://pt.vectorizer.ai/api/v1/vectorize',
  formData: {
    'image.url': 'https://example.com/example.jpeg', // TODO: Replace with your image
    // TODO: Add more upload options here
  },
  auth: {user: 'xyz123', pass: '[secret]'},
  followAllRedirects: true,
  encoding: null
}, function(error, response, body) {
  if (error) {
    console.error('Request failed:', error);
  } else if (!response || response.statusCode != 200) {
    console.error('Error:', response && response.statusCode, body.toString('utf8'));
  } else {
    // Save result
    fs.writeFileSync("result.svg", body);
  }
});
$ch = curl_init('https://pt.vectorizer.ai/api/v1/vectorize');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
      'image.url' => 'https://example.com/example.jpeg',
      // TODO: Add more upload options here
    ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$data = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) {
  // Save result
  file_put_contents("result.svg", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Either use the sample code below, or this SDK: https://pypi.org/project/vectorizer-ai/
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://pt.vectorizer.ai/api/v1/vectorize',
    data={
        'image.url': 'https://example.com/example.jpeg',
        # TODO: Add more upload options here
    },
    auth=('xyz123', '[secret]')
)
if response.status_code == requests.codes.ok:
    # Save result
    with open('result.svg', 'wb') as out:
        out.write(response.content)
else:
    print("Error:", response.status_code, response.text)
# Requires: gem install httpclient
require 'httpclient'

client = HTTPClient.new default_header: {
  "Authorization" => "Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd"
}

response = client.post("https://pt.vectorizer.ai/api/v1/vectorize", {
  "image.url" => "https://example.com/example.jpeg", # TODO: Replace with your image URL
  # TODO: Add more upload parameters here
})

if response.status == 200 then
  # Write result to disk, TODO: or wherever you'd like
  File.open("result.svg", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end

Preços

Você pode integrar e testar a API gratuitamente. Não é necessário assinar.

Para desenvolvimento, use mode=test. Você pode avaliar a qualidade do resultado usando o app interativo da Web na página inicial do site.

Os resultados de produção requerem assinatura e cada um corresponde a 1,00 crédito.

Também oferecemos a visualização de uma prévia dos resultados, para que o seu usuário final os veja antes de fazer a compra.

As prévias são imagens PNG quatro vezes maiores do que a imagem de entrada, contêm uma marca d'água discreta e custam 0,20 crédito cada uma.

Use mode=preview para ver um resultado prévio.

Consulta os planos de assinatura na página de preços.

Autenticação e segurança

A API usa autenticação padrão HTTP básica de acesso. Todas as requisições para a API devem ser feitas em HTTPS e incluir suas credenciais da API, tendo API Id como usuário e API Secret como senha.

Sua biblioteca de cliente HTTP deve aceitar Indicação de Nome do Servidor (SNI) para fazer requisições corretamente. Se você estiver recebendo erros de handshake estranhos, provavelmente esta é a causa.

Limitação de velocidade

O uso da API tem limite de taxa com margens generosas e não há tetos definitivos.

Durante as operações conduzidas pelo usuário final, é improvável que você tenha limitações de velocidade, pois o uso é adaptado pelo sistema de forma transparente.

No entanto, para trabalhos em lote, recomendamos começar com no máximo cinco ramificações e adicionar uma nova ramificação a cada cinco minutos, até atingir o nível de paralelismo desejado. Se você precisa de mais de 100 ramificações simultâneas, fale conosco antes de começar.

Se enviar requisições em excesso, você começará a receber respostas do tipo 429 Too Many Requests. Se isso ocorrer, você deverá aplicar um algoritmo de back off linear: na primeira resposta desse tipo, aguarde 5 segundos até reenviar a requisição seguinte. Na segunda resposta 429 consecutiva, aguarde 2 x 5=10 segundos até reenviar a requisição seguinte. Na terceira, aguarde 3 x 5=15 segundos, e assim por diante.

Você poderá reinicializar o contador de back off após o processamento satisfatório de uma requisição, e o back off deve ser aplicado ramificação a ramificação, ou seja, as ramificações devem operar independentemente.

Limite de tempo de inatividade

Em geral, as solicitações de API são executadas em segundos, mas é possível que o tempo de processamento seja mais longo durante picos de carga.

Para assegurar que sua biblioteca de cliente não encerre solicitações de API prematuramente, ela deveria ser configurada com um limite de tempo de inatividade mínimo de 180 segundos

Objeto JSON de erro

Usamos status HTTP convencionais para indicar êxito ou falha de uma requisição de API e incluir informações importantes sobre erro no objeto JSON de erro retornado.

Tentamos sempre retornar um objeto JSON de erro com qualquer requisição problemática. Teoricamente, no entanto, sempre é possível haver falhas internas no servidor que resultam em uma resposta de erro não JSON.

Atributos

statusO status HTTP da resposta, repetido aqui para auxílio na depuração de erros.
codecódigo interno de erro Vectorizer.AI
messageMensagem de erro inteligível, para ajudar na depuração.

Se o status HTTP da sua requisição for 200, não haverá retorno de Objeto JSON de erro e você pode supor com segurança que a requisição foi, de forma geral, exitosa.

Algumas bibliotecas de cliente HTTP suscitam exceções para status HTTP no intervalo 400-599. Você deverá obter essas exceções e tratá-las adequadamente.

HTTP StatusSignificado
200-299

Êxito

400-499

Há um problema com as informações fornecidas na requisição, por exemplo, a falta de um parâmetro. Analise a mensagem de erro para resolver como solucioná-lo.

500-599

Houve um erro interno no Vectorizer.AI. Aguarde alguns momentos e tente novamente. Se o problema persistir, envie-nos um e-mail.

Exemplo de resposta de erro

{
  "error" : {
    "status" : 400,
    "code" : 1006,
    "message" : "Failed to read the supplied image. "
  }
}

Os erros de API recentes estão relacionados na página da sua conta para facilitar o debugging.

Também há uma lista de todas as respostas de erro retornadas pela API.

Vetorização POST
https://api.vectorizer.ai/api/v1/vectorize

Para vetorizar uma imagem, basta fazer um upload de arquivo HTTP POST padrão. Lembre-se de que o Content-Type deve ser multipart/form-data no upload de arquivos binários.

A tabela abaixo lista todos os parâmetros da API para que você possa testar agora. Cada parâmetro tem uma descrição sucinta, mas você pode consultar mais detalhes na Documentação de opções de saída.

Parâmetros

A imagem de entrada de ser fornecida como:


Binário

Um arquivo binário.


Cadeia de caracteres

Uma cadeia de caracteres codificada como base 64. A cadeia de caracteres pode ter o comprimento máximo de 1 megabyte.


Cadeia de caracteres

Um URL para buscar e processar.

O arquivo deve ser .bmp, .gif, .jpeg, .png ou tiff.

O tamanho máximo de imagem para upload (= largura × altura) é 33.554.432 pixels, que é reduzido para input.max_pixels.


Enum, padrão: production
Value Processing Mode Credits
production

Este modo é usado em produção e trabalha com todos os parâmetros.

1.00
preview

Este modo é usado quando você quer mostrar ao seu usuário final uma prévia antes que ele faça a compra.

Ele produz um resultado PNG quatro vezes maior, incorpora uma marca d'água discreta e ignora os parâmetros contraditórios.

0.20
test

Este modo é usado pelo desenvolvedor para integração com o serviço. Todos os parâmetros são usados, mas incorpora uma marca d'água substancial.

Os resultados dos testes são gratuitos e não exigem uma assinatura ativa, para que você não incorra em custos de integração ao serviço.

Gratuito

Inteiro, de 100 a 3145828, padrão: 2097252

O tamanho máximo da imagem de entrada (= largura × altura em pixels). Imagens maiores serão reduzidas para esse tamanho antes do processamento.


Inteiro, de 0 a 256, padrão: 0

A quantidade máxima de cores a usar no resultado.

0 significa ilimitada. 1 e 2 significam duas cores, por exemplo, branco e preto. N>=2 significa quantidade de cores específica.

Note que se output.gap_filler.enabled=true (o padrão), o resultado também conterá mesclas das cores selecionadas. Desative o preenchimento de lacunas para obter um resultado que inclua apenas as cores selecionadas.


Enum, padrão: svg

Formato do arquivo de saída.

Opções SVG:


Enum, padrão: svg_1_1

Especificar o atributo da versão SVG na tag SVG. Detalhes


Booleano, padrão: false

Definir se os atributos de tamanho da imagem serão incluídos na tag SVG. Quando true, de forma geral, os visualizadores apresentarão o SVG em um tamanho fixo. Quando false, de forma geral, os visualizadores apresentarão o SVG ajustado ao espaço disponível. Detalhes


Booleano, padrão: false

Quando true, as opções que o Adobe Illustrator não consegue importar são desativadas. Detalhes

Opções DFX:


Enum, padrão: lines_and_arcs

As habilidades dos diversos leitores DXF variam enormemente. Esta opção permite a você restringir a saída às primitivas de desenho compatíveis com o seu leitor DXF. Detalhes

Opções de Bitmap:


Enum, padrão: anti_aliased
Value Anti-Aliasing Mode
anti_aliased Os pixels ao longo da borda entre formas têm as cores mescladas de acordo com a fração da área do pixel coberta por cada forma.
aliased As cores da forma que contém o centro geométrico do pixel são atribuídas aos pixels.

Enum, padrão: fill_shapes

Especifique como você quer que a saída seja traçada ou preenchida. Há uma diferença sutil entre o traçado das formas e o traçado das bordas entre elas. Consulte a documentação detalhada para uma explicação completa.


Enum, padrão: cutouts

Determina se as formas são postas em recortes nas formas embaixo delas (cutouts) ou se são empilhadas por sobreposição (stacked). Detalhes


Enum, padrão: none
Value Shape grouping
none Sem agrupamento
color Por cor, interage com output.shape_stacking
parent Por forma que contém outras
layer Por ordem e camadas de desenho
Detalhes

Booleano, padrão: false

Nivela os círculos, elipses, retângulos, triângulos e estrelas a curvas ordinárias. Detalhes

Curvas:


Booleano, padrão: true

Se curvas de Bézier quadráticas são permitidas. Detalhes


Booleano, padrão: true

Se curvas de Bézier cúbicas são permitidas. Detalhes


Booleano, padrão: true

Se arcos circulares são permitidos. Detalhes


Booleano, padrão: true

Se arcos elípticos são permitidos. Detalhes


Flutuante, de 0.001 a 1.0, padrão: 0.1

Distância máxima em pixels entre uma curva e a linha que a aproxima. Detalhes

Preenchimento de lacunas:


Booleano, padrão: true

Se a linha branca provocada por bugs comuns de renderização nos visualizadores de vetores devem ser trabalhadas. Detalhes


Booleano, padrão: false

Se os traços de preenchimento de lacunas devem ser recortados. Quando output.shape_stacking=stacked, pode recortar ou usar traços não escaláveis. Detalhes


Booleano, padrão: true

Se traços não escaláveis de preenchimento de lacunas podem ser usados. Quando output.shape_stacking=stacked, pode recortar ou usar traços não escaláveis. Detalhes


Flutuante, de 0.0 a 5.0, padrão: 2.0

Largura dos traços de preenchimento de lacunas. Detalhes

Estilo de traço quando output.draw_style é stroke_shapes ou stroke_edges


Booleano, padrão: true

Se um traço não escalável pode ser usado. Detalhes


Booleano, padrão: false

Se deve ser usada uma cor substituta ou a cor estimada da forma . Detalhes


Formato: '#RRGGBB', exemplo #FF00FF, padrão: #000000

A cor substituta. Detalhes


Flutuante, de 0.0 a 5.0, padrão: 1.0

Largura do traço. Detalhes

Tamanho da saída:


Flutuante, de 0.0 a 1000.0

Fator de escala uniforme. Se especificado, tem precedência sobre output.size.width e output.size.height.


Flutuante, de 0.0 a 1.0E12

Largura, em unidades especificadas por output.size.unit. Se apenas a largura ou altura for especificada, a outra dimensão será calculada automaticamente de forma a preservar a razão de aspecto.


Flutuante, de 0.0 a 1.0E12

Altura, em unidades especificadas por output.size.unit. Se apenas a largura ou altura for especificada, a outra dimensão será calculada automaticamente de forma a preservar a razão de aspecto.


Enum, padrão: none

A unidade de medida para altura e largura. Dentre essas, pt, in, cm e mm são unidades físicas. none e px são unidades não físicas. Essas distinções interagem com output.size.input_dpi e output.size.output_dpi.


Enum, padrão: preserve_inset

Valor Regra de escala
preserve_inset Escala uniformemente para ajustar-se à dimensão mais estreita, de forma que não haja transbordamento, mas haja espaço vazio na outra dimensão
preserve_overflow Escala uniformemente para ajustar-se à dimensão menos estreita, com transbordamento da dimensão mais estreita
stretch Escala não uniformemente para ajustar-se à altura e largura especificadas
Para ambas as opções de preserve, a posição na dimensão ilimitada é controlada por output.size.align_x ou output.size.align_y.


Flutuante, de 0.0 a 1.0, padrão: 0.5

Alinhamento horizontal para output.size.aspect_ratio = preserve_inset ou preserve_overflow.

Valor Alinhamento horizontal
0.0 Alinhamento à esquerda
0.5 Centralizado horizontalmente
1.0 Alinhamento à direita
Qualquer valor entre 0.0 e 1.0 é permitido.


Flutuante, de 0.0 a 1.0, padrão: 0.5

Alinhamento vertical para output.size.aspect_ratio = preserve_inset ou preserve_overflow.

Valor Alinhamento vertical
0.0 Alinhado acima
0.5 Centralizado verticalmente
1.0 Alinhado abaixo
Qualquer valor entre 0.0 e 1.0 é permitido.


Flutuante, de 1.0 a 1000000.0

O DPI da imagem de entrada é lido do arquivo, se disponível. Este parâmetro permite substituir tal valor. O valor resultante é usado para calcular o tamanho físico da imagem de entrada, que é usado para calcular o tamanho da saída se forem especificadas as unidades físicas para ela, mas sem escolha explícita de altura e largura.


Flutuante, de 1.0 a 1000000.0

O valor de DPI da imagem de saída. Ele é usado para calcular o tamanho de pixel da saída bitmap quando as unidades físicas são especificadas.

Status da conta GET
https://api.vectorizer.ai/api/v1/account

Obtenha informações básicas sobre a sua conta, como o status da assinatura e o número de créditos remanescentes.

Parâmetros

Nenhum

Atributos de resposta

subscriptionPlan

O seu plano de assinatura atual ou "nenhum".

subscriptionState

O status do seu plano de assinatura atual ("ativo" ou "atrasado") ou, se não houver assinatura, "terminado".

credits

A quantidade de créditos da API remanescente em sua conta. 0 se não tiver assinatura ou se a assinatura for de uma plano sem API. Pode ser fracionário, portanto aplique parse como Double.

Nome do usuário = Id da API, Senha = Segredo da API

cURL

$ curl "https://api.vectorizer.ai/api/v1/account" \
 -u 123:[secret]

Exemplo de resposta

{
  "subscriptionPlan" : "none",
  "subscriptionState" : "ended",
  "credits" : 0
}

Histórico de alterações da API

DataAlterar
4 de mar. de 2024 Seção sobre limite de tempo foi adicionada.
24 de jan. de 2024 O endpoint Status da Conta foi adicionado. Os erros recentes de API foram adicionados à página da conta. A lista de todas as respostas de erro da API foi adicionada.
16 de jan. de 2024 Documentou o objeto JSON de erro.
3 de out. de 2023 Esclarecimento de que output.gap_filler.enabled=true resulta em mais cores do que o solicitado em processing.max_colors.
20 de set. de 2023 Foi adicionado mode
1 de ago. de 2023 Grupo completo de opções do tamanho da saída foi adicionado com as seguintes opções: output.size.scale, output.size.width, output.size.height, output.size.unit, output.size.aspect_ratio, output.size.align_x, output.size.align_y, output.size.input_dpi e output.size.output_dpi. Grupo de opções de saída bitmap foi adicionado com uma opção: output.bitmap.anti_aliasing_mode.
7 de jun. de 2023 Foi adicionado processing.max_colors
31 de mai. de 2023 Grande expansão dos parâmetro da API. Atualização do endpoint da API.
10 de mar. de 2023 Liberação inicial.
Obter a chave de API