Image editing in stable-diffusion.cpp allows you to use reference images to guide the generation process, enabling tasks like identity preservation, style transfer, or layout modification.
Depending on the architecture, different models handle reference images differently.
| Model | Default Preset |
|---|---|
| FLUX.1-Kontext-dev | flux_kontext |
| LongCat Image Edit | longcat |
| Qwen Image Edit | qwen |
| Qwen Image LAYERED | qwen_layered |
| Flux.2 [Dev] / Flux.2 [Klein] | flux2 |
| Boogu Image Edit | z_image_omni |
| Krea2 (Community Edit LoRAs) | krea2_ostris_edit |
| Anima (Community Edit LoRAs) | cosmos_reference |
Stable-diffusion.spp also supports basic Unet-based editing models like instruct-pix2pix or CosXL-Edit. This document is not about those.
Different DiT-based editing models require different configurations to process reference images correctly (e.g., whether to use a Vision Language Model (VLM) encoder or pass VAE-encoded images directly to the DiT).
To simplify this, we provide Presets. By default, the system automatically selects the best preset based on the model architecture. However, you can override this using the --ref-image-args argument.
The --ref-image-args argument accepts a comma-separated list of key-value pairs:
Using a preset:
--ref-image-args "preset=qwen_layered"
Using a preset with a specific override:
--ref-image-args "preset=krea2_edit,force_ref_timestep_zero=true"
| Preset | Primary Use Case |
|---|---|
flux_kontext |
FLUX.1 Kontext |
longcat |
LongCat Image Edit |
flux2 |
FLUX.2 models |
qwen |
Qwen Image Edit |
qwen_layered |
Qwen Image Layered |
z_image_omni |
Boogu, Z-Image Omni |
krea2_ostris_edit |
Most Krea2 Community edit LoRAs (trained with Ostris script) |
krea2_edit |
Specifically for lbouaraba/krea2edit. (or similar) |
cosmos_reference |
For Anima |
default |
Uses the automatic detection based on model architecture. |
If presets are insufficient, you can manually configure the following parameters via --ref-image-args:
| Key | Type | Description | Allowed Values |
|---|---|---|---|
preset |
string | Overrides the automatic preset. | (See the Presets table above) |
pass_to_vlm |
bool | Whether reference images are passed to the VLM encoder. | true, false |
pass_to_dit |
bool | Whether VAE-encoded references are passed directly to the DiT. | true, false |
ref_index_mode |
string | Behavior of the RoPE index. | fixed, increase, decrease |
force_ref_timestep_zero |
bool | Forces timestep=0 for reference tokens. | true, false (Krea2 only) |
resize_before_vae |
bool | Whether reference images are resized before VAE encoding. | true, false |
vae_input_max_pixels |
int | Maximum pixel area for VAE reference inputs. | Integer |
vlm_resize_mode |
string | How to resize VLM reference inputs. | longest_side, area, none |
vlm_max_size |
int | Maximum VLM input size; interpreted according to vlm_resize_mode. |
Integer |
vlm_min_size |
int | Minimum VLM input size; interpreted according to vlm_resize_mode. |
Integer |
vlm_size |
int | Shortcut to set both VLM min and max size to the same value. | Integer |
For a technical overview of how each preset is configured, see the table below.
| Preset | VLM | RoPE Index | Cond Resize | Special Notes |
|---|---|---|---|---|
flux_kontext |
No | fixed |
none |
|
longcat |
Yes | fixed |
area |
|
flux2 |
No | increase |
none |
|
qwen |
Yes | increase |
area |
|
qwen_layered |
Yes | decrease |
area |
|
z_image_omni |
Yes | fixed |
area |
|
krea2_ostris_edit |
Yes | increase |
area |
force_ref_timestep_zero = true |
krea2_edit |
Yes | increase |
longest |
vlm_size = 768 |
cosmos_reference |
No | fixed |
none |
resize_before_vae = false |
Additional Default Notes:
-
VLM Input Sizes: For most presets,
vlm_max_sizeandvlm_min_sizeare set to-1, meaning the values are model-dependent and handled automatically. Inareamode they represent pixel area; inlongest_sidemode they represent a side length in pixels. -
VAE Input Size:
vae_input_max_pixelsdefaults to$1024 \times 1024$ pixels (1048576).