API de PNG a SVG#

La API de PNG a SVG incrusta una imagen PNG dentro de un contenedor SVG con una sola solicitud a POST /v1/convert/png-to-svg. Los datos del PNG se codifican en base64 y se colocan como un URI de datos dentro de un elemento <image> de SVG, con las dimensiones del SVG y el viewBox coincidiendo con las dimensiones en píxeles de la imagen original. Esto no es vectorización: la salida es una imagen ráster envuelta en SVG. Las respuestas devuelven los bytes del SVG directamente, o metadatos JSON con una URL de descarga prefirmada cuando direct_download=false.


Endpoint#

POST /v1/convert/png-to-svg

Content-Type: multipart/form-data

Entrada aceptada: archivos .png

Formato de salida: .svg (image/svg+xml)


Autenticación#

Requiere una clave de API privada o un token JWT de una clave pública.

X-API-Key: sk_your_private_key

O:

Authorization: Bearer <jwt_token>

Parámetros de la solicitud#

Parámetro Tipo Obligatorio Predeterminado Descripción
file file -- El archivo de imagen .png a convertir.
output_filename string No Nombre del archivo de entrada Nombre de archivo de salida personalizado. La extensión .svg se añade automáticamente.
direct_download boolean No true Cuando es true, devuelve los bytes de la imagen sin procesar. Cuando es false, devuelve metadatos JSON con una URL de descarga prefirmada.

Detalles de la conversión#

  • El PNG se codifica en base64 y se incrusta dentro de un elemento <image> de SVG como un URI de datos
  • Las dimensiones del SVG y el viewBox coinciden con las dimensiones en píxeles de la imagen original
  • La transparencia del PNG se conserva en los datos incrustados
  • Esto NO es vectorización: la salida contiene los datos completos de la imagen ráster, no rutas vectoriales
No es vectorización: Este endpoint incrusta la imagen ráster dentro de un contenedor SVG. No traza ni convierte la imagen en rutas vectoriales. El archivo de salida será más grande que el de entrada debido a la codificación base64 (~33% de sobrecarga).

Respuesta#

Descarga directa (direct_download=true, predeterminado)#

HTTP 200 OK
Content-Type: image/svg+xml
Content-Disposition: inline; filename="image_20260405_123456789.svg"

Devuelve los bytes de la imagen sin procesar.

Respuesta con metadatos (direct_download=false)#

{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/png-to-svg/image_20260405_123456789.svg",
    "filename": "image_20260405_123456789.svg",
    "file_size": 45678,
    "conversion_time_seconds": 0.5
}

Ejemplos de código#

Python#

import requests

with open("image.png", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/png-to-svg",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("image.png", f)}
    )

with open("image_20260405_123456789.svg", "wb") as out:
    out.write(response.content)

Node.js#

const form = new FormData();
form.append("file", fs.createReadStream("image.png"));

const response = await fetch("https://api.enconvert.com/v1/convert/png-to-svg", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

fs.writeFileSync("image_20260405_123456789.svg", Buffer.from(await response.arrayBuffer()));

PHP#

$ch = curl_init("https://api.enconvert.com/v1/convert/png-to-svg");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => ["file" => new CURLFile("image.png")]
]);
$output = curl_exec($ch);
curl_close($ch);
file_put_contents("image_20260405_123456789.svg", $output);

Go#

body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "image.png")
file, _ := os.Open("image.png")
io.Copy(part, file)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/png-to-svg", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)

Respuestas de error#

Estado Condición
400 Bad Request El archivo no es un archivo .png
400 Bad Request La conversión de la imagen falló (archivo corrupto o no compatible)
401 Unauthorized Falta la clave de API/token JWT o no es válida
402 Payment Required Se agotó la cuota mensual de ops
402 Payment Required Se alcanzó el límite de almacenamiento
413 Payload Too Large El archivo supera el tamaño máximo permitido por tu plan

Límites#

Límite Valor
Tamaño máximo de archivo Según el plan (Founding: 5 MB)
Calidad de salida Máxima (no configurable)
Conversiones mensuales Según el plan

Preguntas frecuentes#

¿La API de PNG a SVG vectoriza mi imagen?#

No. Este endpoint incrusta el PNG ráster dentro de un contenedor SVG como un URI de datos en base64 en un elemento <image> de SVG; no traza ni convierte la imagen en rutas vectoriales.

¿Por qué mi archivo SVG de salida es más grande que el PNG de entrada?#

El PNG se codifica en base64 al incrustarse en el SVG, lo que añade aproximadamente un 33% de sobrecarga, por lo que el archivo de salida es más grande que el de entrada.

¿Se conserva la transparencia del PNG al incrustarlo en el SVG?#

Sí. La transparencia del PNG se conserva en los datos incrustados, y las dimensiones del SVG y el viewBox coinciden con las dimensiones en píxeles de la imagen original.

¿Cómo convierto PNG a SVG con una API REST?#

Envía una solicitud POST a /v1/convert/png-to-svg con tu archivo .png como multipart/form-data, autenticada mediante X-API-Key o un token JWT Authorization: Bearer. Recibes los bytes del SVG, o un presigned_url en JSON cuando direct_download=false.

¿Por qué la API devuelve 400 Bad Request?#

Un 400 Bad Request significa que el archivo subido no es un archivo .png, o que la conversión de la imagen falló porque el archivo está corrupto o no es compatible.