虚拟换装 API:用 GPT Image 2 替换服装
一张照片加一句提示词就能换装。下面是请求代码、我们在 2026 年 10 月 28 日跑的三次换装,以及结果会在哪里跑偏。
本页内容
可以,用一句文字提示就能换。GPT Image 2 的改图接口在一张照片上换了衣服。我们 2026 年 10 月 28 日跑的三次换装里,姿势、脸和背景都保持不变。它没有单独的服装输入,但加一张服装照片后,裙长跟着参考图变了。每张结果都要用眼睛检查。
请求就是 OmniaKey 媒体 API 的一次图片编辑:一张原图、一句提示词,再加可选的参考图。我们在 2026 年 10 月 28 日核对了下面的函数:提示词和代码里的样例不同,用的是一件黄色雨衣;发的是基础模特的一张 1024 像素 JPEG 图,返回的是 1024x1536 的 PNG。
改图能给试衣做什么,不能做什么
图片编辑从一张原图和一句提示词开始。操作名是 edit,原图以 Base64 内联发送,提示词写清要换的衣服。OmniaKey 的图片 API 文档(2026 年 10 月 28 日核对)还允许在 images 数组里放多张参考图。返回的是一张新图,所以衣服变了,人还留在原处:我们的几次跑图里,脸、姿势、头发和影棚背景都保持不变。
试衣有两个地方要留意:接口没有单独的服装字段,模型从你的描述或第二张照片里读衣服,再画出自己的版本;新图也会动到你没点名的细节。试衣功能应该把结果展示出来,让买家自己判断像不像。同一个操作也能做移除画面里的物体;如果主要是按指令改图,可以看FLUX Kontext 替代方案指南。
把照片和换装提示词发出去
向 https://api.omniakey.com/v1/media/tasks 发 POST,带上 Bearer key、JSON 请求体和 Idempotency-Key 头。OmniaKey 的图片 API 文档(2026 年 10 月 28 日核对)说创建任务返回 HTTP 202 和任务 id。任务状态是 queued 或 processing 时继续轮询任务地址。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 MiB 里。采样数必须是 1,接口固定返回不透明 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"] # 签名链接约一小时有效,先下载
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)
签名素材链接约一小时有效,文件保留 24 小时(同一份文档,2026 年 10 月 28 日核对)。任务成功后要马上下载。我们 2026 年 10 月 28 日核对时用的是黄色雨衣那句提示词,发的是基础模特的一张 1024 像素 JPEG 图,返回的是 1024x1536 的 PNG。脚本带了 User-Agent 头:Python 默认的 User-Agent 在我们这次调用里被 HTTP 403 拒绝,加上这个头就通过了。
我们跑的三次换装
三次换装都从同一张合成照片开始:一位穿白色圆领 T 恤和深蓝牛仔裤的女性,站在浅灰色纯色影棚里。原图 1024x1536,质量 medium,来自我们 2026 年 10 月 28 日的跑图。
第一次要红色缎面细吊带裙,裙摆到小腿中部。裙子出来了,姿势、脸、头发和背景都没变。白色运动鞋变成了白色细带高跟,这不是我们要求的。
第二次要深绿色羊毛西装外套,里面配米色真丝吊带,下身黑色直筒裤。三件都出现了,白色运动鞋保留。
第三次要海军蓝和白色横条纹长袖上衣,左胸有一个小小的红色刺绣爱心。条纹和爱心都落在左胸;深蓝牛仔裤和白色运动鞋保留。

这里的人物和场景都是合成的,每条提示词只跑了一次,所以每张图都是一个样本。
Generated with GPT-Image 2 via the OmniaKey API on October 28, 2026, size 1024x1536, quality medium.
把服装照片作为第二张参考图
想要更贴近,可以把衣服当第二张图发进去。我们把人物照放在第一位,平铺的红色缎面吊带裙放在第二位,用 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.
裙子落到地面,长度接近平铺照片。同一件裙子只用文字描述时,裙摆停在小腿中部。我们这一次的样本里,服装照片带出了文字没说清的长度。

哪里跑偏了
跑偏出现在提示词没写到的部分:吊带裙那次改了鞋,而提示词只写了裙子。给买家看之前,把脸、手、裙摆、鞋和图案放大检查一遍。带印花 logo 的服装、商品图上的精确面料花纹、超过两张参考图,这三样我们没有测试。
什么时候该用专门的试衣 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 字段,还有 1 到 4 的 sampleCount。模型 ID 是 virtual-try-on-001。页面还注明 Vertex AI 文档不再更新。
如果服装照片就是标准,而且一次要出多张样图,选这类接口;如果想把换装和其他编辑放在同一条流程里,选 GPT Image 2 的改图。普通改图一次出一张,Vertex 那页允许 1 到 4 张。
OpenAI 的定价页(2026 年 10 月 28 日核对)说 gpt-image-2 按 token 计费:页面列出的是 token 单价,没有单张价格表,并指向图像生成指南里的一个计算器。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.
- 衣服:一句话写清颜色、面料和长度。“A red satin slip dress with thin straps that falls to mid-calf”带来了清楚的换装。
- 锁定项:姿势、脸、头发、身体、背景、光线。把这些逐项写进提示词。
- 收尾:写“Photorealistic, no text, no logos.”,我们几次提示词都用了这个结尾。
- 鞋子:必须保留就点名,例如“keep the white sneakers”。吊带裙那次没写鞋,鞋就变了。
长度比文字更重要时,加第二张图:人物放第一,衣服放第二。提示词里用“the first image”和“the second image”指代,就像我们那次一样。提示词的整体顺序,可以看GPT Image 2 提示词指南。
常见问题
GPT Image 2 API 有专门的虚拟试衣接口吗?
没有。OmniaKey 的模型页(2026 年 10 月 28 日核对)列出文生图和图片编辑。我们几次跑图里,试衣就是一次编辑:一句文字提示,外加一张可选的参考图。
可以发服装照片吗?
可以,放在 input.images 里当第二张参考图。我们 2026 年 10 月 28 日那次跑图,裙长跟着平铺照片变了。
脸会保持不变吗?
我们三次换装和两张参考图那次,用眼睛看都保持了。每张结果都要放大检查。
结果链接能放多久?
约一小时(OmniaKey 图片 API 文档,2026 年 10 月 28 日核对),文件保留 24 小时。任务成功后马上下载。
该请求多大尺寸?
size 写成 WIDTHxHEIGHT,例如 1024x1536,再从下载的 PNG 里读实际尺寸。我们几次跑图都用 1024x1536、质量 medium。
先拿一张照片和一句换装提示词开始。GPT Image 2 页面介绍模型,当前价格单独列出。
