Z-Turbo Style Transfer
It's not style transfer, it's color jacking — the Z-Turbo Style Transfer node, honestly
- model
- vae
- reference_image
- positive_prompt
- negative_prompt
- image
Calling this "style transfer" oversells it, and knowing that up front is the whole trick. This node doesn't copy brushstrokes or art direction. It re-renders your image with Z-Image Turbo and then forces the reference photo's color mood onto the result - a fast, dependency-free palette hijack. That's a much narrower promise than IP-Adapter or a trained style LoRA, and much better at being exactly that.
Why reach for it: Z-Image Turbo is guidance-distilled, which means plain img2img at CFG 1 lets the reference image's color atmosphere drift away - the model obeys the prompt so hard that a "warm golden hour" reference comes back neutrally lit. The author's fix is two things glued into one node: img2img with Turbo-appropriate sampling, then a pixel-space color match that re-applies the reference's tone after the fact, no matter what the prompt said.
How it works
Reading the source, the pipeline is refreshingly transparent. Your reference_image gets VAE-encoded and used as the img2img latent - so it does double duty as both the composition source and the color reference. The sampler is hardcoded to res_multistep + simple, which is exactly the sampler/scheduler combo the community validated for Z-Image Turbo, with CFG 1 and 8 steps baked in as sensible defaults. You're not choosing these, and that's fine - it's one less way to shoot yourself.
After decode, the node runs its "color gene" step: it computes the per-channel mean and standard deviation of the reference, renormalizes the generated image to those stats, then linearly blends the two by color_match_strength and clamps to a valid range. That's AdaIN-style adaptive instance normalization, simplified and dropped into pixel space. It's mathematically crude and it works shockingly well for the one thing it claims: forcing a palette.
The inputs that matter
- style_strength - this is your denoise in disguise. 0.7–0.85 keeps the reference's composition and swaps materials/style; 1.0 throws composition away for a full re-render, which is when the color match earns its keep.
- color_match_strength - the real dial. 0.8 is the sweet spot: keeps the reference's high-level tone without flattening the new image's highlights and shadows. 1.0 is total coverage and tends to overcook.
- cfg, steps, seed - sane defaults (1, 8, 0). On Turbo, raise CFG above ~3 and images burn; the 8-step default is where the model was trained to be.
The output is a single image (IMAGE), which you wire straight into a preview or Save Image node, then on into an upscaler if you want more than Z-Image's ~2MP native ceiling. One note: reference_image can be a batch, but only the first frame is used for the color stats.
Installing it
ComfyUI Manager: search "Z-Turbo Style Transfer". Or the manual route:
cd ComfyUI/custom_nodes/
git clone https://github.com/WuMIn259/ComfyUI-ZTurbo-Style-Transfer
# restart ComfyUI
That's genuinely it. requirements.txt lists only torch and numpy - both already present in any ComfyUI install. No model files ship with the pack; you bring your own Z-Image Turbo checkpoint (HuggingFace Tongyi-MAI/Z-Image-Turbo).
Where it bites
The README's best-practice section tells you to connect ControlNet to the node's "model input" for a fully new composition. Don't hunt for that port - it doesn't exist. This node is a self-contained VAEEncode → KSampler → VAEDecode package; there's no way to inject ControlNet conditioning into it. The ControlNet example workflow ships as a screenshot, not a loadable graph. If you want ControlNet-driven composition, build that in a standard sampler and treat this node's idea - match your output's stats to a reference after the fact - as the reusable trick.
Also, be honest about scope: the color match is global tone. It won't give you a painter's textures or line quality. For that you still want a style LoRA or an IP-Adapter; this is the fast, free palette shortcut when a reference's mood is what you're after. There's also a hard 4096px guard that refuses oversized inputs to protect VRAM - rare, since Z-Image caps out around 2MP anyway, but it will error loudly if you feed it a huge reference.
Distilled-model users, one familiar gotcha: the negative prompt port is a formality at CFG 1 - Turbo ignores it. If you need actual negative control, this isn't the node's job.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| reference_image | IMAGE | — | |
| positive_prompt | CONDITIONING | — | |
| negative_prompt | CONDITIONING | — | |
| style_strength | FLOAT | 0.850.1–1 | — |
| cfg | FLOAT | 1.01–10 | — |
| steps | INT | 81–50 | — |
| seed | INT | 00–18446744073709550000 | — |
| color_match_strength | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |