Nodes/OpenOutpaint ComfyUI Interface/OpenOutpainter Serving Input IMG2IMG
ComfyUI Node

OpenOutpainter Serving Input IMG2IMG

Where the canvas mask becomes a real ComfyUI mask

By without-ordinary·Created about a year ago·Updated 9 months ago· 5
OpenOutpainter Serving Input IMG2IMG
  • oop_request
  • init_images
  • mask
  • prompt
  • negative_prompt
  • width
  • height
  • SEED
  • steps
  • cfg_scale
  • denoising_strength
  • mask_blur
  • ip2p_image_cfg_scale
  • batch_size
  • n_iter

This is the node that makes outpainting actually feel like outpainting. When you paint a mask over the edge of your image in openOutpaint and hit the img2img tool, the canvas POSTs the whole bundle to /sdapi/v1/img2img: your base image as base64, the mask, the prompt, and every slider. OpenOutpainter Serving Input IMG2IMG decodes all of that into real ComfyUI tensors - the IMAGE and MASK that your inpainting branch needs - plus all the sampler parameters.

It's the mechanical heart of the pack's use case, and it's worth remembering why that use case still exists. Mask-based inpainting has been squeezed hard by instruction-edit models since 2025, but it still uniquely owns bit-identical unmasked pixels and the denoise dial. Outpainting is exactly where that matters: you want the existing image to stay exactly as it is and only the masked fringe to change. That's a mask job, and it's what this node feeds.

What it outputs

Fourteen outputs, but the ones you actually wire:

  • init_images (IMAGE) → your VAEEncode (or VAEEncodeForInpaint if you'd rather bake the mask in that way).
  • mask (MASK) → SetLatentNoiseMask, or straight into the inpaint encoder.
  • denoising_strength → KSampler. The single most important knob for outpainting: higher (0.75–1.0) means the extension visibly "grows" new image; lower means a subtler blend. The canvas sends it, you forward it.
  • mask_blur → feather the mask edge so the seam doesn't show.
  • prompt / negative_prompt, SEED, steps, cfg_scale, width, height → the standard CLIP/KSampler/Empty Latent wiring, same as the txt2img input node.
  • ip2p_image_cfg_scale → only relevant if you're running an instruct-pix2pix-style model; the source defaults it to 0 when the field is missing.
  • batch_size / n_iter → request multipliers.

Mechanically, this is where opencv-python earns its place in the requirements file: base64_to_image decodes the canvas's PNG with OpenCV and converts BGR→RGB, and base64_to_mask pulls the red channel out of the mask image and normalizes it to a float mask. Like its txt2img sibling, the node is lazy and blocks all outputs with an ExecutionBlocker unless the pending request is genuinely an img2img command.

Install and the usual snags

Install once for the whole pack: ComfyUI Manager (search "OpenOutpaint ComfyUI Interface"), or git clone https://github.com/without-ordinary/openoutpaint_comfyui_interface into ComfyUI/custom_nodes and restart. opencv-python is the only extra dependency, and no models need downloading - this node is translation glue.

The failure you'll meet first: you generate, the graph runs, and the outpainted region comes back with a hard seam or the mask seems to do nothing. Check mask_blur - a feather of a few pixels is usually the difference between a visible rectangle and a convincing extension. And if nothing fires at all, confirm the canvas actually sent an img2img request and that this node is on the same oop_request branch as the Serving node - commands only flow down the matching Input/Output pair. Also, this node is part of the pack's "one serving workflow at a time" rule; a second Serving node in the graph is unsupported territory.

CategoryOpenOutpaint-Serving

Inputs (1)

NameTypeDefaultDescription
oop_requestOOP_REQUEST

Outputs (14)

NameTypeDescription
init_imagesIMAGE
maskMASK
promptSTRING
negative_promptSTRING
widthINT
heightINT
SEEDINT
stepsINT
cfg_scaleFLOAT
denoising_strengthFLOAT
mask_blurINT
ip2p_image_cfg_scaleFLOAT
batch_sizeINT
n_iterINT