Qwen-Image-2.1とは?
Qwen-Image-2.1 は、画像生成と画像編集を 1 つにまとめた open weight の画像生成モデルです。
クローズドでは Qwen-Image 2.0 が先に公開されていましたが、open weight の Qwen-Image 系としては、Qwen-Image-2512 / Qwen-Image-Edit-2511 の後継ですね。
従来の Qwen-Image は生成用と編集用でモデルが分かれていましたが、2.x では MiniMax H3 と同じように、テキストも参照画像も一本の DiT にまとめて放り込むので、画像生成、編集、Ref2Image まで同じモデルで扱えます。
さらに RGBA、つまり透過画像の生成にもネイティブで対応しています。
画像生成部は 7B と小型ながら、生成、編集、参照、透過まで一通りできる。なかなか器用なモデルです。
推奨設定値
- 解像度
- 2K(約 4 MP 推奨)
- 1:1 なら 2048 × 2048 px です
- 幅と高さは 32 の倍数にします
- 2K(約 4 MP 推奨)
モデルのダウンロード
- diffusion_models
- qwen_image_2.1_int8_convrot.safetensors (7.26 GB)
- qwen_image_2.1_turbo_int8_convrot.safetensors (7.26 GB)
- 🚨 Turbo 版で使用(LoRA の代わりに使う場合)
- loras
- qwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensors (913 MB)
- 🚨 Turbo 版で使用(この記事の workflow はこちら)
- qwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensors (913 MB)
- text_encoders
- qwen3vl_8b_int8_convrot.safetensors (9.35 GB)
- vae
- qwen_image_2.1_vae_bf16.safetensors (676 MB)
📂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

CFG: 1.0- 公式の workflow は CFG なしになっていますが、少し上げて Negative Prompt を使ってみる価値はあるかもしれませんね
良くも悪くも、Seed による差が非常に大きいです。解像度を変えても絵が大きく変わるので、いろいろな解像度と Seed で試してみてください。
Turbo
Qwen 公式から、8 ステップで生成できる Turbo 版も公開されています。
Turbo 専用モデルもありますが、追加でダウンロードする量が減るので、ここでは LoRA を使っていきます。

-
Load LoRAqwen_image_2.1_turbo_lora_avg_rank_178_bf16.safetensorsを strength1.0で適用します
Turbo モデル(
qwen_image_2.1_turbo_int8_convrot.safetensors)を使う場合は、LoRA は使わないのでLoad LoRAを消してください。 -
SamplerCustomAdvanced+ManualSigmas- Euler / Simple では上手く生成できないため、公式が推奨している sigma を使います
1.0, 0.978453, 0.95418, 0.926626, 0.89508, 0.845148, 0.704534, 0.414568, 0.0


ほかの workflow にも、それぞれのすぐ下に Turbo 版を置いています。
Ref2Image
参照画像を組み合わせて、新しい画像を描いてもらいます。

- 参照画像は最大 10 枚まで入力可
- プロンプトで「
<image1>の女性が<image2>の場所に座っている」のように、どの画像を使うのか指定します。

Text Encode Qwen Image 2.1
ここに参照画像とプロンプトを入力します。
resolution- 参照画像は、アスペクト比を保ったまま約 1 MP にリサイズされてからモデルに渡ります
latent出力- この latent は 1 枚目のサイズに合わせた空 latent ですが、内部で丸められたサイズになります。入力した画像とぴったり同じサイズで出したいので、私の workflow では使いません

画像編集
workflow は Ref2Image とほとんど同じです。違うのは、生成する画像のサイズを 1 枚目に合わせているところだけ。
編集なので、元の絵が同じサイズで返ってこないと困ります。そこで Get Image Size で 1 枚目のサイズを読み取り、Empty Latent Image に渡しています。
2 枚目以降は Ref2Image と同じで、参照画像として使えますよ。
基本的な画像編集

これまでの画像編集と同様に、「男性を消して」「服を赤くして」「水彩画に変えて」のように指示してください。

Text Encode Qwen Image 2.1
resolution- Ref2Image のときと違い、ここは
0にします。拡大縮小されず、32 の倍数に丸められるだけです(事前にリサイズしてあるので、実際は何も起きませんが) - モデルが見る画像のサイズと出力するサイズは、一応合わせておきましょう。
- Ref2Image のときと違い、ここは


赤丸で位置指定して編集
編集したい場所を色ペンで囲って指示します。

編集したい画像に直接、編集させたいオブジェクトを囲みます。
Load Imageノードに付いているMask Editorでも可能です。
「赤丸で囲った腕時計を消して」のように指示するだけです。
複数の色を使って別々の指示を出せたりするので言葉で上手く指示しにくいときには便利ですね。


マスクで位置指定して編集

赤丸と考え方は同じですが、こちらは位置を示す白黒画像を、元画像とは別に 入力します。
元画像へ直接書き込まないので、画像を汚さずに済むのがいいところですね。

マスクを画像に変換
Load Image の MASK 出力を Convert Mask to Image で白黒画像に変換し、image_2 へ入力します。
実のところ、モデルが受け取るのはただの白黒画像です。マスクから変換せず、黒い背景に白でヌリヌリした画像を直接用意しても構いませんよ。
いわゆる inpainting とはまったく異なる仕組みです。
inpainting にはマスクの外を編集させない仕組みがありますが、こちらはあくまで位置を示すガイドです。
そのため、指定した範囲から編集がはみ出すこともあります。



Outpainting
こちらも、Padding を足してそこを inpainting させる……という一般的な Outpainting とは、まったく仕組みが違います。

参照画像として横長の画像を入れる。でも、生成させる画像サイズを縦長にしたらどうでしょう?
そう、上下の空間を埋めた画像を Qwen-Image-2.1 が生成してくれるんですね。
こちらも余白のみならず画像全体を描き直しているので、元の部分も多少変わります。
きっちり元画像を固定する方法ではありませんが、簡単でいいですね。


ガイド画像から生成
ControlNet そのものではありませんが、ポーズ画像や深度マップなどを画像編集の参照として渡し、それをもとに画像を生成できます。
モデルのダウンロード
- checkpoints
- sdpose_wholebody_fp16.safetensors (1.92 GB)
📂ComfyUI/
└── 📂models/
└── 📂checkpoints/
└── sdpose_wholebody_fp16.safetensors

参照画像も一緒に入力し、その人物を指定したポーズにしてみましょう。
わざわざ棒人間に直す必要があるのか?という気もしますが、「ポーズだけ見てほしい」といっていても、服装や背景など余計な情報まで引っ張ってしまうことがあります。
ControlNet だから Pose を使うというより、参照画像から余計な情報を削ぎ落とし、ポーズや形だけを取り出して渡す、という意味合いのほうが強いですね。



Upscale
せっかく 4 MP まで生成できるので、画質の荒い画像をきれいにしてもらいましょう。

あらかじめ 4 MP まで拡大した画像を参照として入力し、それを元にリファインしてもらいます。
このモデルは参照画像を保持する力が非常に高いので、Upscale は、おそらく非常に得意なタスクの一つです。
その一方で、いわゆるエンハンスのように大きく描き直すには、少し工夫がいるかもしれませんね。


透過画像
Qwen-Image-2.1 は、プロンプトを少し変えるだけで透過画像も生成できます。
特殊なノードを挟む必要もなく、最初から Alpha Channel を持った RGBA 画像が出てきます。
透過画像を生成

以下の形でプロンプトを書きます。
This is an RGBA image with transparency. <ここに生成したいもののプロンプト>. The image has alpha channel and the background is transparent.
前後は決まり文句なので、そのままコピーして真ん中だけ差し替えれば大丈夫です。
透過情報を残すため、出力は PNG で保存してください。JPEG にすると、せっかくの Alpha Channel が消えてしまいます。

切り抜き
透過生成を画像編集に組み合わせると……そうです、切り抜きもできちゃうんですね。

先ほどのフォーマットで、切り抜きたいものを Extract 〇〇 と指示するだけです。


応用
パノラマ生成
好きな画像を参照に、2:1 の解像度で ERP として生成して、といえば、それだけで 360 度パノラマ画像ができてしまいます。お手軽すぎる…
カスタムノード
- nomadoor/ComfyUI-Panorama-Stickers
- 私が作っているものでちょっと宣伝になりますが、パノラマのプレビューや、パノラマ空間での撮影ができるノードがあります。よかったら導入してみてください。
元画像を参照しながら、横長 (2:1) の画像を生成します。
左右をキッチリ Outpainting するというよりは、パノラマ空間に自然に収まるように ERP 全体を描き直してもらうイメージです。
レイヤー分割
先ほどの 切り抜きでは、画像から好きなものだけを透過画像にできました。
なら、切り抜いたオブジェクトを画像から消し、次に手前にあるものをまた切り抜く。これを繰り返せば、1 枚の画像を手前から順番にレイヤー分けできるはずです。

ループ処理を使い、以下の処理を繰り返します。
- MLLM で、いま一番手前にありそうなものを選ぶ
- 選んだものだけを透過画像として切り抜く
- 逆に現在の画像から選んだものを消す
- 消したあとの画像を、次の iteration へ戻す

分割数を設定する
最初に、画像と分割したいレイヤー数を入力します。
ここを 5 にすると、手前から順に 4 枚を切り抜き、最後に残った背景と合わせて 5 枚になります。

次に切り抜くものを決める
Generate Text に現在の画像を見せ、次に切り抜くものを短いテキストで答えてもらいます。
残りのレイヤー数によって、どこまでを 1 枚として切り抜くべきかが変わるので、レイヤー数 - iteration_index もプロンプトに入れ、あと何枚に分ける予定なのかも MLLM に知らせます。
返ってきたオブジェクト名は、Format Text で Qwen-Image-2.1 への指示に組み込みます。
Generate Textノードに RGBA 画像を渡すとエラーになるため、Split Image with Alphaで Alpha 情報を取り除きます。

最前面オブジェクトの切り抜き
MLLM が選んだオブジェクトだけを、透過画像として切り抜きます。
やっていることは、上の 切り抜きと同じですね。
この画像を 1 枚のレイヤーとして End Loop へ渡します。

最前面オブジェクトの除去
レイヤー分けには、オブジェクトの切り抜きだけでなく、そのオブジェクトを取り除いた画像も必要です。
元画像と切り抜き画像をそのまま渡し、「これを消して」で済めばよかったんですが、うまくいかなかったため、切り抜いた領域を緑色で塗り、「緑の部分を自然に埋めてくれ」と指示しています。
こうしてオブジェクトを消した画像が、次に切り抜くための元画像になります。

最後は背景をそのまま出力する
この処理を繰り返していくと、最後には背景だけが残ります。
背景から何かを切り抜いたり、消したりする必要はありません。
そこで is_last と If/Else Switch を使い、最後の iteration だけ切り抜きと除去を通らず、現在の画像をそのまま出力します。
seed 値を固定にせず、わざわざ
iteration_indexにしているのはなんで?と思うかもしれません。
バグか仕様かはわかりませんが、一度編集した画像を同じ seed 値で再び編集すると、出力がガビガビになってしまうんですねぇ…。
seed 値さえ変われば大丈夫なので、ループごとに変わる値として、とりあえずの処置としてiteration_indexを入力しています。





