- Ratio Outpaint Calc : entree optionnelle mask -> sortie mask_padded
(paddee exactement comme l'image). Masque des bandes construit avec le
meme pad que l'image : il etait faux quand l'arrondi au multiple rognait
la source (pad negatif).
- Region Mask List : extra_mask (une region de plus, non decoupee, ex. les
bandes d'outpaint) et empty = keep / full_image (aucune region -> image
entiere). Par defaut : comportement inchange.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ScF8qKYdotua6aKovsgdxV
- Feather : le bord de l'image prolonge le masque (avant : compte comme
noir, l'original revenait au bord). Region Preview suit.
- Inpaint Color Fix : entree optionnelle measure_area (image_area d'Aioli
Mask BBox V2), les bandes n'entrent plus dans les statistiques.
Sans elle : comportement identique.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ScF8qKYdotua6aKovsgdxV
- Nouveau node AioliMaskBBoxV2 (nodes/mask_bbox_v2.py), calcul dans
nodes/bbox_core_v2.py (math pur). resolution en equivalent carre,
plafond 2048^2 px, crop = bbox agrandi au ratio du modele, bandes si
l'image ne suffit pas (x/y negatifs), context region / full_image,
sortie image_area. Jamais de bbox coupe, jamais d'etirement.
- AioliMaskBBox passe en legacy (DEPRECATED, comportement identique).
bbox_core.py intact.
- Mask Split Regions : empty_mask = nothing / full_image.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ScF8qKYdotua6aKovsgdxV
La section "BBox Multiple Fix" devient "Aioli Mask BBox" (entree padding qui
remplace padding + blur, note sur le mask vide), suivie d'une sous-section
"Migrating from BBox Multiple Fix" : les anciens workflows n'ont rien a faire,
la cle et les neuf sorties ne bougent pas. Bandeau 1.6.0 en tete.
Les chaines citees ailleurs dans le README perdent leur MaskBoundingBox+. Les
workflows d'exemple gardent la chaine 2 nodes : ils tournent toujours, c'est
signale a l'endroit ou ils sont listes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LNYuvBpfUhpoXu8n8oygAF
README : la section "BBox Multiple Fix" devient "Aioli Mask BBox" (entree
padding, note mask vide), avec une sous-section "Migrating from BBox Multiple
Fix" qui dit noir sur blanc que les anciens workflows n'ont rien a faire.
Bandeau 1.6.0 en tete. Les chaines citees ailleurs dans le README perdent leur
MaskBoundingBox+. Les workflows d'exemple gardent la chaine 2 nodes : ils
tournent toujours, c'est signale.
Docstrings des trois nodes list-aware mis a jour (ils s'affichent en tooltip
dans ComfyUI).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LNYuvBpfUhpoXu8n8oygAF
📐 Aioli Mask BBox remplace la chaine MaskBoundingBox+ (ComfyUI Essentials, en
maintenance seule depuis avril 2025) -> BBoxMultipleFix : il detecte le bbox
lui-meme a partir du mask, avec un seul reglage `padding` la ou Essentials en
avait deux (padding + blur, qui elargissaient tous deux le bbox).
Rien ne casse : BBoxMultipleFix reste enregistre sous la meme cle, memes
entrees, memes sorties dans le meme ordre - simplement marque DEPRECATED.
L'algorithme est extrait dans nodes/bbox_core.py, partage par les deux nodes :
une seule implementation a maintenir.
Verifie : bbox_core rend des resultats strictement identiques a l'ancien code
sur 3 844 704 combinaisons ; la chaine 2 nodes et le node fusionne rendent des
tenseurs bit-identiques sur 5 760 configurations. Un mask vide ne plante plus.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LNYuvBpfUhpoXu8n8oygAF
Remove the delta_e_threshold/blend_strength/feather_radius passthrough outputs added
in 1.5.5 (not needed). Back to the two original outputs (image_corrected, correction_mask).
The RGBA/grayscale robustness from 1.5.4 is kept.
Add delta_e_threshold (FLOAT), blend_strength (FLOAT) and feather_radius (INT) as
outputs that echo the received settings, so they can be chained straight into a
second InpaintColorFix without re-wiring the value nodes. Image/mask outputs and
all behaviour unchanged.
nano-banana / Gemini (and transparent PNGs) output 4-channel RGBA images; the LAB
conversion did reshape(-1, 3) and crashed ("cannot reshape array of size ... into
shape (3)"). Add _to_rgb3() to drop alpha / expand grayscale to 3 channels before
the LAB path, applied to both crops at the start of fix().
- replace the outdated "Example Workflow — Flux2Klein (custom-nodes)" section
(WF_Inpaint_aioli-nodes) with a new "Multi-region edit (Flux.2 Klein)" section
showcasing most inpaint nodes, illustrated with the checker / combined_mask /
recomposed example images
- remove the debug_outline row from BBox Multiple Assembler and Region Preview
inputs tables (now frozen internally in v1.5.3)
Align the 👁 Region Preview section with the 5-output shape
(combined_mask, checker, mask_adjust, feather, opacity):
- coords paragraph reworded (masks are full-size, already positioned)
- inputs table: simplify masks row, remove x/y, width/height and order rows
- outputs table: remove the order row
- re-wiring note: explain order is set directly on the assembler
- intro node count Seven -> Eight
- new "👁 Region Preview" section: inputs/outputs tables, side-branch
positioning, and the re-wiring note (INT/INT/FLOAT clean, order STRING)
Preview the assembler's combined_mask + colored checker BEFORE generation,
reusing BBoxMultipleAssembler's exact math (imported helpers). Branch it as a
side-channel after Region Mask List / Mask Split Regions. Also serves as a
single tuning point: set order/mask_adjust/feather/opacity here, visualize,
then rewire the outputs back into BBoxMultipleAssembler.
- nodes/region_preview.py: new RegionPreview node
- __init__.py: register import + class/display mappings
- pyproject.toml: 1.4.0 -> 1.5.0, description updated
- order: list_first_on_top (1st mask on top, last = inverted background) or area_large_under
- mask_adjust: grow/shrink white zones before feather
- new 'checker' IMAGE output: per-region colored outlines to verify overlap
- bump to 1.1.1
- BBoxMultipleAssembler: fold a list of per-mask crops back onto the base
image by bbox coords (resize-to-source fixes /16 drift, overlap handling).
- RegionalMaskConditioning: combine a dynamic list of N (conditioning, mask)
into one regional conditioning for single-pass KSampler, with optional
background prompt on the inverted union.
- Register both in __init__.py, bump version to 1.1.0.
Adds a clear note in the BBox Multiple Fix section explaining what
happens when max(bbox_w, bbox_h) > min(W_src, H_src) in force_square
mode: the crop is clamped to a non-square rectangle and stretched
to fit the square target.
Documents the user-side fix: set the downstream ImageResize+ to
stretch mode (keep_proportion=False) using orig_width/orig_height
as targets for pixel-perfect recompose.
Mirrors the warning that the node now logs at runtime.
When force_square=True and max(bbox_w, bbox_h) > min(W_src, H_src),
the theoretical square doesn't fit in the source. The crop ends up
non-square (clamped to source) and stretched to fit the square target.
The node now logs a clear warning when this case is triggered,
pointing users to set the downstream ImageResize+ to stretch mode
(keep_proportion=False) using orig_width/orig_height for
pixel-perfect recompose.
The docstring was also updated to document this case explicitly.
No logic change — only the warning print + docstring update.
Adds a one-line link in the nano-banana section pointing to the hosted
ComfyUI Cloud app version of the v3 workflow, so users can try it
without any download or setup.
- New ☁️ section listing all three ComfyCloud-compatible workflows
(nano-banana v3, Flux2Klein, Qwen Image Edit 2511) with preview images
- New 💡 "Why this approach" TL;DR at the top explaining the technical
advantages of the region-inpaint strategy:
* source dimensions preserved end-to-end
* more detail in the masked region (generation budget concentrated)
* force_square avoids model-internal recrops ("pixel shift")
* pixel-perfect recompose on original coordinates
- Updated subgraph widget table to include the new use_image2 toggle
(v3 nano-banana only)
- Updated file paths to match the renamed examples
- Added 👋 "About" footer with aioli.collective site + Instagram,
and a gentle ⭐/feedback nudge