CWK Wan2.2 Image Prep
Crop and set up your Wan 2.2 first frame without leaving ComfyUI
- image
- image
- width
- height
- frame_rate
- scheduler
- sampler_name
- total_steps
- split_steps
- cfg_scale
The fiddliest part of a Wan 2.2 image-to-video workflow is never the generation. It's the first frame. I2V is the community's favorite Wan mode precisely because anchoring the first frame to a known image kills most of the consistency problems that plague text-to-video - but the model expects a fixed resolution and a clean crop, and doing that in an external editor, exporting, and reloading gets old fast. This node is the shortcut: upload a still straight from your browser, drag a crop frame around it, and out the other side come the image and every sampler setting a KSampler wants. No LoadImage, no separate resize node, no tab-switching.
What it actually does
The crop is a real canvas UI drawn on the node itself - no DOM overlay, no stock widgets pretending. You drag a crop frame that's locked to your chosen aspect ratio (so you can't produce a crop Wan will choke on), and the node's crop_x, crop_y, crop_width, and crop_height inputs are just the serialized state of that frame. In the backend it crops, scales proportionally, then center-crops to the exact preset resolution.
The one thing to know about the internals: image source priority is uploaded file → connected image input → black placeholder. That last fallback is a trap. If you have neither a browser-uploaded image nor an IMAGE wired in, you don't get an error - you get a perfectly generated black rectangle. The whole workflow runs, and you won't notice until the video comes out black. Check that before anything else.
The inputs that matter
Three things actually get set by hand:
resolution_preset- five Wan-friendly sizes: 16:9 at 832×480 or 1280×720, 9:16 at 480×832 or 720×1280, and 1:1 at 1024×1024. Pick the one your VRAM can chew; 832×480 is the sane start.sampler/scheduler- passed straight through to the KSampler as strings.total_steps/split_steps- the interesting one. Wan 2.2 denoises in two passes: a high-noise model handles motion and composition, a low-noise model refines detail.split_stepsis where the sampling hands off between them.
The defaults (CFG 7.5, 50 total / 25 split, scheduler simple, sampler euler) are generic and conservative - they're SDXL-era habits, and Wan is flow-matching, so they don't transfer perfectly. The community standard is lighter: 20–30 steps, CFG around 3.5 or higher on the high-noise pass (or 1.0 if you're running a speed LoRA like LightX2V or CausVid), Euler-family on simple/sgm_uniform. You can also wire frame_rate, width, and height forward to your latent/empty-latent node, so everything downstream agrees about what you're making.
One tiny gotcha in the resample dropdown: area is mapped to nearest-neighbor in the code, not area-averaging, so if you're scaling up a low-res still, reach for lanczos or bicubic instead.
Install
ComfyUI Manager → search CWK Wan2.2 Nodes → Install, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/cowneko/CWK_Wan2.2_Nodes.git
Then restart ComfyUI. There are no extra Python dependencies - just torch/numpy/Pillow, which ComfyUI already ships. You do need a Wan 2.2 model (I2V-A14B or the TI2V-5B) working in your setup, but this node doesn't touch it.
Troubleshooting
- Black output - no image source reached the node; upload in the node or wire an
IMAGEin. - You see a plain node with a filename text field, no canvas - the JS extension didn't load. That was a real early bug (the
WEB_DIRECTORYregistration), fixed in 1.0.0, so update the pack and hard-refresh the browser tab. frame_ratedefault of 8 - that's a lowball for Wan; most people run 16fps. It's just a passthrough value, so set what your video pipeline uses.
It's a small pack from a single author with no big community behind it - but for the job it does, this node is quietly the most convenient part of it.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| resolution_preset | COMBO | 5 options: 16:9 (832x480), 16:9 (1280x720), 9:16 (480x832), 9:16 (720x1280), 1:1 (1024x1024) | |
| crop_x | INT | 00–65536 | — |
| crop_y | INT | 00–65536 | — |
| crop_width | INT | 5121–65536 | — |
| crop_height | INT | 5121–65536 | — |
| upscale_method | COMBO | 5 options: nearest-exact, bilinear, area, bicubic, lanczos | |
| frame_rate | FLOAT | 8.01–60 | — |
| total_steps | INT | 501–1000 | — |
| split_steps | INT | 251–1000 | — |
| cfg_scale | FLOAT | 7.50–30 | — |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| sampler | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| image_filename | STRING | — | |
| imageopt | IMAGE | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| width | INT | — |
| height | INT | — |
| frame_rate | FLOAT | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| sampler_name | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2 | — |
| total_steps | INT | — |
| split_steps | INT | — |
| cfg_scale | FLOAT | — |