ComfyUI lesson 7: Control composition with ControlNet
Preserve edges or pose while changing appearance, with a practical strength sweep.
Listen to this article
On-device voiceUses the voice built into your browser; no article text leaves this page.
Audio narration is not supported by this browser.
Prompts describe what an image should contain. ControlNet supplies spatial evidence about where those things should be. The lesson graph extracts Canny edges from a source image and uses them to preserve structure while Proteus/SDXL changes style.
The conditioning path
Load the image, derive a control image, load the ControlNet model, then apply it to both positive and negative conditioning. The advanced apply node returns updated conditioning branches for KSampler. The source is not the sampler latent in this workflow; its edges are guidance.
Tune three controls
| Control | Effect |
|---|---|
| Strength | How forcefully the control map constrains generation |
| Start percent | When ControlNet begins influencing denoising |
| End percent | When it releases control |
Start with strength 0.6, start 0, end 1. If the result traces every edge too literally, lower strength or end earlier. If the structure drifts, raise strength. For Canny, threshold choice matters too: noisy edges become noisy obligations.
ControlNet is not one thing. Canny preserves edges, depth preserves spatial volume, OpenPose preserves a skeleton, and line art preserves drawing structure. Choose the control signal that represents what must not move.
Use the downloadable SDXL style-transfer graph as the baseline. Then make a three-column sweep at strengths 0.35, 0.60, and 0.90. Keep seed, prompt, and Canny thresholds fixed. You will see the quality–obedience frontier directly.
Run the lesson, do not just read it
- Open the tested workflow in Comfy Studio
- Download the exact API-format JSON
- CLI:
app comfy download sdxl-style-transfer
The gallery records model sources, minimum VRAM, custom-node requirements, and verification state beside the graph. That is the portable unit for this series.
Series progress: lesson 7 of 10. Previous: Use LoRAs without losing the base model Next: Run modern models on modest VRAM