Image Crop + Rotate + Pad, Load Image + Pad and Load Video refused a
picture named the way ComfyUI names a generated file
("photo.png [output]", "[temp]") with "The selected source is outside
ComfyUI's input folder." Core Load Image takes those names.
resolve_input_path now reads the name the same way the video nodes'
Outputs list already does (resolve_server_file): the tag picks the
input, output or temp folder, and the rest is a name below it. A whole
path, "~", "." and "..", and a network path are refused from the text
alone; a link that leads out of the folder is refused once resolved.
Both functions share that code. A whole path inside the input folder,
accepted before, is now refused too, as the security rule asks.
Load Video's player and the shared upstream preview stripped the tag
and asked /view for the input folder; they now keep the folder.
Tests cover input, [input], [output] and [temp] names through the
resolver and through ComfyUI's own validation next to core Load Image,
and the refused escapes. Help pages, SECURITY.md and CHANGELOG say so.
94 lines
5.3 KiB
Markdown
94 lines
5.3 KiB
Markdown
# Load Image + Pad
|
||
|
||
Loads an image and builds an outpaint canvas around it in one node. The
|
||
canvas drawn on the node is the control: **drag any edge of the dashed
|
||
final rect** to grow that side's padding — the whole edge is the handle,
|
||
and corners grab the nearer edge. The second output is a mask covering
|
||
exactly the padding, ready for an inpainter.
|
||
|
||
The widget card holds Source and Upload, Fill, Color or Backdrop, Feather,
|
||
Multiple, and Budget. **Exact padding** opens a separate scrub row
|
||
for each side. Every row can take a link; linked controls dim, and their
|
||
values and links save with the workflow. The canvas remains available below
|
||
the card for dragging the borders.
|
||
Linked sides are controlled upstream; dragging their borders leaves the saved
|
||
padding value unchanged.
|
||
|
||
## The on-node canvas
|
||
|
||
- Each padded side shows its **"+N px"** count on the band; when the band is
|
||
too thin to read, the label hops inside the image onto a pill. A side that
|
||
**Multiple** trims shows **"−N px"** instead, with the cut-off strip of the
|
||
image shaded.
|
||
- The badge in the corner is the truth: the **final output size** after the
|
||
canvas-multiple and megapixel math, exactly what the `width`/`height`
|
||
outputs will say.
|
||
- **Reset padding** appears in the top-right corner while there is padding
|
||
to clear; it sets every side a link does not drive back to 0.
|
||
- Clicks on empty canvas space fall through, so the node still drags.
|
||
- The hidden `pad_left/top/right/bottom` widgets hold the real values — the
|
||
canvas is their remote control, so undo, save/load, and the API format all
|
||
see plain INT widgets.
|
||
|
||
## Guarantees
|
||
|
||
- The original pixels land **bit-identical** at their position (resized
|
||
only when a megapixel target is set — and then resized *before* padding,
|
||
so the mask seam stays one crisp pixel wide).
|
||
- No strip is ever added along edges you did not pad; see **Multiple**.
|
||
- The mask is `1.0` over every padded pixel and `0.0` over the source,
|
||
ramped only where **feather** says so.
|
||
|
||
## Controls
|
||
|
||
- **Source** (`image`): Choose or upload from ComfyUI's input folder; the list previews the image under the pointer and filters as you type. A picture ComfyUI made, named like `photo.png [output]`, loads too, as it does in core Load Image.
|
||
- **source_image** (optional socket): Wire an image from another node here
|
||
and it is padded instead of the file; the Source row dims while the wire
|
||
is connected. The canvas can only show a wired picture after a run, so it
|
||
draws an outline until then, and afterwards the last image it padded at
|
||
its true size. The padding applies to every image that arrives, so a
|
||
loader that feeds one image per run pads a whole folder the same way.
|
||
- **Fill** / **Color** / **Backdrop** (`mode` / `fill_color` /
|
||
`backdrop_blur`): Five fills — `color`, `edge`, `edge pixel`,
|
||
`pillarbox blur`, `mirror`. **Color** shows for `color`, **Backdrop** for
|
||
`pillarbox blur`. `mirror` reflects the picture outward at every edge (the
|
||
edge pixel included, and on past the picture's own size), so the padding
|
||
reads as more of the scene: the margin to give an edit model room to
|
||
drift, with the stitcher wired into **Realign to Source 🆎**. On Qwen
|
||
Image 2.1 restyles, a mirror margin tempted the model to zoom in and fill
|
||
the canvas far less often than edge-pixel or flat gray padding.
|
||
- **Feather** (`feather`): Ramps the mask *inward* across the image edge on each padded
|
||
side (ramp width capped by the image size), so the sampler blends the
|
||
seam. `0` keeps the seam hard. The padding itself always stays solid.
|
||
- **Multiple** (`canvas_multiple`, starts at `8`; `1` keeps every pixel):
|
||
The final canvas rounds to this multiple. The extra pixels join a side you padded (the right or bottom one
|
||
when you padded both). If you padded neither left nor right, or neither
|
||
top nor bottom, nothing is added there: a strip along an edge you left
|
||
alone would be one more edge for the model to paint, and a thin one comes
|
||
out flat and off-tone. With a **Budget** the source is scaled to fit
|
||
instead, keeping its shape (with no padding at all, each side snaps on
|
||
its own); without one it loses those few pixels, evenly from both edges,
|
||
and the rest stays bit-identical.
|
||
- **Budget** (`target_megapixels`): `0` = off. Rescales the **source** so
|
||
the padded canvas lands on this many megapixels, then re-rounds to the
|
||
multiple — the way to outpaint a small or huge image at a sampler-friendly
|
||
size.
|
||
|
||
## Outputs
|
||
|
||
- **image**: The padded canvas.
|
||
- **mask**: The outpaint mask (white = padding, feathered per `feather`).
|
||
- **width / height**: The final canvas size — the badge's numbers as INTs,
|
||
for wiring into latent nodes.
|
||
- **stitcher**: Hand to **Stitch Inpaint 🆎** with the sampled result to
|
||
keep only the new padding and restore the original pixels bit-identically
|
||
— whatever the sampler did inside the source area is discarded. It also
|
||
records where the source sits on the canvas, which **Krea 2 Outpaint
|
||
Model Patch 🆎** reads to place the reference and **Realign to Source 🆎**
|
||
reads to return just the picture's area of an edit made on the padded
|
||
canvas.
|
||
- **reference**: The source alone, no padding, fitted to a small multiple
|
||
of 16 — the reference image for **Krea 2 Encode 🆎** and other
|
||
reference conditioning. It is built on every run; leave it unconnected
|
||
when nothing needs it.
|