Ir al contenido principal

Divide una imagen en capas con una API: Seedream 5.0 Flash frente a Pro

Convierte una imagen en una imagen base limpia más hasta 16 capas PNG transparentes: resultados reales, sintaxis de bbox, costes y cómo recomponerlas.

Autor
SpicyAPI Engineering
Publicado
Lectura
12 min de lectura
Actualizado
El cartel LATE SHIFT despiezado en sus capas: una calle lluviosa limpia, el restaurante, el título, el eslogan, la mujer con el trench rojo y el boleto ADMIT ONE, cada uno en su propio marco dorado

En resumen: envía una imagen y recibe una imagen base reparada (la imagen con los elementos extraídos eliminados y el fondo rellenado) más hasta 16 capas PNG transparentes, una por elemento. Cada capa viene con un name y un boundingBox, de modo que las capas se apilan de nuevo en su sitio. SpicyAPI lo ejecuta en Seedream 5.0 Flash por $0.026 por imagen de salida a cualquier resolución, y en Seedream 5.0 Pro por $0.042 por imagen (1K, 1.5K) o $0.084 (2K, auto). Empieza con Flash: cuesta menos y completó las categorías de entrada adulta en nuestras pruebas. Pro cuesta más y rechaza imágenes de una escena íntima entre dos adultos.

En 30 segundos

  • Salida: la imagen base en el índice 0, luego las capas. Las capas siempre son PNG transparentes; output_format solo cambia la imagen base (JPEG o PNG).
  • Límite y facturación: como máximo 17 imágenes por ejecución (imagen base más 16 capas), y pagas por las imágenes devueltas, incluida la imagen base. Cuando la tarea se acepta retenemos el precio de 17 y devolvemos la diferencia en cuanto se conoce el recuento real.
  • Prompt opcional. Si lo omites, el modelo elige los elementos principales; si escribes uno, separa lo que nombres. No hay ningún ajuste para el número de capas.
  • No es instantáneo: una ejecución tarda entre 45 y 100 segundos en ambos modelos.
  • Copia los archivos a tu propio almacenamiento cuando termine la ejecución.

Cómo se ve

Partimos de un cartel generado con Seedream 5.0 Flash.

El cartel LATE SHIFT: una mujer con un trench rojo sosteniendo un vaso de cartón delante de un restaurante bajo un neón rojo, título en serif crema arriba y un resguardo de boleto ADMIT ONE amarillo abajo a la derecha

Flash, sin prompt alguno

Enviamos el cartel sin prompt y con resolution en auto. Volvieron 8 imágenes: la imagen base más siete capas, que eran el restaurante, un coche lejano, el neón rojo, la mujer con el trench rojo, el eslogan, el título LATE SHIFT y el resguardo del boleto ADMIT ONE.

Vista explosionada de capas del resultado LATE SHIFT: la imagen base de la calle lluviosa y siete capas (restaurante, coche, neón, mujer, eslogan, título, boleto) desplegadas en marcos dorados, con una lista numerada a la derecha

La imagen base es una calle lluviosa sin el restaurante, sin la mujer y sin ninguna letra, con la calle rellenada. Lo que hubiera detrás de un elemento eliminado lo pinta el modelo, así que el resultado parece correcto pero no son los píxeles originales.

La imagen base de Flash: la calle nocturna lluviosa con el restaurante, la mujer y todo el texto eliminados y el fondo rellenado

Dos de las capas de Flash por separado (el patrón de damero que verías en un editor es solo transparencia):

La capa transparente del título LATE SHIFT por separado
La capa transparente con la mujer del trench rojo por separado

Pro, nombrando los elementos

Pro recibió el mismo cartel, con un prompt que nombraba cinco elementos, a 1.5K:

text
Separate the LATE SHIFT title, the tagline, the woman in the red trench coat,
the diner building and the ADMIT ONE ticket stub into their own layers

Volvieron seis imágenes: la imagen base y cinco capas con los nombres Diner building, Tagline text, LATE SHIFT title, Woman in red trench coat y ADMIT ONE ticket stub. Apilarlas según sus cajas reproduce el cartel original.

Una hoja de contactos del resultado de Pro: la imagen base y cinco capas transparentes, el restaurante, el eslogan, el título, la mujer y el resguardo del boleto

Pro también resolvió el anuncio de perfume que hicimos antes. Nombramos cuatro elementos (el titular NOIR ÉTÉ, la botella, la cinta dorada y la pequeña línea "eau de parfum") y recibimos cinco imágenes: un pedestal vacío de mármol negro como imagen base, más las cuatro capas. Es una foto de producto que puedes recomponer sobre un fondo nuevo sin regenerar nada.

Una hoja de contactos del resultado de perfume con Pro: una imagen base vacía de mármol negro y cuatro capas, la cinta dorada, la botella, el titular y el texto pequeño

¿Flash o Pro?

FlashPro
Precio por imagen de salida$0.026 en cualquier resolución$0.042 (1K, 1.5K), $0.084 (2K y auto)
resolution por defectoauto1.5k
Nombres y cajasname y boundingBox en cada capaname y boundingBox en cada capa
Mismo cartel, división automática7 capas más imagen base8 capas más imagen base
Imágenes de entrada orientadas a adultos (NSFW, hasta temas intensos)AceptadasAceptadas
Una escena íntima entre dos adultosAceptadaRechazada, sin cobro
PromptOpcional; al menos 3 caracteres si se escribeOpcional

Elige Flash por defecto: es más barato y completó todas las categorías de entrada adulta probadas aquí. Elige Pro cuando la división de Flash se pierda un elemento que necesitas y tu entrada no sea una escena íntima entre dos adultos (una versión cubierta de la misma escena se divide con normalidad). En Pro, una imagen rechazada vuelve como tarea fallida con un error genérico y sin cargo; no reintentes la misma imagen, envíala a Flash. Ambos te dan nombres y cajas, así que ambos sirven para los mismos trabajos:

  • editar el titular de un cartel y volver a colocarlo;
  • cambiar solo el fondo y conservar un producto o una persona;
  • convertir recortes en pegatinas o recursos de diseño reutilizables;
  • construir una escena de paralaje o un rig de animación a partir de una ilustración.

Cómo escribir un prompt que nombre lo que quieres

Sin prompt, el modelo decide qué cuenta como elemento. Con prompt, separa lo que listes. Dos hábitos hicieron los resultados predecibles:

  • Nombra cada elemento que te importe, con una frase nominal breve: "the LATE SHIFT title", "the woman in the red trench coat". Lo que dejes fuera depende del modelo, así que nombra lo que pienses mover. Si pides menos elementos, obtienes menos capas; el límite es 16.
  • Señala una región con <bbox>. Las coordenadas son x1 y1 x2 y2, normalizadas a una rejilla de 0 a 1000 con el origen en la esquina superior izquierda, independientemente del tamaño de la imagen:
text
Separate the title text <bbox>179 58 809 197</bbox> and the parrot
<bbox>330 274 641 991</bbox> into independent layers

Esto resuelve el caso en que dos cosas se parecen o se solapan. En una imagen de 1536×2048, una caja de 100 a 900 en horizontal cubre los píxeles 154 a 1382.

Qué cuesta

Pagas por imagen devuelta, y la imagen base cuenta. Los carteles y anuncios típicos devuelven de 3 a 11 imágenes: de $0.078 a $0.286 en Flash, y una ejecución de Pro de 6 imágenes a 1.5K cuesta 6 × $0.042 = $0.252. No se cobra nada más por capa.

El importe retenido al aceptar es el precio de 17 imágenes: $0.442 en Flash, $0.714 en Pro a 1K o 1.5K y $1.428 en Pro a 2K o auto. Se libera hasta el recuento real cuando termina la ejecución. En Pro, pon resolution en 1k o 1.5k para una división que funcione; auto se factura a la tarifa de 2K, así que una petición copiada de un ejemplo de Flash con auto cuesta el doble en Pro.

Pruébalo primero en el Playground

  1. Abre la página de descomposición en capas de Flash y quédate en la pestaña Playground, en la vista Form. Inicia sesión con una cuenta con saldo para ejecutar.
  2. Añade tu cartel o anuncio en Input image (un archivo o una Asset URL).
  3. Deja Prompt vacío para que el modelo elija los elementos principales, o nombra los que quieras mover, con <bbox> donde dos cosas se parezcan.
  4. Deja Resolution en auto para Flash y luego ejecuta el modelo. El resultado se abre como una vista de capas donde puedes ocultar capas, descargar una capa o todas en un zip, o exportar la pila visible como un solo PNG. Una imagen que hayas generado en el sitio puede enviarse directamente a la descomposición en capas.
  5. Si la división se pierde algo, ejecuta la misma imagen en la página de Pro; allí pon Resolution en 1k o 1.5k, porque auto se factura a la tarifa de 2K.

Luego ejecútalo desde código

Instala el SDK de Python (pip install spicyapi), define SPICY_API_KEY en el entorno de tu servidor y ejecuta:

python
import uuid
from spicyapi import SpicyClient, output_assets

client = SpicyClient()  # reads SPICY_API_KEY from the environment

task = client.create_task(
    model="bytedance/seedream-5.0-flash/layer-decomposition",
    input_data={
        "image_url": "https://your-cdn.example/poster.png",
        "prompt": "Separate the LATE SHIFT title, the tagline, the woman in the red trench coat, "
                  "the diner building and the ADMIT ONE ticket stub into their own layers",
        "resolution": "auto",
        "output_format": "png",
    },
    idempotency_key=str(uuid.uuid4()),
)

print("Resume task:", task["taskId"], flush=True)
final = client.wait_for_terminal(task["taskId"])  # a run takes about 45 to 100 seconds
if final["state"] != "succeeded":
    raise RuntimeError(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
assets = output_assets(final)  # assets[0] is the base plate; copy the files to your own storage now
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
    raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")

Para Pro, usa bytedance/seedream-5.0-pro/layer-decomposition con "resolution": "1.5k". Mantén la imagen de origen por debajo de 10 MB. Crear, esperar, descargar, los reintentos y el cuerpo del callback están en la guía de tareas y la referencia del SDK de Python.

O deja que lo ejecute un Agent

Cuando un asistente debe ejecutar la división, las tres herramientas oficiales muestran el precio y te preguntan antes de una llamada de pago.

  • CLI. Pon el mismo objeto input en input.json y luego:

``bash spicyapi tasks create --model bytedance/seedream-5.0-flash/layer-decomposition --input-file input.json --wait ``

Consulta la documentación de la CLI; npx @spicyapi/cli funciona sin instalar nada.

  • Servidor MCP. Añade el servidor MCP a tu asistente y luego pregunta: "Split this poster into layers with Seedream 5.0 Flash and name the title, the tagline and the woman." Llama a spicyapi_task_create, que se detiene para tu confirmación de precio, y luego a spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill instala el Agent Skill, que hace que un asistente de programación lea el esquema del modelo en vivo en lugar de adivinar campos.

Vuelve a colocar las capas

Una capa PNG suele tener mayor resolución que la caja que ocupa (por ejemplo, una caja de 671×139 con un PNG de 1233×256), así que escala cada capa dentro de su caja y luego dibújalas desde el zIndex más bajo hasta el más alto. Esto funciona con la salida de Flash y de Pro.

Python con Pillow:

python
import io
import requests
from PIL import Image

def fetch(url):
    return Image.open(io.BytesIO(requests.get(url, timeout=60).content)).convert("RGBA")

assets = output_assets(final)                      # from the finished task above
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
    raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")
canvas = fetch(assets[0]["url"])                   # base plate, zIndex 0

for a in sorted(assets[1:], key=lambda a: a["layer"]["zIndex"]):
    box = a["layer"].get("boundingBox")
    if not box:
        continue                                   # no position: place this one by hand
    x1, y1, x2, y2 = [round(v) for v in box]
    layer = fetch(a["url"]).resize((x2 - x1, y2 - y1), Image.LANCZOS)
    canvas.paste(layer, (x1, y1), layer)           # alpha-aware paste

canvas.convert("RGB").save("recomposed.jpg", quality=95)

Lo mismo en el navegador con canvas:

js
async function load(url) {
  const img = new Image();
  img.crossOrigin = "anonymous";
  img.src = url;
  await img.decode();
  return img;
}

const assets = task.data.output.assets;           // task: the finished task's JSON
const base = await load(assets[0].url);
const canvas = document.createElement("canvas");
canvas.width = base.naturalWidth;
canvas.height = base.naturalHeight;
const ctx = canvas.getContext("2d");
ctx.drawImage(base, 0, 0);

const layers = assets.slice(1).sort((a, b) => a.layer.zIndex - b.layer.zIndex);
for (const a of layers) {
  const box = a.layer.boundingBox;
  if (!box) continue;                              // no position: place this one by hand
  const [x1, y1, x2, y2] = box;
  ctx.drawImage(await load(a.url), x1, y1, x2 - x1, y2 - y1);
}

Para cambiar el título del cartel, deja esa capa fuera del bucle, dibuja tu propio texto en la misma caja y conserva el resto. Para cambiar solo el fondo, sustituye assets[0] por tu propia imagen del mismo tamaño.

Otras formas de dividir una imagen en capas

La mayoría de las páginas que aparecen para esta búsqueda son herramientas de navegador con precios por créditos y sin API. La principal alternativa de código abierto es Qwen-Image-Layered (Apache 2.0, 20B parámetros), que puedes autoalojar en una GPU o llamar a través de fal por $0.05 por imagen de salida (una ejecución por defecto de 4 capas cuesta unos $0.20 si se factura cada capa). Allí estableces el número de capas (4 por defecto) y obtienes imágenes transparentes del tamaño completo del lienzo, sin nombres ni posiciones, y el verificador de seguridad de fal está activo por defecto y devuelve imágenes negras para las entradas marcadas. Elígela cuando necesites un número fijo de capas o tu propio alojamiento. Elige la descomposición en capas de Seedream cuando quieras capas recortadas con un nombre y una posición cada una, un prompt que nombre los elementos y que se acepten imágenes de entrada adultas; a $0.026 por imagen en Flash también es más barata por imagen.

FAQ

¿Cuántas capas obtendré?

Tantas como encuentre el modelo, hasta 16 más la imagen base. No puedes fijar un número. Nombra los elementos que quieras para controlar el recuento y, si falta uno, nómbralo (o dale su <bbox>) y ejecuta de nuevo; una repetición se factura como una ejecución nueva.

¿Puedo dividir una imagen que no hizo SpicyAPI?

Sí, cualquier imagen individual dentro de los límites de la página del modelo. Para material de cartel que se divida con limpieza, empieza por Seedream 5.0 Flash texto a imagen.

¿Son reproducibles los resultados?

No. No hay seed, así que ejecuta la división una vez, guarda los archivos y edita esos.

Qué hacer a partir de aquí

Prueba con un cartel que ya te guste en la descomposición en capas de Flash; si su división se pierde algo, pasa la misma imagen por Pro.

También en English · 日本語 · 한국어 · Deutsch · Français · Português (Brasil) · Русский · Italiano · Polski