Quante volte ti è capitato di dover scartare un’immagine perché non aveva l’aspect ratio giusto e non c’era modo di ritagliarla senza rovinare tutto? Magari bastava davvero poco: un’inquadratura appena più larga, un po’ di “respiro” ai lati, qualche centimetro in più sopra la testa o sotto i piedi. È esattamente qui che entra in gioco l’outpainting: la capacità di un’AI di estendere un’immagine oltre i suoi confini originali, ricostruendo ciò che non c’era con coerenza visiva. In pratica, invece di tagliare e perdere informazioni, aggiungi spazio dove serve, mantenendo stile, luci e continuità della scena, come se lo scatto fosse nato così.
Dallo screenshot si vede un workflow ComfyUI costruito per fare outpainting (estensione dei bordi) tramite un modello della famiglia FLUX “fill” e una classica pipeline di inpainting, con alcuni accorgimenti per controllare meglio la generazione e la fusione con l’immagine originale.
Load models
All’inizio, nella sezione Step 1 – Load models, vengono caricati i componenti fondamentali. Il nodo Load Diffusion Model carica il modello di diffusione (nel tuo caso un flux…fill…dev.safetensors, quindi orientato a riempimento/ricostruzione coerente). Il nodo DualCLIPLoader carica i due encoder testuali (tipicamente CLIP-L e T5-XXL), che servono a trasformare il prompt in “condizionamento” utilizzabile dal modello. Infine Load VAE carica il VAE (qui un ae.safetensors), necessario per passare tra spazio latente e immagine RGB (decodifica finale e, in alcuni flussi, supporto alla preparazione/condizionamento dell’inpainting).
Load image
Nella sezione Step 2 – Load image, il nodo Load Image importa l’immagine sorgente. Subito dopo entra in gioco Pad Image for Outpainting, che è il cuore dell’estensione. Questo nodo crea una nuova “tela” più grande aggiungendo padding ai lati (nel tuo screenshot si vede un valore consistente, ad esempio 400 px su più lati) e applica anche una feathering (sfumatura del bordo, qui intorno a 24) per rendere meno netto lo stacco tra area originale e area da generare. Tecnicamente, questo passaggio produce due cose: i pixels (l’immagine espansa) e una mask che identifica la zona “vuota/da riempire” rispetto all’originale.
CLIP Text Encode
Sul fronte testuale, il nodo CLIP Text Encode (Positive Prompt) genera il condizionamento positivo a partire dal prompt (nel box si intravede un prompt breve, tipo “beautiful scenery”, ma l’importante è la funzione per convertire testo in embedding). A valle del prompt compaiono due nodi che servono a rifinire la guida del modello: FluxGuidance imposta un valore di guidance (nel nostro caso è alto, circa 30.0), cioè quanto il modello deve “seguire” la direzione del prompt; ConditioningZeroOut viene spesso usato per azzerare o normalizzare una parte del conditioning in specifiche pipeline FLUX, così da evitare sovra-influenze o per rendere più stabile l’interazione con l’inpainting (in pratica è un nodo di controllo che “ripulisce” o “neutralizza” un conditioning in un punto del flusso).
InpaintModelConditioning
Il nodo chiave che mette insieme immagine, maschera e condizionamenti è InpaintModelConditioning. Qui arrivano: il positive (dal ramo del prompt/guidance), l’eventuale negative (se presente nel flusso), il VAE, i pixels dell’immagine padded e la mask prodotta dal padding. Questo nodo prepara correttamente i tensori per l’inpainting, in pratica crea un latent_image coerente con la tela espansa e imposta l’area mascherata come regione su cui il sampler deve intervenire, mantenendo invece vincolata l’area non mascherata (quella originale). L’opzione noise_mask risulta impostata su false nello screenshot, il che significa che non stiamo usando una maschera del rumore “speciale”, ma una gestione standard del rumore nell’area da rigenerare.
Differential Diffusion
Sul ramo del modello, si vede anche Differential Diffusion applicato al modello stesso prima del campionamento. In termini pratici, questo nodo tende a migliorare l’outpainting/inpainting perché gestisce in modo più “differenziale” la transizione tra zone fissate e zone rigenerate, aiutando a mantenere continuità (texture, illuminazione, gradiente) e riducendo alcuni artefatti tipici lungo il confine della maschera.
KSampler
La generazione vera e propria avviene nel KSampler. Il sampler riceve il model (passato attraverso Differential Diffusion), i condizionamenti positive/negative e il latent_image preparato da InpaintModelConditioning. I parametri mostrati sono indicativi di un outpainting “pulito” e relativamente libero: steps ~20 (qualità/tempo bilanciati), sampler euler, scheduler normal, denoise 1.00 (rigenerazione completa della parte mascherata), e CFG ~1.0 (molto basso: con FLUX è frequente lavorare con CFG bassi per evitare look “forzati” e preservare naturalezza e coerenza). Il seed è impostato con controllo e possibilità di randomize, quindi puoi ottenere varianti mantenendo invariata la struttura del flusso.
VAE Decode
Una volta ottenuto il risultato in latente, VAE Decode converte il latente in immagine.
Save Image
Infine Save Image salva su disco con un filename_prefix (qui “ComfyUI”), producendo l’output finale.


Se l’articolo ti è piaciuto restiamo in contatto su linkedin a: https://www.linkedin.com/in/andreatonin/
Nerd per passione e per professione da oltre 30 anni, lavoro nel mondo dell’innovazione tecnologica come CTO e consulente, progettando ecosistemi software complessi e scalabili. Parallelamente mi dedico alla formazione informatica, condividendo esperienze e buone pratiche maturate sul campo.
Scopri di più sulla mia attività di consulenza su lucedigitale.com Mi trovi anche su LinkedIn




















