curl --request POST \
--url https://api.apiyi.com/v1/images/edits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form model=gpt-image-2.5-sunburst \
--form 'prompt=Place subject from image 1 into scene from image 2, using color style from image 3' \
--form 'image=@example-file;type=image/png' \
--form 'mask=@example-file;type=image/png'import requests
url = "https://api.apiyi.com/v1/images/edits"
files = {
"image": ("example-file", open("example-file", "rb"), "image/png"),
"mask": ("example-file", open("example-file", "rb"), "image/png")
}
payload = {
"model": "gpt-image-2.5-sunburst",
"prompt": "Place subject from image 1 into scene from image 2, using color style from image 3"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('model', 'gpt-image-2.5-sunburst');
form.append('prompt', 'Place subject from image 1 into scene from image 2, using color style from image 3');
form.append('image', '<string>');
form.append('mask', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.apiyi.com/v1/images/edits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.apiyi.com/v1/images/edits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.apiyi.com/v1/images/edits"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.apiyi.com/v1/images/edits")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apiyi.com/v1/images/edits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"created": 1776832476,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"usage": {
"input_tokens": 1280,
"output_tokens": 6240,
"total_tokens": 7520
}
}이미지 편집 API 레퍼런스
gpt-image-2.5-sunburst / gpt-image-2.5-flare / gpt-image-2 이미지 편집 API 레퍼런스 및 실시간 테스트 — 참조 이미지(최대 16개) + 단일 이미지 편집, 여러 이미지 융합 또는 마스크 인페인팅을 위한 지침 업로드
curl --request POST \
--url https://api.apiyi.com/v1/images/edits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form model=gpt-image-2.5-sunburst \
--form 'prompt=Place subject from image 1 into scene from image 2, using color style from image 3' \
--form 'image=@example-file;type=image/png' \
--form 'mask=@example-file;type=image/png'import requests
url = "https://api.apiyi.com/v1/images/edits"
files = {
"image": ("example-file", open("example-file", "rb"), "image/png"),
"mask": ("example-file", open("example-file", "rb"), "image/png")
}
payload = {
"model": "gpt-image-2.5-sunburst",
"prompt": "Place subject from image 1 into scene from image 2, using color style from image 3"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('model', 'gpt-image-2.5-sunburst');
form.append('prompt', 'Place subject from image 1 into scene from image 2, using color style from image 3');
form.append('image', '<string>');
form.append('mask', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.apiyi.com/v1/images/edits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.apiyi.com/v1/images/edits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.apiyi.com/v1/images/edits"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.apiyi.com/v1/images/edits")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apiyi.com/v1/images/edits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\ngpt-image-2.5-sunburst\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nPlace subject from image 1 into scene from image 2, using color style from image 3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mask\"; filename=\"example-file\"\r\nContent-Type: image/png\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"created": 1776832476,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"usage": {
"input_tokens": 1280,
"output_tokens": 6240,
"total_tokens": 7520
}
}Bearer sk-xxx), 이미지 / 마스크 파일을 선택한 다음 prompt 및 model를 입력하고 전송합니다.multipart/form-data입니다. 순수한 텍스트-이미지 생성에는 텍스트-이미지 엔드포인트를 사용합니다.请求时发生错误: unable to complete request가 표시될 수 있습니다. — 요청은 실제로 성공한 것입니다. 브라우저에서 이렇게 긴 base64 문자열을 렌더링하지 못할 뿐입니다.권장 워크플로(초보자에게 적합):- 아래의 Python / Node.js / cURL 샘플을 복사하여 로컬에서 실행합니다. 코드가 응답을 자동으로
base64.b64decode하고 이미지를 파일에 기록합니다. - 브라우저 내 플레이그라운드를 반드시 사용해야 한다면 **매우 작은 참조 이미지(< 50KB)**를 사용하고,
size을 가장 작은 등급(예:1024x1024)으로 설정한 다음quality을low로 설정합니다.
input_fidelity을 전달하지 마십시오 — 세 모델 모두 고충실도를 강제하므로 전달하면 400 오류가 반환됩니다(2026-09-09에 2.5에서 검증됨).- 편집 요청은 입력 token이 눈에 띄게 더 많습니다 — 비전 과금을 통해 참조 이미지가 많은 token으로 변환되므로 이에 맞게 예산을 책정해야 합니다.
- 다중 이미지 융합: 최대 16개 —
image[]필드를 반복 사용하십시오. 16개를 초과하면 오류가 발생합니다.
image[] 필드는 여러 참조 이미지를 허용합니다. 업로드 순서는 프롬프트의 “이미지 1 / 이미지 2 / 이미지 3” 참조에 매핑됩니다. 다음과 같이 명시적으로 참조하십시오.이미지 1의 피사체를 이미지 2의 장면에 배치하고, 이미지 3의 색상 스타일을 사용합니다.파일별 제한: 각 파일 50MB 미만(multipart 파일 업로드), 형식:
png / jpg / webp. 업로드하기 전에 실제로는 1.5MB 이내로 압축하십시오(아래의 “업로드 크기 제한” 참조).코드 예제
Python (OpenAI SDK · 단일 이미지 편집)
from openai import OpenAI
import base64
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.apiyi.com/v1"
)
resp = client.images.edit(
model="gpt-image-2.5-sunburst",
image=open("photo.png", "rb"),
prompt="Replace the background with a seaside sunset, preserve subject details",
size="1536x1024",
quality="high"
)
# b64_json is raw base64 (no prefix) — decode manually
with open("edited.png", "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))
Python (OpenAI SDK · 다중 이미지 융합)
resp = client.images.edit(
model="gpt-image-2.5-sunburst",
image=[
open("person.png", "rb"),
open("scene.png", "rb"),
open("style.png", "rb"),
],
prompt="Place subject from image 1 into scene from image 2, using color style from image 3, keep lighting consistent",
size="1536x1024",
quality="high"
)
with open("fused.png", "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))
cURL (다중 이미지 융합)
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=gpt-image-2.5-sunburst" \
-F "prompt=Place subject from image 1 into scene from image 2, using color style from image 3" \
-F "size=1536x1024" \
-F "quality=high" \
-F "image[][email protected]" \
-F "image[][email protected]" \
-F "image[][email protected]"
cURL (마스크 인페인팅)
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=gpt-image-2.5-sunburst" \
-F "prompt=Replace the sky with pink sunset clouds" \
-F "size=1024x1024" \
-F "quality=high" \
-F "image[][email protected]" \
-F "[email protected]" \
| jq -r '.data[0].b64_json' | base64 -d > photo_edited.png
Node.js (네이티브 fetch + FormData · 다중 이미지 융합)
import fs from 'node:fs';
const form = new FormData();
form.append('model', 'gpt-image-2.5-sunburst');
form.append('prompt', 'Place subject from image 1 into scene from image 2');
form.append('size', '1536x1024');
form.append('quality', 'high');
form.append('image[]', new Blob([fs.readFileSync('./person.png')]), 'person.png');
form.append('image[]', new Blob([fs.readFileSync('./scene.png')]), 'scene.png');
const resp = await fetch('https://api.apiyi.com/v1/images/edits', {
method: 'POST',
headers: { 'Authorization': 'Bearer sk-your-api-key' },
body: form
});
const { data } = await resp.json();
fs.writeFileSync('fused.png', Buffer.from(data[0].b64_json, 'base64'));
파라미터 레퍼런스
| 필드 | 타입 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
model | text | 예 | — | gpt-image-2.5-sunburst(편집 정밀도 우선, 편집 작업 추천 모델) / gpt-image-2.5-flare(속도 우선) / gpt-image-2(이전 세대, 계속 사용 가능). 프로덕션 환경에서는 날짜가 지정된 스냅샷 gpt-image-2.5-sunburst-2026-09-08 / gpt-image-2.5-flare-2026-09-08을 고정하여 사용하십시오. 세 모델 모두 가격과 파라미터가 동일합니다 |
prompt | text | 예 | — | 편집 / 합성 지시어 |
image[] | file | 예 | — | 참조 이미지, 여러 개 지정 가능(최대 16개) |
mask | file | 아니요 | — | 마스크 이미지(첫 번째 이미지에만 적용되며, 알파 채널 필수) |
size | text | 아니요 | auto | 출력 크기, 텍스트-이미지 생성과 동일 |
quality | text | 아니요 | auto | low / medium / high / xhigh / max / auto. xhigh / max는 2.5에서 새로 추가되었으며, gpt-image-2는 high까지만 지원합니다 |
output_format | text | 아니요 | png | png / jpeg / webp |
output_compression | text | 아니요 | — | 0–100, jpeg / webp 전용 |
background | text | 아니요 | auto | transparent / opaque / auto. transparent은 두 2.5 모델에서만 작동하며(OpenAI는 2026-09-30부터 gpt-image-2에서 400 오류를 반환하며 이를 거부함), output_format은 png 또는 webp이어야 합니다. 편집 엔드포인트에서의 투명도 처리는 정밀한 외곽선 추출(cutout)이 아닌 재그리기(re-draw) 방식임에 유의하십시오. 자세한 내용은 투명 배경 FAQ를 참고하십시오 |
quality에 기존 DALL·E 값인 standard / hd를 전달하지 마십시오. 공식 열거형 값인 low / medium / high / xhigh / max / auto 6개만 허용됩니다(xhigh / max는 두 2.5 모델에서만 지원). 기존 레거시 값은 백엔드 채널에 따라 일관되지 않게 동작합니다. 때로는 400 오류(invalid_value)와 함께 즉시 실패하며, 때로는 경고 없이 무시되어 요청이 auto로 실행될 수 있습니다(예측할 수 없는 비용 발생). 항상 공식 값 중 하나를 명시적으로 전달하십시오.업로드 크기 제한
| 항목 | 제한 | 비고 |
|---|---|---|
| 참조 이미지 수 | 최대 16개 | image[] 필드를 반복합니다 |
| 이미지당(multipart 파일 업로드) | 각 50MB 미만 | 형식: png / jpg / webp |
| 이미지당(base64 data URL) | 필드 길이 약 20MiB | 이는 URL/base64 문자열 필드(schema maxLength: 20971520)의 길이 제한이며, 50MB multipart 상한과는 다릅니다. base64는 크기를 약 1/3 늘리므로 원본 이미지는 15MB 이내로 유지하십시오 |
| 마스크 파일 | 4MB 미만 PNG | 원본 이미지의 크기와 정확히 일치해야 하며, 알파 채널이 있어야 합니다 |
참조 이미지 형식 요구사항 및 전처리
/v1/images/edits은 png / jpg / webp 표준 형식만 허용합니다. 다음과 같은 400 오류를 받는 경우:
{
"error": {
"message": "Invalid image file or mode for image 1, please check your image file. ...",
"type": "shell_api_error",
"code": "invalid_image_file"
}
}
.jpg Huawei Mate 시리즈 휴대폰에서 바로 나온 파일은 HDR gain-map 하위 프레임을 포함하며 실제로는 MPO입니다. 이러한 파일은 동일한 FFD8 헤더로 시작합니다. 즉, 확장자와 file 명령 모두 JPEG라고 보고하므로 육안으로는 구분할 수 없습니다. 프레임을 인식하는 파싱(예: Pillow)만 이를 판별할 수 있습니다. 오류의 “image 1”은 N번째 참조 이미지(1부터 시작하는 인덱스)를 의미하므로, 인덱스를 사용해 문제 파일을 찾으십시오.
Image.open(f).format이 "MPO"을 반환하면 파일을 변환해야 합니다. 업로드 파이프라인에 한 번의 재인코딩 단계를 넣으면 HEIC 및 기타 휴대폰 형식도 함께 처리할 수 있습니다.
from PIL import Image
import io
def normalize_image(path: str) -> bytes:
"""Convert phone photos (MPO/HDR multi-frame etc.) to standard JPEG that passes edits validation"""
im = Image.open(path)
im.load() # for MPO, keeps only the first (full-size) frame
if im.mode not in ("RGB", "RGBA"):
im = im.convert("RGB")
out = io.BytesIO()
im.save(out, format="JPEG", quality=92) # or format="PNG"
return out.getvalue()
마스크 인페인팅 요구사항
- 원본과 동일한 크기여야 하며, PNG 형식이고, 4MB 미만이어야 합니다.
- 알파 채널이 있어야 합니다: 투명(알파=0) = 인페인트 영역, 불투명 = 유지
- 마스크는 첫 번째 이미지에만 적용됩니다
- 마스크는 “부드러운 가이드”입니다 — 모델이 마스크된 영역 주변을 확장하거나 축소할 수 있습니다
image[]로 다시 전달하고, 점진적으로 정교화하는 새 지시를 추가합니다. 각 라운드는 독립적으로 token 기준 과금됩니다 — 누적 비용을 주의하십시오.Response Format
{
"created": 1776832476,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"usage": {
"input_tokens": 848,
"input_tokens_details": {
"image_tokens": 832,
"text_tokens": 16
},
"output_tokens": 196,
"output_tokens_details": {
"image_tokens": 196,
"text_tokens": 0
},
"total_tokens": 1044
}
}
b64_json is raw base64, without the data:image/...;base64, prefix — different from gpt-image-2-all. Decode it client-side to write a file, or prepend the prefix for browser rendering.input_tokens are typically significantly higher than text-to-image at the same size, because reference images are billed per Vision pricing rules — the exact amount is available directly in usage.input_tokens_details.image_tokens, tracked separately from the text portion (text_tokens). Multi-image fusion increases image_tokens strictly linearly per additional reference image (verified July 2026: 4 × 1024² images = 4 × 1024 tokens) — see How Multiple Input Images Affect the Price for the measurement table. See How to check the real token count for each call on the overview page for the full field reference.인증
API Key obtained from APIYI Console
본문
Model name. gpt-image-2.5-flare (speed-first) / gpt-image-2.5-sunburst (quality- and editing-first) / gpt-image-2 (previous generation) share the same price and parameters; pin a dated snapshot in production
gpt-image-2.5-flare, gpt-image-2.5-sunburst, gpt-image-2, gpt-image-2.5-flare-2026-09-08, gpt-image-2.5-sunburst-2026-09-08 Edit/fusion instruction, up to 32,000 characters (provider limit, counted in characters). For multi-image, use 'image 1 / image 2 / image 3' to reference upload order
32000"Place subject from image 1 into scene from image 2, using color style from image 3"
Reference images. For a single image, send the field once; for multiple images, repeat the same image field (e.g., -F [email protected] -F [email protected], max 16) — upload order maps to image 1 / image 2 / ... in the prompt. multipart file upload: each under 50MB, formats: png/jpg/webp; compress to within 1.5MB in practice
Mask image (optional, only applies to first image). Requirements:
- Same size as original
- PNG format, under 4MB
- Must have alpha channel (alpha=0 = inpaint area, opaque = preserve)
Output size (same as text-to-image). Preset or constraint-satisfying custom size
"1536x1024"
Quality tier. xhigh / max are new in 2.5 and rejected by gpt-image-2
auto, low, medium, high, xhigh, max Output format
png, jpeg, webp Output compression (0–100), only effective for jpeg/webp
0 <= x <= 100Background mode. auto (default) / opaque / transparent. transparent requires png or webp (jpeg has no alpha channel)
auto, opaque, transparent 이 페이지가 도움이 되었나요?