API para la vectorización de imágenes

Vectorizer.AI ofrece una API completa para trazar mapas de bits. La API convierte píxeles en vectores de manera completamente automática y con fidelidad de la más alta calidad.

Obtener la clave de la API

Inicio rápido

Cargue una imagen de mapa de bits y obtenga un resultado vectorizado:

$ curl https://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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://es.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

Precios

La integración y prueba de la API es gratis. No requiere suscripción.

Simplemente use el código mode=test para el desarrollo. Puede ver la calidad del resultado usando la aplicación Web interactiva en la página inicial.

Los resultados de la producción requieren una suscripción y cada uno cuesta 1,00 crédito.

También ofrecemos vistas previas del resultado que podrá mostrar a sus usuarios finales antes de que lo compren.

Las vistas previas son imágenes PNG cuatro veces más grandes que la imagen original, con una marca de agua discreta y cuestan 0,20 créditos cada una.

Simplemente use mode=preview para ver la vista previa del resultado.

Consulte la página de créditos para ver los planes de suscripción.

Autenticación y seguridad

La API usa autenticación de acceso básico a HTTP estándar. Todas las peticiones a la API se harán en HTTPS e incluirán su información de acceso a la API, donde la Id de la API es el usuario y el código secreto de la API es la contraseña.

Su biblioteca cliente de http debe ser compatible con la Indicación de nombre del servidor (SNI) para poder hacer peticiones. Si tiene errores raros de protocolo de enlace, esta es la razón más probable.

Limitaciones de la velocidad de respuesta

El uso de la API tiene limitaciones de velocidad de respuesta con amplias asignaciones sin límite superior.

Durante la operación normal impulsada por el usuario es improbable que vea límites de la velocidad de respuesta ya que en ese caso el uso tiende a fluir de una manera que el servicio maneja muy bien.

Sin embargo, para los procesos en lotes recomendamos que comience con 5 hilos máximo y puede agregar 1 hilo nuevo cada 5 minutos hasta que llegue al nivel deseado de paralelismo. Si necesita más de 100 hilos actuales, comuníquese con nosotros antes de comenzar.

Si envía demasiadas peticiones comenzará a recibir la respuesta 429 Too Many Requests. Si esto sucede, debe aplicar una espera lineal: cuando reciba la primera respuesta de ese tipo, espere 5 segundos antes de enviar la siguiente petición. Cuando reciba la segunda respuesta 429 consecutiva, espere 2*5=10 segundos antes de enviar la siguiente petición. Cuando reciba la tercera respuesta, espere 3*5=15, etc.

Puede restablecer el contador de espera después de una petición exitosa y deberá poder aplicar la espera por cada hilo (es decir, los hilos deben operar de manera independiente entre sí).

Error de objeto JSON

Usamos estratos convencionales de HTTP para indicar el éxito o el fracaso de una petición API e incluímos información importante del error en el objeto de error JSON devuelto.

Tratamos de siempre regresar un objeto de error JSON con las solicitudes problemáticas. Sin embargo, siempre es teóricamente posible tener fallas del servidor interno que conducen a una respuesta de error que no es tipo JSON.

Atributos

statusEl estado HTTP de la respuesta, se repite aquí para ayudarle con la depuración.
codeCódigo de error interno de Vectorizer.AI.
messageMensaje de error en lenguaje natural, previsto para ayudar con la depuración.

Si el estadeo del HTTP de su petición es 200, no se devolverá un objeto JSON de error y podrá suponer en términos generales que la petición tuvo éxito.

Algunas bibliotecas de clientes HTTP producen exepciones para estratos HTTP en la gama de 400-599. Tendrá que darse cuenta de esas excepciones y resolverlas apropiadamente.

HTTP StatusSignificado
200-299

Éxito

400-499

Hay un problema con la información proporcionada en la solicitud (p. ej. un parámetro faltante). Revise el mensaje de error para determinar cómo arreglarlo.

500-599

Hubo un error interno de Vectorizer.AI. Espere un momento y vuelva a intentar, y si el problema persiste, envíenos un mensaje de correo electrónico.

Ejemplo de una respuesta de error

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

Los errores recientes de la API se enumeran en la página de su cuenta para que los pueda depurar.

También hay una lista de todas las respuestas de error que la API devuelve.

Vectorizar POST
https://api.vectorizer.ai/api/v1/vectorize

Para convertir una imagen en vectores se ejecuta una petición HTTP POST estándar para cargar el archivo. Tenga en cuenta que el tipo de contenido tiene que ser multipart/form-data cuando carga archivos binarios.

La tabla siguiente muestra todos los parámetros de la API para probar. Cada parámetro tiene una breve descripción, pero asegúrese de ver la documentación de las opciones detalladas de los resultados.

Parámetros

La imagen original se debe proporcionar como una de:


Binaria

Un archivo binario.


Cadena

Un cadena codificada con base 64. La cadena no puede de más de 1 megabyte.


Cadena

Un URL para obtener y procesar.

Debe ser un archivo .bmp, .gif, .jpeg, .png o .tiff.

El tamaño máximo de una imagen para cargarla (= ancho × altura) es 33.554.432píxeles, que se reduce a input.max_pixels.


Enum, predeterminado: production
Value Processing Mode Credits
production

Este modo está previsto para producción y admite todos los parámetros.

1.00
preview

Este modo está previsto para cuando quiere mostrarle al usuario final una vista previa antes de comprar.

Produce un resultado en PNG 4x con una marca de agua discreta y hace caso omiso de los parámetros contradictorios.

0.20
test

Este modo está previsto para desarrolladores cuando lo integran con el servicio. Admite todos los parámetros, pero tiene una marca de agua fuerte.

Los resultados de la prueba son gratis y no requieren una subscripción activa, así es que puede integrarse con el servicio sin cargo.

Gratis

Número entero, 100 a 2097252, predeterminado: 2097252

El tamaño máximo de la imagen de entrada (= ancho × altura en píxeles). Las imágenes más grandes serán reducidas a este tamaño antes de procesarlas.


Número entero, 0 a 256, predeterminado: 0

El número máximo de colores a usar para el resultado.

0 significa ilimitado. 1 y 2 significan dos colores, p. ej. negro y blanco. N>=2 significa ese número de colores.

Tome en cuenta que si output.gap_filler.enabled=true (la opción predeterminada), el resultado también contendrá mezclas de los colores seleccionados. Inhabilite Rellenar espacios para obtener un resultado solo con los colores seleccionados.


Enum, predeterminado: svg

Formato del archivo resultante.

Opciones de SVG:


Enum, predeterminado: svg_1_1

Especifique el atributo de versión de SVG en la etiqueta SVG. Detalles


Booleano, predeterminado: false

Si incluir los atributos de tamaño de imagen en la etiqueta SVG. Cuando true loS USUARIOS generalmente verán la imagen en SVG de un tamaño fijo. Cuando false los usuarios generalmente dejarán que la imagen en SVG se ajuste al tamaño disponible. Detalles


Booleano, predeterminado: false

Cuando true inhabilitamos opciones que Adobe Illustrator no puede importar. Detalles

opciones de DXF:


Enum, predeterminado: lines_and_arcs

Los lectores de DXF varían ampliamente en sus habilidades. Esta opción le permite restringir el resultado a las primitivas gráficas compatibles con su lector de DXF. Detalles

Opciones de mapas de bits:


Enum, predeterminado: anti_aliased
Value Anti-Aliasing Mode
anti_aliased Los píxeles a lo largo de los bordes entre las figuras tienen los colores mezclados según la fracción del área del píxel cubierta por cada figura.
aliased A los píxeles se les asigna el color de la figura que contiene el centro geométrico del píxel.

Enum, predeterminado: fill_shapes

Especifique cómo quiere que el producto se trace o rellene. Existe una diferencia sutil entre delinear las figuras y delinear los bordes entre cada una. Consulte la documentación detallada para ver una explicación


Enum, predeterminado: cutouts

Determina si las figuras son colocadas en recortes en las figuras abajo (cutouts) o si se apilarán (stacked). Detalles


Enum, predeterminado: none
Value Shape grouping
none Sin agrupar
color Por color, interactúa con output.shape_stacking
parent Por la figura que contiene a las demás
layer Por Capa según el orden de dibujo
Detalles

Booleano, predeterminado: false

Aplanar círculos, elipses, rectángulos, triángulos y estrellas que se hayan identificado en curvas ordinarias. Detalles

Curvas:


Booleano, predeterminado: true

Si permitir las curvas de Bézier cuadráticas. Detalles


Booleano, predeterminado: true

Si permitir las curvas de Bézier cúbicas. Detalles


Booleano, predeterminado: true

Si permitir arcos circulares. Detalles


Booleano, predeterminado: true

Si permitir arcos elípticos. Detalles


Float, 0.001 a 1.0, predeterminado: 0.1

Distancia máxima en píxeles entre una curva y la línea que la aproxima. Detalles

Rellenar espacios:


Booleano, predeterminado: true

Si solucionar los errores que producen líneas blancas comunes en los visores de vectores. Detalles


Booleano, predeterminado: false

Si recortar los trazos para rellenar espacios. Cuando output.shape_stacking=stacked usar recorte o trazos sin ajuste de escala. Detalles


Booleano, predeterminado: true

Si usar trazos para rellenar sin ajuste de escala. Cuando output.shape_stacking=stacked usar recorte o trazos sin ajuste de escala. Detalles


Float, 0.0 a 5.0, predeterminado: 2.0

Ancho de los trazos para rellenar espacios. Detalles

Estilo de delineado cuando output.draw_style es stroke_shapes o stroke_edges


Booleano, predeterminado: true

Si usar delineado no escalable. Detalles


Booleano, predeterminado: false

Si usar un color que invalida o el color estimado de la figura. Detalles


Formato: '#RRGGBB', p. ej. #FF00FF, predeterminado: #000000

El color de reemplazo. Detalles


Float, 0.0 a 5.0, predeterminado: 1.0

Ancho del delineado. Detalles

Tamaño del archivo:


Float, 0.0 a 1000.0

Factor de escala uniforme. Si se especifica, tiene prioridad antes que output.size.width y output.size.height


Float, 0.0 a 1.0E12

Ancho en unidades especificadas por output.size.unit. Si se especifica solamente un ancho y una altura, los otros se calculan automáticamente para preservar la relación de aspecto.


Float, 0.0 a 1.0E12

Altura en unidades especificadas por output.size.unit. Si se especifica solamente un ancho y una altura, los otros se calculan automáticamente para preservar la relación de aspecto.


Enum, predeterminado: none

La unidad de medida para el ancho y la altura. De estos, pt, in, cm y mm son unidades físicas y none y px no son unidades físicas. Estas distinciones interactúan con output.size.input_dpi y output.size.output_dpi.


Enum, predeterminado: preserve_inset

Valor Regla para ajustar a escala
preserve_inset Ajustar a escala de modo uniforme para que quepa en la dimensión más pequeña, de modo que no se pasa de los límites, sino que es espacio vacío en la otra dimensión
preserve_overflow Ajustar a escala de modo uniforme para que quepa en la dimensión menos ajustada, pero se pase de los límites en la dimensión más pequeña
stretch Ajustar a escala no uniforme para que quepa en el ancho y la altura especificados
Para cualquiera de las opciones de preserve, la posición de la dimensión no constreñida sea controlada por output.size.align_x o por output.size.align_y.


Float, 0.0 a 1.0, predeterminado: 0.5

Alineación horizontal para output.size.aspect_ratio = preserve_inset o preserve_overflow.

Valor Alineación horizontal
0.0 Alineada a la izquierda
0.5 Centrada horizontalmente
1.0 Alineada a la derecha
Puede ser un valor entre 0.0 y 1.0.


Float, 0.0 a 1.0, predeterminado: 0.5

Alineación vertical para output.size.aspect_ratio = preserve_inset o preserve_overflow.

Valor Alineación vertical
0.0 Alineada arriba
0.5 Centrada verticalmente
1.0 Centrada abajo
Puede ser un valor entre 0.0 y 1.0.


Float, 1.0 a 1000000.0

Los PPP de la imagen se leen del archivo, cuando están disponibles. Este parámetro permite invalidar ese valor. El valor resultante se usa para calcular el tamaño físico de la imagen original, que se usa para calcular el tamaño del a imagen resultante, si se especifican unidades físicas para la imagen resultante, pero no un ancho o una altura explícitos.


Float, 1.0 a 1000000.0

Los PPP de la imagen resultante. Esto se usa para calcular el tamaño en píxeles de la imagen resultante en mapas de bits cuando se especifican unidades físicas.

Estatus de la cuenta GET
https://api.vectorizer.ai/api/v1/account

Obtenga información básica sobre su cuenta, por ejemplo, el estado de su suscripción y el número de créditos restantes.

Parámetros

Ninguna

Atributos de la respuesta

subscriptionPlan

El plan en el que está inscrito ahora o 'ninguno'.

subscriptionState

El estado de su suscripción actual ('activa' o 'vencida') o 'cancelada' si no está inscrito.

credits

Los créditos de la API restantes en su cuenta. 0 si no está inscrito actualmente o si está inscrito en un plan sin API. Puede ser fraccional, así es que asegúrese de analizarlo como un Double.

Nombre de usuario = Id de la API, contraseña = código secreto

cURL

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

Respuesta del ejemplo

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

Registro de cambios de la API

FechaCambiar
24 ene 2024 Se agregó el punto de conexión al estatus de la cuenta. Se agregaron los errores de la API recientes a la página de la cuenta. Se agregó una lista de todas las respuestas de error de la API.
16 ene 2024 Se documentó el objeto JSON del error.
3 oct 2023 Tome en cuenta que output.gap_filler.enabled=true produce más colores en el resultado que lo solicitado en processing.max_colors.
20 sept 2023 Agregamos mode
1 ago 2023 Agregamos un grupo de opciones de tamaño resultante con las siguientes opciones: 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, output.size.output_dpi. Agregamos un grupo de opciones de resultado en mapa de bits con una opción: output.bitmap.anti_aliasing_mode.
7 jun 2023 Agregamos processing.max_colors
31 may 2023 Ampliamos en gran medida los parámetros de la API. Actualizamos el punto de acceso de la API.
10 mar 2023 Publicación inicial.
Obtener la clave de la API