バーチャル試着 API:GPT Image 2 で服を着せ替える
写真 1 枚とプロンプト 1 つで服を変えられます。リクエストのコード、2026 年 10 月 28 日に実行した 3 回の着せ替え、そして結果がどこでずれるかを示します。
このページの内容
はい、テキストプロンプトだけでできます。GPT-Image 2 の編集エンドポイントは、2026 年 10 月 28 日に実行した 3 回の着せ替えで、1 枚の写真の服だけを変え、ポーズ、顔、背景はそのまま保ちました。専用の服装入力はありませんが、今回の実行では 2 枚目の服の写真でドレスの丈が変わりました。結果は毎回、目で確認してください。
リクエストは OmniaKey のメディア API に対する画像編集です。元写真 1 枚、プロンプト、そして任意の参照画像を送ります。以下の関数は 2026 年 10 月 28 日に、プロンプトだけ変えて(黄色いレインコート)ベースモデルの 1024 ピクセル JPEG で確認し、1024x1536 の PNG が返りました。
画像編集で試着にできること、できないこと
画像編集は元写真とプロンプトから始まります。操作は edit で、元写真は Base64 のインライン、プロンプトには新しい服を書きます。OmniaKey の画像 API ドキュメント(2026 年 10 月 28 日確認)では、images 配列に複数の参照画像を入れられます。返るのは新しい 1 枚なので、人物はそのままで服だけが変わります。今回の実行では、顔、ポーズ、髪、スタジオ背景が保たれました。
試着で効いてくる制約は 2 つです。服装だけを入れる専用フィールドはないので、モデルは説明か 2 枚目の写真から服を描きます。また、指定していない細部まで新しい画像で変わる可能性があります。試着機能は結果を見せて、購入者が似合いを判断できるようにするのがよいでしょう。同じ操作は画面から物体を消す作業にも使えます。指示による編集全般はFLUX Kontext の代替ガイドを参照してください。
写真と服のプロンプトを送る
https://api.omniakey.com/v1/media/tasks に POST を送ります。Bearer キー、JSON ボディ、Idempotency-Key ヘッダーを付けます。OmniaKey の画像 API ドキュメント(2026 年 10 月 28 日確認)によると、作成時は HTTP 202 とタスク id が返ります。ステータスが queued か processing の間はタスク URL をポーリングします。succeeded なら素材の準備完了、失敗したタスクは error.code と error.message を持ち、課金されません。
タスクのフィールドは次のように設定します:
| フィールド | 値 |
|---|---|
model | gpt-image-2 |
type | image |
operation | edit |
input.prompt | 服の指示 |
input.image | 元写真を data と mime_type のオブジェクトで |
input.images | 追加の参照写真 |
parameters.size | WIDTHxHEIGHT |
parameters.quality | low、medium、high、auto |
parameters.n | 1 |
リクエストは 1 MiB 未満に抑えます。インライン Base64 もこの上限に含まれるためです。サンプル数は 1 である必要があり、API は常に不透明な PNG を返すので、実際の寸法はダウンロードしたファイルから読み取ります。
関数は次のとおりです:
import base64
import json
import os
import time
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def edit_image(source_path, prompt, out_path, size="1024x1536", quality="medium"):
with open(source_path, "rb") as f:
image = base64.b64encode(f.read()).decode()
body = {
"model": "gpt-image-2",
"type": "image",
"operation": "edit",
"input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
"parameters": {"size": size, "quality": quality},
}
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
for _ in range(150):
time.sleep(4)
state = request("GET", f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # 署名付きリンクは約 1 時間有効なので、すぐダウンロードする
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
if __name__ == "__main__":
task = edit_image(
"vto-base.jpg",
"Change the outfit: she now wears a red satin slip dress with thin straps that falls to mid-calf. Keep the same pose, face, hair, body, the plain light-gray studio background and the lighting exactly as they are. Photorealistic, no text, no logos.",
"vto-slip.png",
size="1024x1536",
)
print("task", task)
署名付きの素材 URL は約 1 時間有効で、ファイルは 24 時間保持されます(同じドキュメント、2026 年 10 月 28 日確認)。タスクが成功したらすぐにダウンロードしてください。2026 年 10 月 28 日の確認では、黄色いレインコートのプロンプトをベースモデルの 1024 ピクセル JPEG に使い、1024x1536 の PNG が返りました。スクリプトは User-Agent ヘッダーを送ります。今回の実行では Python の既定値が HTTP 403 で拒否され、ヘッダーを足すと通りました。
実行した 3 回の着せ替え
3 回とも同じ合成写真から始めました。白いクルーネック T シャツと濃紺のジーンズを着た女性が、無地の薄いグレーのスタジオに立つ写真です。2026 年 10 月 28 日の実行では、1024x1536、品質 medium で作りました。
1 回目は、ふくらはぎ丈で、細いストラップが付いた赤いサテンのスリップドレスを指定しました。ドレスは出て、ポーズ、顔、髪、背景は同じままでした。頼んでいないのに、白いスニーカーが白いストラップ付きヒールに変わりました。
2 回目は、クリーム色のシルクキャミソールの上に濃い緑のウールブレザー、黒のストレートパンツを指定しました。3 点とも現れ、白いスニーカーは残りました。
3 回目は、紺と白の横縞の長袖トップスで、左胸に小さな赤い刺しゅうハートを指定しました。縞とハートは左胸に収まり、濃紺のジーンズと白いスニーカーは残りました。

ここに登場する人物と場面はすべて合成で、各プロンプトは 1 回だけ実行したので、画像はどれも 1 サンプルです。
2026 年 10 月 28 日に OmniaKey API 経由の GPT-Image 2 で生成。サイズ 1024x1536、品質 medium。
服の写真を 2 枚目の参照にする
より近づけたいときは、服を 2 枚目の画像として送ります。人物写真を 1 枚目、平置きした赤いサテンのスリップドレスを 2 枚目に置き、input.images と次のプロンプトを使いました。"Dress the woman in the first image in the red satin slip dress shown in the second image. Keep her pose, face, hair, body, the plain light-gray studio background and the lighting exactly as they are. Photorealistic, no text, no logos."
ドレスは床まで届き、平置き写真の丈に近づきました。同じドレスをテキストだけで指定した版は、ふくらはぎ丈で止まりました。今回の 1 サンプルでは、言葉で曖昧だった丈を服の写真が補いました。

どこがずれたか
ずれはプロンプトに書かなかった部分に出ました。スリップドレスの回では、プロンプトがドレスだけを指定したのに靴が変わりました。購入者に見せる前に、顔、手、裾、靴、柄を原寸で確認してください。プリントロゴのある服、商品写真の正確な生地柄、3 枚以上の画像はテストしていません。
専用の試着 API が向く場合
専用の試着 API は、人物と服を別々の入力として受け取ります。Google の Vertex AI ページ「Generate Virtual Try-On Images」(最終更新 2026 年 10 月 26 日、2026 年 10 月 28 日確認)にはこうあります。"You provide an image of a person and an image of a clothing product." 同じページには personImage と productImages が Base64 フィールドとして、sampleCount が 1 から 4 として、モデル ID virtual-try-on-001 が載っています。Vertex AI のドキュメントは今後更新されないという注記もあります。
服の写真が正解で、1 回のリクエストに複数サンプルが必要なら、この種のエンドポイントを選びます。着せ替えとその他の編集を 1 つのパイプラインにまとめたいなら、1 回 1 枚でも GPT-Image 2 の編集を選びます。
OpenAI の料金ページ(2026 年 10 月 28 日確認)によると、gpt-image-2 はトークン単位で課金されます。ページにはトークン料金が載り、画像 1 枚ごとの表はなく、画像生成ガイド内の計算ツールへ誘導されています。OmniaKey の現在の料金は料金ページにあります。
着せ替え用プロンプトのテンプレート
今回の実行でうまくいった形を使います。服を先に書き、人物とセットを固定します。
Change the outfit: she now wears [garment, colour, fabric, length]. Keep the same pose, face, hair, body, the plain light-gray studio background and the lighting exactly as they are. Photorealistic, no text, no logos.
- 服:色、素材、丈を 1 文で。「A red satin slip dress with thin straps that falls to mid-calf」で明確に変わりました。
- 固定する項目:ポーズ、顔、髪、体、背景、照明。プロンプトに明示して列挙します。
- 仕上げ:「Photorealistic, no text, no logos.」今回のプロンプトはこの終わり方を使いました。
- 靴:残す必要があるなら名指しします。例えば「keep the white sneakers」です。スリップドレスの回は靴に触れず、靴が変わりました。
丈が言葉より大事なら、2 枚目の画像を足します。人物を 1 枚目、服を 2 枚目に置き、プロンプトでは「the first image」と「the second image」で参照します。今回と同じやり方です。プロンプト全体の順序はGPT Image 2 プロンプトガイドを参照してください。
よくある質問
GPT Image 2 API に専用のバーチャル試着エンドポイントはありますか?
いいえ。OmniaKey のモデルページ(2026 年 10 月 28 日確認)にはテキストから画像と画像編集が載っています。今回の実行では、試着はテキストプロンプトと任意の 2 枚目の画像を使った編集でした。
服の写真は送れますか?
送れます。input.images の 2 枚目の参照画像として入れます。2026 年 10 月 28 日の実行では、平置き写真に合わせてドレスの丈が変わりました。
顔は同じままですか?
3 回の着せ替えと 2 枚参照の実行では、目視で同じでした。結果はどれも原寸で確認してから見せてください。
結果のリンクはどのくらい有効ですか?
約 1 時間です(OmniaKey の画像 API ドキュメント、2026 年 10 月 28 日確認)。ファイルは 24 時間保持されます。タスクが成功したらすぐダウンロードしてください。
どのサイズを指定すればよいですか?
size は WIDTHxHEIGHT で指定します。例えば 1024x1536 です。実際の寸法はダウンロードした PNG から読み取ります。今回の実行は 1024x1536、品質 medium でした。
まずは写真 1 枚と服のプロンプト 1 つから始めてください。GPT-Image 2 のページではモデルを、現在の料金は別途確認できます。
この記事で紹介しているモデル
関連記事
GPT Image 2 プロンプトガイド:構成・例文・実際の生成画像
8 つのプロンプトと 9 枚の実画像。GPT Image 2 が正確に再現した点、勝手に足した点、直し方をまとめます。
FLUX Kontext APIの代替:GPT Image 2で写真を指示どおりに編集
マスクなしの指示編集。リクエストのコード、2026年10月28日に3段階で回した連続編集、そして各ステップで残ったものを書きます。
物体削除API:GPT Image 2で写真から人物やゴミ箱を消す
物体ごとに一文を送るだけで、3つの削除はすべてうまくいきました。実行したコード、原寸の結果、まだ任せきれない部分を紹介します。
