DiptychCreate~
The node that builds ICEdit's side-by-side edit
- image_input
- diptych
- maskDiptych
- original_image
ICEdit doesn't edit your photo in place. It asks you to hand it a picture of two side-by-side copies of the photo - a diptych - and let the model rebuild the right half. DiptychCreate is the node that does that assembly, and it's the first thing in the official ICEdit workflow you'll touch. If you've come from Flux Kontext or Qwen-Image-Edit, this is the same "edit from a sentence" idea, but built the cheap way: on top of stock Flux.1 Fill dev plus a small LoRA, no new base model required.
The trick is in the mask. DiptychCreate takes your source image, resizes it so the width is 512 (height stays proportional), and pastes the same image into both halves of a 1024-wide canvas. Then it builds a mask where the left half is black and the right half is white. Left = "this stays exactly as it is," right = "regenerate this to match the instruction." The model sees the untouched original as context and paints the edit next to it. After sampling you just crop the right half - which is exactly what the bundled workflow does with an ImageCrop node.
Inputs and outputs
Only two inputs, and you'll set one of them:
- image - a dropdown of files in your
ComfyUI/inputdirectory, with an upload button. This is the normal path: pick or upload your photo. - image_input - an optional
IMAGEtensor from any upstream node. The README explicitly supports this: feed in an image you've already processed (cropped, upscaled, whatever) and DiptychCreate will use it instead of the dropdown file.
The outputs are the three things ICEFConditioning needs:
- diptych (
IMAGE) - the 2x-wide side-by-side canvas, ready for the VAE. - maskDiptych (
MASK) - left half black, right half white. This is what tells the sampler where to actually generate. - original_image (
IMAGE) - the un-diptych'd source, kept around so you can composite or crop cleanly later.
Wire diptych and maskDiptych straight into ICEFConditioning, which is the node that turns this into latents.
Installing it
This pack is the official ComfyUI integration of the ICEdit project from Zhejiang University (upstream: River-Zhang/ICEdit, maintained here by Zihao Liu / hayd-zju). Easiest install is ComfyUI Manager - search "ICEdit" - or clone it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/hayd-zju/ICEdit-ComfyUI-official.git
Then restart ComfyUI. The three nodes themselves import nothing beyond ComfyUI core - no pip deps of their own - but the README asks you to install ComfyUI_essentials and ComfyUI-Easy-Use as prerequisites because the bundled example workflows use nodes from them (like Easy-Use's easy cleanGpuUsed). If you only care about the three nodes, you can skip them.
You'll also need the actual weights, which the whole pack shares: Flux.1 Fill dev (flux1-fill-dev.safetensors, big - 12B), the ICEdit normal LoRA from RiverZ/ICEdit-normal-lora, the FLUX VAE (ae.safetensors), and the T5-XXL + CLIP-L text encoders. If you can reach HuggingFace the download is automatic; otherwise grab them into models/unet, models/loras, models/vae and models/clip.
Where people get burned
Two things. First, the image_input gotcha from the README: even when you're feeding a tensor through image_input, the image dropdown still needs a real file selected. The file gets ignored, but leaving it on "None" can error the node out. Just keep any image picked there.
Second, resolution. Your source gets squeezed to 512px wide per panel - that's the edit resolution, and it's small. That's expected: the full ICEdit workflow regenerates at that size and then upscales with a model like 4xNomos8kDAT afterward. Don't judge a result at raw output size. And if your edit comes back blurry or unchanged, that's rarely DiptychCreate's fault - it's usually the sampler's add_noise setting downstream (see ICEFConditioning). This node is dead simple; when something's wrong, look further down the graph first.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | COMBO | 2 options: None, example.png | |
| image_inputopt | IMAGE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| diptych | IMAGE | — |
| maskDiptych | MASK | — |
| original_image | IMAGE | — |