가상 피팅 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 키, 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으로 거부됐고, 헤더를 더하니 통과했습니다.
실행한 세 번의 의상 교체
세 번 모두 같은 합성 사진에서 시작했습니다. 흰 크루넥 T셔츠와 짙은 청바지를 입은 여성이 무지 연회색 스튜디오에 서 있는 사진으로, 2026년 10월 28일 실행에서 1024x1536, 품질 medium으로 만들었습니다.
1번은 종아리 중간까지 오는 가는 끈의 빨간 새틴 슬립 드레스를 요청했습니다. 드레스가 나왔고 포즈, 얼굴, 머리, 배경은 그대로였습니다. 요청하지 않았는데 흰 스니커즈가 흰 스트랩 힐로 바뀌었습니다.
2번은 크림색 실크 캐미솔 위에 짙은 초록 울 블레이저, 아래에 검은 일자 바지를 요청했습니다. 세 가지가 모두 나왔고 흰 스니커즈는 남았습니다.
3번은 왼쪽 가슴에 작은 빨간 자수 하트가 있는 네이비와 흰색 가로 줄무늬 긴팔 상의를 요청했습니다. 줄무늬와 하트는 왼쪽 가슴에 들어갔고 짙은 청바지와 흰 스니커즈는 남았습니다.

여기 나오는 인물과 장면은 모두 합성이며 각 프롬프트를 한 번만 실행했으므로 이미지는 모두 표본 하나입니다.
2026년 10월 28일 OmniaKey API를 통해 GPT-Image 2로 생성. 크기 1024x1536, 품질 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."
드레스는 바닥까지 내려와 평면 사진의 길이에 가까워졌습니다. 같은 드레스를 텍스트로만 지정한 버전은 종아리 중간에서 멈췄습니다. 이번 표본 하나에서는 말로 남겨 둔 길이를 의상 사진이 채웠습니다.

어디서 어긋났나
어긋남은 프롬프트에서 빼먹은 부분에 나타났습니다. 슬립 드레스 차례에서는 프롬프트가 드레스만 지정했는데 신발이 바뀌었습니다. 구매자에게 보여 주기 전에 얼굴, 손, 밑단, 신발, 패턴을 원본 크기로 확인하세요. 인쇄 로고가 있는 의상, 상품 사진의 정확한 원단 무늬, 이미지 세 장 이상은 테스트하지 않았습니다.
전용 가상 피팅 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 문서는 더 이상 업데이트되지 않는다는 안내도 있습니다.
의상 사진이 기준이고 요청마다 여러 표본이 필요하면 그런 엔드포인트를 고릅니다. 의상 교체와 다른 편집을 한 파이프라인에 담는 것이 호출당 표본 수보다 중요하면 GPT-Image 2 편집을 고릅니다.
OpenAI 가격 페이지(2026년 10월 28일 확인)에 따르면 gpt-image-2는 토큰으로 과금됩니다. 페이지에는 토큰 요율이 있고 이미지당 가격표는 없으며, 이미지 생성 가이드의 계산기로 안내합니다. 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일 실행에서는 평면 사진에 맞춰 드레스 길이가 바뀌었습니다.
얼굴은 그대로인가요?
세 번의 교체와 두 장 참조 실행에서는 눈으로 볼 때 그대로였습니다. 결과는 모두 원본 크기로 확인한 뒤 보여 주세요.
결과 링크는 얼마나 유지되나요?
약 1시간입니다(OmniaKey 이미지 API 문서, 2026년 10월 28일 확인). 파일은 24시간 보관됩니다. 작업이 성공하면 바로 내려받으세요.
어떤 크기를 요청해야 하나요?
size는 WIDTHxHEIGHT로 지정합니다. 예를 들어 1024x1536입니다. 실제 크기는 내려받은 PNG에서 읽으세요. 이번 실행은 1024x1536, 품질 medium을 썼습니다.
사진 한 장과 의상 프롬프트 하나로 시작하세요. 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로 사진 속 원치 않는 객체 지우기
객체마다 문장 하나면 세 번의 제거가 모두 성공했습니다. 실행한 코드, 원본 크기 결과, 아직 맡기기 어려운 부분을 소개합니다.
