name: firefly-expand-fill
name: firefly-expand-fill
description: Utilisation des APIs Generative Expand et Generative Fill d'Adobe Firefly — quand les utiliser, stratégies de masque, contrôle du placement et du rapport hauteur/largeur, schémas de prompt pour l'extension et le remplacement propres, différence entre remplissage et remplacement de zones d'image. À utiliser chaque fois que l'utilisateur mentionne « agrandissement génératif », « étendre le canevas », « remplissage génératif », « inpainting », « outpainting », « supprimer un objet », « remplacer l'arrière-plan », « agrandir l'image », « remplir l'image », « masque », « expand-async », « fill-async », ou souhaite agrandir/réparer/modifier une image existante. Encapsule les schémas de production pour l'extension d'arrière-plan sur les assets clés et le remplacement d'arrière-plan aligné sur la marque dans les créateurs de campagnes.
license: Apache-2.0
compatibility: Nécessite les scopes firefly_api, ff_apis. Points d'accès : firefly-api.adobe.io/v3/images/expand et /v3/images/fill. Les images sources doivent être transmises sous forme de références de stockage.
allowed-tools: Bash(curl:) Bash(jq:) Read Write Edit
metadata:
version: "1.0.0"
category: édition-d-images
Que fait Expand et Fill Génératifs Firefly ?
Deux API liées mais distinctes pour modifier des images existantes. Expand agrandit le canevas et génère du nouveau contenu dans la zone agrandie. Fill modifie ou remplace des régions à l'intérieur du canevas existant, guidé par un masque. Choisir la bonne API est la moitié de la bataille ; le reste est la qualité du masque.
Quand Utiliser Cette Compétence
Utilisez cette compétence quand :
- L'utilisateur souhaite étendre le canevas d'une image dans n'importe quelle direction
- L'utilisateur souhaite remplacer ou modifier une région d'une image (arrière-plan, objet, zone de texte)
- Une campagne nécessite plusieurs rapports hauteur/largeur à partir d'un seul asset source
- Une équipe créative souhaite supprimer un objet indésirable d'une image
- L'utilisateur mentionne l'inpainting, l'outpainting, l'expansion ou le remplissage
N'utilisez PAS cette compétence quand :
- L'utilisateur souhaite une image entièrement nouvelle — utilisez
firefly-generate-image-v3-async - L'utilisateur souhaite des variations stylistiques d'une image existante — utilisez
firefly-generate-similar - La transformation est purement raster (accentuation, correction des couleurs) — utilisez l'API Lightroom
Expand vs Fill — Tableau de Décision
| Besoin | Point d'accès |
|---|---|
| Agrandir le canevas, générer du contenu dans la nouvelle zone | Expand |
| Modifier le rapport hauteur/largeur d'une image (1:1 → 16:9) | Expand |
| Supprimer un objet et réparer la zone | Fill |
| Remplacer l'arrière-plan tout en gardant le sujet | Fill avec un masque couvrant l'arrière-plan |
| Remplacer une région spécifique (ciel, sol, chemise d'une personne) | Fill |
| Inpainting d'une zone endommagée ou indésirable | Fill |
| Outpainting (le classique "générer au-delà du cadre" de l'IA artistique) | Expand |
En résumé : le canevas s'agrandit = Expand. Le canevas reste identique = Fill.
Expand Génératif
Étape 1 — Soumettre le Travail d'Expand
curl --silent -X POST 'https://firefly-api.adobe.io/v3/images/expand' \
-H "Authorization: Bearer $FIREFLY_SERVICES_ACCESS_TOKEN" \
-H "X-Api-Key: $FIREFLY_SERVICES_CLIENT_ID" \
-H 'Content-Type: application/json' \
-d '{
"image": {"source": {"uploadId": "$SOURCE_UPLOAD_ID"}},
"size": {"width": 2304, "height": 1280},
"prompt": "un paysage désertique qui s'étend au loin",
"placement": {
"alignment": {"horizontal": "center", "vertical": "center"}
},
"numVariations": 2
}'
Renvoie le schéma de travail asynchrone (jobId, statusUrl, cancelUrl) — interrogez de la même manière que firefly-generate-image-v3-async.
Le Champ placement
placement contrôle où l'image originale se trouve dans le nouveau canevas (plus grand) :
"placement": {
"alignment": {"horizontal": "center", "vertical": "center"},
"inset": {"left": 0, "top": 0, "right": 0, "bottom": 0}
}
| Alignement | Effet |
|---|---|
center, center | Originale au milieu, agrandie également de tous les côtés |
left, center | Originale à gauche, agrandie vers la droite |
right, top | Originale en haut à droite, agrandie vers le bas et la gauche |
Utilisez inset pour un contrôle fin au pixel près. Schéma typique : originale au centre, agrandissement uniforme. Pour les variantes de réseaux sociaux (paysage → portrait), placez l'originale décentrée pour que le sujet se trouve dans la zone de sécurité.
Le Champ prompt pour Expand
Les prompts décrivent ce que la nouvelle zone (agrandie) doit contenir. L'image originale reste inchangée. Exemples :
| Originale | Prompt | Résultat |
|---|---|---|
| Portrait d'une personne | "le reste de son corps en costume d'affaires" | Tête originale + nouveau corps |
| Produit sur fond blanc | "un plan de travail de cuisine avec lumière matinale" | Produit en scène |
| Gros plan paysage | "un vaste ciel avec des nuages épars au-dessus" | La scène continue vers le haut |
Laissez prompt vide pour que Firefly étende stylistiquement le contenu existant (courant pour les workflows de recadrage/re-recadrage).
Recettes de Rapports Hauteur/Largeur
Cas d'utilisation courants en production :
| Depuis | Vers | size | placement.alignment |
|---|---|---|---|
| 1024×1024 (1:1) | 1408×768 (16:9 paysage) | largeur 1408, hauteur 768 | center, center |
| 1024×1024 (1:1) | 768×1408 (9:16 portrait) | largeur 768, hauteur 1408 | center, top (visage bas) |
| 1408×768 (key art) | 2304×1280 (cinématique) | largeur 2304, hauteur 1280 | center, center |
| 1024×1024 (carré) | 1024×1792 (portrait story) | largeur 1024, hauteur 1792 | center, top |
Fill Génératif
Étape 1 — Préparer le Masque
Fill nécessite un masque qui indique à Firefly quelle région modifier. Pixels blancs = remplir ceci. Pixels noirs = préserver. Niveaux de gris = mélange doux.
Le masque doit avoir les mêmes dimensions que l'image source. Générez le masque côté client (éditeur d'images, API Photoshop, ou par programmation avec sharp / pillow) et téléchargez-le comme référence de stockage.
# Téléchargement du masque
MASK_UPLOAD_ID=$(curl --silent -X POST 'https://firefly-api.adobe.io/v2/storage/image' \
-H "Authorization: Bearer $FIREFLY_SERVICES_ACCESS_TOKEN" \
-H "X-API-Key: $FIREFLY_SERVICES_CLIENT_ID" \
-H "Content-Type: image/png" \
--data-binary "@./mask.png" \
| jq -r '.images[0].id')
Étape 2 — Soumettre le Travail de Fill
curl --silent -X POST 'https://firefly-api.adobe.io/v3/images/fill' \
-H "Authorization: Bearer $FIREFLY_SERVICES_ACCESS_TOKEN" \
-H "X-Api-Key: $FIREFLY_SERVICES_CLIENT_ID" \
-H 'Content-Type: application/json' \
-d '{
"image": {
"source": {"uploadId": "$SOURCE_UPLOAD_ID"},
"mask": {"source": {"uploadId": "$MASK_UPLOAD_ID"}}
},
"prompt": "un fond de salon moderne minimaliste",
"numVariations": 2
}'
Renvoie le schéma de travail asynchrone — interrogez pour obtenir la complétion.
Le Champ prompt pour Fill
Les prompts décrivent ce qui doit apparaître dans la région masquée. La région non masquée reste inchangée.
| Le masque couvre | Prompt | Résultat |
|---|---|---|
| L'arrière-plan d'une photo produit | "plan de travail en marbre de cuisine" | Produit inchangé, nouvel arrière-plan |
| Une personne indésirable | "banc de parc vide" | Personne supprimée, le banc remplit la zone |
| Une zone d'étiquette | "espace blanc minimal" | Étiquette disparue, zone nettoyée |
| La zone de couleur d'un véhicule | "peinture rouge mat" | Véhicule maintenant rouge |
Stratégies de Génération de Masques
| Stratégie | Outil | Quand |
|---|---|---|
| Masque manuel | Photoshop, éditeur d'images | Travail créatif ponctuel |
| Masque programmatique | sharp, pillow | Régions géométriques (moitié supérieure, tiers gauche) |
| Détection du sujet | API Photoshop select_subject ou segmentation personnalisée | Remplacer l'arrière-plan, isoler le sujet |
| Masque par couleur clé | Seuil sharp | Remplacer une région de couleur spécifique |
| Segmentation IA | SAM (Segment Anything), Mediapipe | Pipelines de segmentation en production |
Pour les workflows à volume élevé (extension d'arrière-plan sur des centaines d'assets clés par jour), les masques sont générés par programmation à partir de la détection du sujet — jamais à la main.
Combiner Expand + Fill dans un Pipeline
Un pipeline de production courant :
Key-art source (1408×768)
↓ Expand (vers 2304×1280, prompt étendant la scène)
Image agrandie
↓ Fill (masque couvre la zone de texte, prompt : "fond propre")
Version cinématique nettoyée
↓ Appliquer les actions de l'API Photoshop (superposition de texte, composition de calques)
Asset final
C'est le schéma canonique de génération de key-art condensé. Chaque étape est un travail asynchrone ; le pipeline est mis en file d'attente (voir firefly-services-rate-limits).
Schémas de Production
Schéma : Génération multi-rapport à partir d'une source
À partir d'un key-art carré, générez les formats paysage + portrait + story :
const aspects = [
{ name: 'paysage-16-9', size: { width: 1408, height: 768 }, alignment: { horizontal: 'center', vertical: 'center' } },
{ name: 'portrait-9-16', size: { width: 768, height: 1408 }, alignment: { horizontal: 'center', vertical: 'top' } },
{ name: 'story-9-16', size: { width: 1024, height: 1792 }, alignment: { horizontal: 'center', vertical: 'top' } },
];
const jobs = await Promise.all(
aspects.map(a => submitExpand({
sourceUploadId: SOURCE_ID,
size: a.size,
placement: { alignment: a.alignment },
prompt: 'continuer la scène naturellement',
numVariations: 2,
})),
);
Trois soumissions, ~6 sorties en parallèle. Persistez chacune avec l'étiquette de format pour l'équipe créative en aval.
Schéma : Remplacement d'arrière-plan à l'échelle
Pour les échanges d'arrière-plan dans les créateurs de campagnes de marque :
Image source
↓ API Photoshop : select_subject → masque (sujet blanc, arrière-plan noir)
↓ Inverser le masque (sujet noir, arrière-plan blanc) — Sharp/Pillow
Requête Fill avec masque inversé
↓ prompt : "<arrière-plan aligné sur la marque>"
Sortie : sujet préservé, nouvel arrière-plan
L'étape d'inversion est critique — select_subject de Photoshop donne le masque du sujet ; pour le remplacement d'arrière-plan, vous avez besoin de l'inverse.
Validation
Les pipelines Expand/Fill sont prêts pour la production quand :
- La décision entre Expand et Fill est documentée par cas d'utilisation
- La génération de masques est automatisée, pas manuelle (pour tout volume >50)
- Les masques sont validés pour les bonnes dimensions et la bonne polarité avant soumission
- La sortie est inspectée visuellement par rapport à la source avant d'être marquée comme réussie
- Les pipelines multi-rapports soumettent en parallèle, pas en séquentiel
- Les décisions de
placementsont alignées avec les directives de zone de sécurité de la marque
Dépannage et Cas Particuliers
- La sortie Expand présente une couture visible entre l'original et le nouveau contenu : L'original peut avoir une couleur ou un grain inhabituel. Essayez de régénérer avec un changement de graine, ou développez le prompt avec une description des qualités de la source.
- Le prompt Fill est ignoré : Le masque est probablement inversé (blanc = préserver, noir = remplir au lieu de l'inverse). Revérifiez la polarité du masque.
- La sortie Fill déborde en dehors du masque : Les bords du masque sont trop doux (fort flou gaussien). Affinez les bords du masque, ou utilisez un masque binaire.
- Expand change le placement du sujet de manière inattendue : Définissez explicitement
placement.alignment— les valeurs par défaut peuvent déplacer le sujet. - Masque trop volumineux (>8 Mo) : Compressez le masque. Un PNG en niveaux de gris à canal unique avec une palette limitée se compresse généralement bien.
- Expand vers un rapport hauteur/largeur extrême semble non naturel : Étendez en deux étapes : original → intermédiaire → final. Chaque étape est un saut plus petit.
- Fill supprime complètement le sujet : Le masque chevauche le sujet. Réduisez le masque à l'arrière-plan uniquement.
Enchaînement avec d'Autres Compétences
firefly-services-storage-refs— Téléchargement du masque + sourcefirefly-generate-image-v3-async— Même schéma asynchronephotoshop-api-actions— Pour la génération automatisée de masques (select_subject)firefly-services-rate-limits— Pour les pipelines par lots