
Découper une image en calques modifiables avec l'API Seedream 5.0 Pro Layerize
POST https://api.evolink.ai/v1/images/generations avec model: "doubao-seedream-5.0-pro-layerize" et exactement une URL d'image. La réponse est un identifiant de tâche, pas une image — ce modèle est asynchrone et prend environ 120 secondes. Interrogez ensuite GET /v1/tasks/{task_id} jusqu'à ce que status passe à completed, puis récupérez les calques dans result_data.Ce que vous récupérez
| Sortie | Format | Contenu |
|---|---|---|
| Image de base | suit output_format (jpeg par défaut) | Le fond, reconstruit sous tout ce qui a été prélevé |
| Calques 1 à 16 | toujours PNG avec couche alpha, indépendamment de output_format | Un élément chacun, transparent partout ailleurs |
Le point qui mérite qu'on s'y arrête, c'est l'image de base. Quand Layerize prélève un titre sur une affiche, il ne laisse pas un trou : ce qui se trouvait sous le texte est reconstruit. C'est la différence de fond avec un masque de segmentation, et la raison pour laquelle la sortie s'intègre directement dans un outil de design.
Trois façons de cibler les calques
prompt est facultatif, et chacune des trois approches répond à un besoin différent.
1. Omettre le prompt — décomposition automatique complète
{
"model": "doubao-seedream-5.0-pro-layerize",
"image_urls": ["https://example.com/poster.png"],
"quality": "auto",
"output_format": "jpeg"
}Sans aucun prompt, le modèle repère lui-même tous les éléments importants — blocs de texte, sujets, décorations, arrière-plan — et découpe chacun en un calque distinct. C'est l'usage principal du modèle, et une affiche complexe revient couramment avec dix calques ou plus.
"prompt": "" est interprété en amont comme « l'utilisateur a fourni une instruction vide » et fait perdre la détection automatique. Le corps de la requête ne doit tout simplement pas contenir la clé prompt.2. Langage naturel — nommer les éléments voulus
{
"model": "doubao-seedream-5.0-pro-layerize",
"prompt": "Sépare le perroquet et le texte du titre",
"image_urls": ["https://example.com/poster.png"],
"quality": "2K"
}À utiliser quand seuls deux ou trois éléments vous intéressent et que vous ne voulez pas payer une décomposition complète. Les éléments sont identifiés sémantiquement : « le texte du titre » suffit, sans savoir où il se trouve.
3. Coordonnées bbox — délimiter la zone exacte
{
"model": "doubao-seedream-5.0-pro-layerize",
"prompt": "texte du titre<bbox>179 58 809 197</bbox>, 1 perroquet<bbox>330 274 641 991</bbox>",
"image_urls": ["https://example.com/poster.png"],
"quality": "1.5K"
}<bbox> prend quatre nombres en coordonnées normalisées 0–1000 (et non en pixels), dans l'ordre gauche haut droite bas. Recourez-y quand le langage naturel devient ambigu — deux produits similaires dans le même cadre, ou plusieurs blocs de texte où « le titre » pourrait désigner l'un ou l'autre.bounding_box.normalized des calques obtenus, puis relancer avec ces coordonnées pour obtenir exactement le découpage voulu.Le flux asynchrone
Étape 1 — soumettre la tâche
curl -X POST https://api.evolink.ai/v1/images/generations \
-H "Authorization: Bearer $EVOLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedream-5.0-pro-layerize",
"image_urls": ["https://example.com/poster.png"],
"quality": "auto"
}'La réponse est un identifiant de tâche, pas une image :
{
"id": "task-unified-1757165031-seedream5prolayerize",
"object": "image.generation.task",
"model": "doubao-seedream-5.0-pro-layerize",
"status": "pending",
"progress": 0,
"type": "image",
"task_info": { "can_cancel": true, "estimated_time": 120 },
"usage": { "billing_rule": "per_call", "credits_reserved": 39.168 }
}credits_reserved : il s'agit d'une estimation réservée en amont, calibrée sur le pire cas. Le montant réellement facturé se calcule à partir des images effectivement produites.Étape 2 — interroger jusqu'à la fin
curl https://api.evolink.ai/v1/tasks/task-unified-1757165031-seedream5prolayerize \
-H "Authorization: Bearer $EVOLINK_API_KEY"status passe par pending → processing → completed (ou failed). Prévoyez environ 120 secondes ; une interrogation toutes les 5 secondes suffit largement. Si vous préférez éviter l'interrogation, passez une callback_url à la soumission — HTTPS uniquement, pas d'adresses IP internes, déclenchée après confirmation de la facturation, avec jusqu'à 3 tentatives à 1 s / 2 s / 4 s.Étape 3 — lire les calques
result_data porte les métadonnées nécessaires pour reconstituer la composition sur n'importe quel canevas :| Champ | Signification |
|---|---|
z_index | Ordre d'empilement. 0 correspond à l'image de base, les calques commencent à 1 |
bounding_box.absolute | Position dans le repère en pixels de l'image de base |
bounding_box.normalized | Le même rectangle en coordonnées 0–1000 |
name | Libellé généré par le modèle, par exemple « ara écarlate » |
description | Description plus détaillée de l'élément |
z_index: 0, sans name ni bounding_box. Trier par z_index et composer chaque calque à son rectangle absolute reproduit exactement l'image d'origine.Les contraintes d'entrée sont plus strictes qu'en génération classique
C'est ici que les requêtes échouent le plus souvent, car Layerize n'accepte pas tout ce qu'accepte la génération Seedream classique.
| Contrainte | Valeur |
|---|---|
| Nombre d'images | Exactement 1. Aucune, ou deux et plus, provoque une erreur |
| Formats | .png, .jpeg, .jpg uniquement — le webp est refusé |
| Taille du fichier | 30 Mo maximum |
| Pixels totaux | de 262 144 à 36 000 000 au total — 512×512 est le plus petit carré admissible |
| Rapport d'aspect | entre 1:16 et 16:1 |
| URL | doit être accessible directement par le serveur, ou déclencher un téléchargement direct |
quality est également plus restreint : le mode calques n'accepte que des paliers (auto, 1K, 1.5K, 2K). Passer un rapport comme 16:9 ou des dimensions explicites comme 2048x2048 renvoie une erreur. Avec auto, la sortie suit l'entrée — conservée telle quelle si l'original se situe entre 921 600 et 4 624 220 pixels, remontée à 1K en dessous, plafonnée à 2K au-dessus.Facturation : on compte les images produites, pas les requêtes
Sur EvoLink, Layerize est facturé 20 % sous le tarif public BytePlus :
| Poste | Tarif public BytePlus | EvoLink |
|---|---|---|
| Image d'entrée | 0,003 $ | 0,0024 $ |
| Image produite, palier bas (≤ 2 610 000 px) | 0,0225 $ | 0,018 $ |
| Image produite, palier haut (> 2 610 000 px) | 0,045 $ | 0,036 $ |
1K et 1.5K coûtent le même prix — tous deux relèvent du palier bas. Le palier est déterminé image par image : une image de base en 2K est facturée au palier haut, tandis que les petits calques de texte qui en ont été prélevés relèvent du palier bas.Deux exemples chiffrés :
Quatre pièges à éviter
- Envoyer
"prompt": ""au lieu d'omettre la clé. Cela supprime la détection automatique, la meilleure caractéristique du modèle. - Croire que
output_format: "png"agit sur les calques. Il ne contrôle que l'image de base. Les calques sont toujours des PNG avec couche alpha. - Traiter un échec comme un succès partiel. Le succès partiel n'existe pas. Un calque en échec fait échouer l'ensemble, avec remboursement intégral : la logique de reprise doit donc raisonner en tout ou rien.
- Laisser les liens expirer. Au bout de 24 heures, ils disparaissent. Téléchargez dans le même traitement que celui qui interroge la tâche.
Questions fréquentes
Combien de calques puis-je obtenir ?
Entre 1 et 16 calques plus l'image de base, soit 17 images produites au maximum. Vous ne pouvez pas demander un nombre précis : c'est le résultat de la décomposition qui décide.
Puis-je choisir quels éléments deviennent des calques ?
<bbox> en coordonnées normalisées 0–1000.Les calques sont-ils vraiment des PNG transparents ?
output_format n'y change quoi que ce soit. Ce paramètre ne concerne que l'image de base.Combien de temps prend un appel ?
callback_url si vous ne voulez pas interroger la tâche.Que se passe-t-il si un calque échoue ?
Toute la requête échoue — il n'y a pas de succès partiel — et elle est intégralement remboursée.
Est-ce que cela fonctionne avec n'importe quelle image ?
Il faut un PNG ou un JPEG d'au moins 262 144 pixels au total — 512×512 par exemple — de moins de 30 Mo, avec un rapport d'aspect compris entre 1:16 et 16:1. Le webp est refusé alors que la génération classique l'accepte.


