What is Qwen-Image-2.1?

Qwen-Image-2.1 is an open-weight image generation model that combines image generation and editing in a single model.

A closed-source Qwen-Image 2.0 came first, but within the open-weight Qwen-Image family this is the successor to Qwen-Image-2512 and Qwen-Image-Edit-2511.

Previous Qwen-Image models used separate models for generation and editing. Like MiniMax H3, the 2.x architecture feeds both text and reference images into a single DiT, so the same model can handle image generation, editing, and Ref2Image.

It also supports native RGBA output—in other words, transparent images.

The image generation part is a compact 7B, yet it covers generation, editing, references, and transparency. Quite a handy model.


Recommended settings

  • Resolution
    • 2K (about 4 MP recommended)
      • 2048 × 2048 px for 1:1
    • Use multiples of 32 for both width and height

Downloading the models

📂ComfyUI/
└── 📂models/
    ├── 📂diffusion_models/
    │   ├── qwen_image_2.1_int8_convrot.safetensors
    │   └── qwen_image_2.1_turbo_int8_convrot.safetensors
    ├── 📂loras/
    │   └── qwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensors
    ├── 📂text_encoders/
    │   └── qwen3vl_8b_int8_convrot.safetensors
    └── 📂vae/
        └── qwen_image_2.1_vae_bf16.safetensors

text2image

qwen_image_2_1_text2image.json
  • CFG: 1.0
    • The official workflow does not use CFG, but it might be worth raising it a little and trying a Negative Prompt

For better or worse, the Seed makes a very large difference. Changing the resolution also changes the image substantially, so try a variety of resolutions and Seeds.

Turbo

Qwen has also released an official Turbo version that generates in 8 steps.

There is also a dedicated Turbo model, but the LoRA means less to download, so this page uses the LoRA.

qwen_image_2_1_turbo_text2image.json
  • Load LoRA

    • Apply qwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensors at strength 1.0

    If you use the Turbo model (qwen_image_2.1_turbo_int8_convrot.safetensors), the LoRA is not needed, so delete Load LoRA.

  • SamplerCustomAdvanced + ManualSigmas

    • Euler / Simple does not generate well, so we use the sigmas the official release recommends
    • 1.0, 0.978453, 0.95418, 0.926626, 0.89508, 0.845148, 0.704534, 0.414568, 0.0
Outputs
Standard
Standard
Turbo
Turbo

Every other workflow on this page also has a Turbo version, placed right below it.


Ref2Image

Combine reference images and have the model draw a new image.

qwen_image_2_1_ref2image.json
qwen_image_2_1_turbo_ref2image.json
  • Accepts up to 10 reference images
  • Specify which images to use in the prompt, such as “the woman from <image1> is sitting in the location from <image2>.”
Deep diveRef2Image

Text Encode Qwen Image 2.1

Enter the reference images and prompt here.

  • resolution
    • Reference images are resized to about 1 MP while preserving their aspect ratio before being passed to the model
  • latent output
    • This is an empty latent based on the size of the first image, but its dimensions are rounded internally. I do not use it in my workflow because I want the output to match the input image dimensions exactly
Outputs

Image editing

The workflow is almost the same as Ref2Image. The only difference is that the output size is matched to the first image.

Since this is editing, you need the original picture back at the same size. So this workflow reads the first image dimensions with Get Image Size and passes them to Empty Latent Image.

From the second image on, it's the same as Ref2Image: you can use them as references.

Basic image editing

qwen_image_2_1_image_edit.json
qwen_image_2_1_turbo_image_edit.json

As with other image-editing models, simply give an instruction such as “remove the man,” “make the clothes red,” or “turn this into a watercolor painting.”

Deep diveBasic image editing

Text Encode Qwen Image 2.1

  • resolution
    • Unlike Ref2Image, set this to 0. The image is not scaled; its dimensions are only rounded to multiples of 32 (I resize the image beforehand, so in practice nothing changes)
    • Just to be safe, keep the size the model sees and the output size the same
Outputs
input
input
output
output

Specify the location with colored circles

Draw colored circles around the areas you want to edit.

qwen_image_2_1_image_edit_local.json
qwen_image_2_1_turbo_image_edit_local.json

Draw directly on the image, circling the object you want edited.

  • You can also use the Mask Editor attached to the Load Image node

Then simply give an instruction such as “remove the wristwatch inside the red circle.”

You can use several colors for separate instructions, which is handy when the location is difficult to describe in words.

Outputs
input
input
output
output

Specify the location with a mask

qwen_image_2_1_image_edit_local_mask.json
qwen_image_2_1_turbo_image_edit_local_mask.json

The idea is the same as using a colored circle, but here a black-and-white image that marks the location is supplied separately from the original image.

The nice part is that you don't draw on the original, so it stays clean.

Deep diveSpecify the location with a mask

Convert the mask to an image

Convert the MASK output from Load Image into a black-and-white image with Convert Mask to Image, then connect it to image_2.

In fact, the model only receives an ordinary black-and-white image. You can skip the mask conversion and just paint white over a black background yourself.

This works very differently from inpainting.
Inpainting has a mechanism that prevents edits outside the mask, while this is only a location guide.
The edit may therefore spill outside the specified area.

Outputs
input
input
mask
mask
output
output

Outpainting

This one, too, works very differently from ordinary Outpainting, where padding is added and then inpainted.

qwen_image_2_1_outpainting.json
qwen_image_2_1_turbo_outpainting.json

What happens if you provide a wide image as a reference, but generate a portrait image?

That's right: Qwen-Image-2.1 generates an image that fills in the space above and below.

Here too, it redraws the whole image rather than only the added space, so the original area changes a little as well.

It's not a way to keep the source image strictly fixed, but it's nice and easy.

Outputs
input
input
output
output

Generate from guide images

Although this is not ControlNet itself, you can pass pose images, depth maps, and similar images as image-editing references and generate images based on them.

Model download

📂ComfyUI/
└── 📂models/
    └── 📂checkpoints/
        └── sdpose_wholebody_fp16.safetensors
qwen_image_2_1_image_edit_sdpose.json
qwen_image_2_1_turbo_image_edit_sdpose.json

Let’s feed in a reference image as well and put that person in the specified pose.

You might wonder whether turning the pose into a stick figure is really necessary. Even if you ask the model to look only at the pose, it may also pick up unnecessary details such as the clothing and background.

Rather than using Pose simply because that is what you do with ControlNet, the point here is to strip away unnecessary information from the reference image and pass only the pose or shape.

Outputs
reference
reference
pose
pose
output
output

Upscale

Since it can generate images up to 4 MP, let’s use that ability to clean up a low-quality image.

qwen_image_2_1_image_edit_upscale.json
qwen_image_2_1_turbo_image_edit_upscale.json

First upscale the image to 4 MP and provide it as a reference, then have the model refine it.

This model is very good at preserving the reference image, so Upscale is probably one of its strongest tasks.

On the other hand, getting it to redraw the image more aggressively, as in what is often called enhancement, may take a little ingenuity.

Outputs
input
input
output
output

Transparent images

Qwen-Image-2.1 can generate transparent images with only a small change to the prompt.

No special nodes are required. It produces an RGBA image with an Alpha Channel from the start.

Generate a transparent image

qwen_image_2_1_text2image_rgba.json
qwen_image_2_1_turbo_text2image_rgba.json

Write the prompt in this format:

This is an RGBA image with transparency. <your prompt here>. The image has alpha channel and the background is transparent.

The beginning and ending are fixed phrases, so you can copy them as-is and replace only the middle.

Save the output as PNG to preserve transparency. JPEG would discard the Alpha Channel.

Outputs

Subject extraction

Combine transparent generation with image editing and—yes—you can pull a subject out of an image too.

qwen_image_2_1_subject_extraction.json
qwen_image_2_1_turbo_subject_extraction.json

Use the same format as above and tell it what to extract with Extract ....

Outputs
input
input
output
output

Applications

Panorama generation

Give it any reference image and ask for an ERP image at a 2:1 resolution. That alone is enough to generate a 360-degree panorama. Almost too easy...

Custom node

  • nomadoor/ComfyUI-Panorama-Stickers
    • A little self-promotion: this is my custom node for previewing panoramas and taking shots inside a panorama. Give it a try if it sounds useful.
qwen_image_2_1_panorama.json
qwen_image_2_1_turbo_panorama.json

This workflow generates a wide 2:1 image while using the source image as a reference.

Rather than strictly outpainting the left and right sides, it redraws the full ERP image so everything fits naturally into the panoramic space.

Layer decomposition

In Subject extraction, we extracted any subject from an image as a transparent image.

So what if we remove the extracted subject from the image, then extract whatever is in front next? Repeat this, and we should be able to split a single image into layers, front to back.

qwen_image_2_1_layer_decomposition.json
qwen_image_2_1_turbo_layer_decomposition.json

This uses loops to repeat the following steps:

  1. Have an MLLM choose what appears to be at the very front
  2. Extract only that subject as a transparent image
  3. Remove the same subject from the current image
  4. Pass the image with the subject removed to the next iteration
Deep diveLayer decomposition

Set the number of layers

First, provide the image and the number of layers you want.

Set this to 5 to extract four layers in order from the front, with the remaining background becoming the fifth.

Choose what to extract next

Generate Text looks at the current image and answers with a short description of what to extract next.

What should count as one layer depends on how many layers remain, so the prompt also includes number of layers - iteration_index to tell the MLLM how many more layers the image will be split into.

The returned subject name is inserted into the Qwen-Image-2.1 instruction with Format Text.

Generate Text raises an error when given an RGBA image, so Split Image with Alpha removes the Alpha information first.

Extract the foremost subject

Only the subject selected by the MLLM is extracted as a transparent image.

This is the same process used in Subject extraction above.

The resulting image is passed to End Loop as one layer.

Remove the foremost subject

Layer decomposition needs not only the extracted subject, but also an image with that subject removed.

It would have been nice if passing the source image and cutout as-is and saying “remove this” had worked, but it didn't. Instead, the extracted region is painted green and the model is told to fill the green area naturally.

The image with the subject removed then becomes the source for the next extraction.

Output the background as-is at the end

After repeating this process, only the background remains.

There is no need to extract or remove anything from the background.

With is_last and If/Else Switch, the last iteration bypasses extraction and removal and outputs the current image as-is.

You might be wondering why I use iteration_index instead of a fixed seed.
I'm not sure whether it's a bug or intended, but if you edit an already-edited image again with the same seed, the output comes out all crunchy and artifacted…
It works fine as long as the seed changes, so as a quick workaround I use iteration_index, which changes on every loop.

Outputs
input
input
output 1
output 1
output 2
output 2
output 3
output 3
output 4
output 4
output 5
output 5