图片编辑:根据指令编辑或融合参考图
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-all \
--form 'prompt=把图1的人物放进图2的场景,参考图3的画风' \
--form 'image=<string>' \
--form image.items='@example-file'import requests
url = "https://api.apiyi.com/v1/images/edits"
files = { "image.items": ("example-file", open("example-file", "rb")) }
payload = {
"model": "gpt-image-2-all",
"prompt": "把图1的人物放进图2的场景,参考图3的画风",
"image": "<string>"
}
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-all');
form.append('prompt', '把图1的人物放进图2的场景,参考图3的画风');
form.append('image', '<string>');
form.append('image.items', '{
"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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": [
{
"b64_json": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"created": 1778037127,
"usage": {
"input_tokens": 98,
"output_tokens": 1185,
"total_tokens": 1283
}
}GPT-Image-2-All 生圖
圖片編輯 API 參考
gpt-image-2-all 圖片編輯 API 參考與線上除錯 — 上傳參考圖 + 指令進行單圖改圖或多圖融合
POST
/
v1
/
images
/
edits
图片编辑:根据指令编辑或融合参考图
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-all \
--form 'prompt=把图1的人物放进图2的场景,参考图3的画风' \
--form 'image=<string>' \
--form image.items='@example-file'import requests
url = "https://api.apiyi.com/v1/images/edits"
files = { "image.items": ("example-file", open("example-file", "rb")) }
payload = {
"model": "gpt-image-2-all",
"prompt": "把图1的人物放进图2的场景,参考图3的画风",
"image": "<string>"
}
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-all');
form.append('prompt', '把图1的人物放进图2的场景,参考图3的画风');
form.append('image', '<string>');
form.append('image.items', '{
"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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\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-all\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\n把图1的人物放进图2的场景,参考图3的画风\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": [
{
"b64_json": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"created": 1778037127,
"usage": {
"input_tokens": 98,
"output_tokens": 1185,
"total_tokens": 1283
}
}右側的互動式 Playground 支援直接上傳本地圖片。請在 Authorization 中填入你的 API Key(格式:
Bearer sk-xxx),選擇圖片與填入 prompt、model 後一鍵傳送即可。場景說明:本頁用於「基於一張或多張參考圖改圖 / 融合生成」。請求為
multipart/form-data 格式。如需純文本生成圖片,請使用 文生圖介面。🖥️ 瀏覽器 Playground 限制(預設 b64_json 模式)本端點預設
response_format: "b64_json",響應會包含數 MB 的 base64 字串,瀏覽器 Playground 可能彈出 請求時發生錯誤: unable to complete request ——實際請求已經成功,只是瀏覽器無法顯示這麼長的 base64。推薦做法:- 只想在 Playground 裡看圖:顯式傳
"response_format": "url",響應是單條 R2 連結,瀏覽器渲染正常。 - 想要 base64 或要傳超大參考圖:複製下方”程式碼示例”到本地執行,程式碼會自動處理上傳與解碼。
📎 多圖融合順序有意義
image 欄位可重複傳入多張參考圖,順序將作為 prompt 中「圖1/圖2/圖3」的引用依據。建議在 prompt 中顯式指代,例如:把圖1的人物放進圖2的場景,參考圖3的畫風推薦單張 ≤ 10MB,格式
png / jpg / webp,過大的圖可能觸發閘道限制。🎯 保形改圖小技巧:本端點的輸出尺寸跟隨 prompt 裡點名要修改的那張圖的比例——多圖場景下不一定是第一張。例如 prompt 寫”修改圖2,把圖2 的衣服和帽子改成圖1 裡的樣子”,那圖2 是 1:1,則輸出也是 1:1(即便圖1 是橫版 16:9)。對換裝、加帽子、修圖等保形場景特別好用。
size 欄位在本模型不生效(傳入靜默忽略,要嚴格鎖尺寸請用 gpt-image-2-vip);prompt 沒明確指代時由模型自行判斷。程式碼示例
Python
單圖編輯:import requests
API_KEY = "sk-your-api-key"
with open("photo.png", "rb") as f:
response = requests.post(
"https://api.apiyi.com/v1/images/edits",
headers={"Authorization": f"Bearer {API_KEY}"},
data={
"model": "gpt-image-2-all",
"prompt": "把背景換成海邊黃昏",
"response_format": "url"
},
files=[
("image", ("photo.png", f, "image/png"))
],
timeout=300 # 保守值,吸收長尾 + 圖片上傳/下載耗時
).json()
print(response["data"][0]["url"])
import requests
with open("ref1.png", "rb") as f1, \
open("ref2.png", "rb") as f2, \
open("ref3.png", "rb") as f3:
response = requests.post(
"https://api.apiyi.com/v1/images/edits",
headers={"Authorization": "Bearer sk-your-api-key"},
data={
"model": "gpt-image-2-all",
"prompt": "把圖1的人物放進圖2的場景,參考圖3的畫風",
"response_format": "b64_json"
},
files=[
("image", ("ref1.png", f1, "image/png")),
("image", ("ref2.png", f2, "image/png")),
("image", ("ref3.png", f3, "image/png"))
],
timeout=300 # 保守值,吸收長尾 + 圖片上傳/下載耗時
).json()
# 實測(2026-07)b64_json 為純 base64(無 data: 字首);歷史版本曾含字首,做個檢測最穩
import base64
b64 = response["data"][0]["b64_json"]
if b64.startswith("data:"):
b64 = b64.split(",", 1)[1]
with open("edited.png", "wb") as f:
f.write(base64.b64decode(b64))
cURL
單圖編輯:curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=gpt-image-2-all" \
-F "prompt=把背景換成海邊黃昏" \
-F "response_format=url" \
-F "image=@./photo.png"
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=gpt-image-2-all" \
-F "prompt=把圖1的人物放進圖2的場景,參考圖3的畫風" \
-F "response_format=b64_json" \
-F "image=@./ref1.png" \
-F "image=@./ref2.png" \
-F "image=@./ref3.png"
Node.js(原生 fetch + FormData)
import fs from 'node:fs';
const form = new FormData();
form.append('model', 'gpt-image-2-all');
form.append('prompt', '把背景換成太空');
form.append('response_format', 'url');
form.append(
'image',
new Blob([fs.readFileSync('./photo.png')]),
'photo.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();
console.log(data.data[0].url);
瀏覽器 JavaScript(File 物件)
// <input type="file" id="fileInput" multiple>
const files = document.getElementById('fileInput').files;
const form = new FormData();
form.append('model', 'gpt-image-2-all');
form.append('prompt', '把這幾張圖融合成一張海報');
form.append('response_format', 'url');
for (const f of files) form.append('image', f);
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();
document.getElementById('result').src = data[0].url;
引數說明速查
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
model | text | 是 | 固定填 gpt-image-2-all |
prompt | text | 是 | 改圖/融合的自然語言描述 |
image | file | 是 | 參考圖,可重複多次(陣列欄位) |
size | text | 否 | 本欄位不生效,傳入會被靜默忽略。輸出尺寸跟隨 prompt 裡點名要修改的那張圖的比例(多圖下不一定是第一張)。要嚴格鎖尺寸請用 gpt-image-2-vip |
response_format | text | 否 | b64_json(預設)或 url |
多輪迭代:把上一次的輸出圖片作為下一次的
image 輸入,配合新的編輯指令,可逐步精調畫面效果。響應格式
與文生圖介面一致:data[0] 中只會出現 url 或 b64_json 之一(取決於 response_format),不會兩者都返回。本端點預設返回 b64_json。
b64_json 模式(預設):
{
"data": [
{
"b64_json": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"created": 1778037127,
"usage": {
"input_tokens": 98,
"output_tokens": 1185,
"total_tokens": 1283
}
}
url 模式(需顯式 "response_format": "url"):
{
"data": [
{
"url": "https://r2cdn.copilotbase.com/r2cdn2/0e82148a-bec0-4b42-bbca-117c6b42581b.png"
}
],
"created": 1778037331,
"usage": {
"input_tokens": 30,
"output_tokens": 2074,
"total_tokens": 2104
}
}
2026-07 實測
b64_json 欄位為純 base64(不含 data: 字首),需解碼或自行拼接字首後使用;歷史版本曾直接帶字首。請先做 startsWith('data:') 檢測再處理,相容兩種形態。授權
在 API易控制台获取的 API Key
主體
multipart/form-data
模型名称,固定为 gpt-image-2-all
可用選項:
gpt-image-2-all 编辑/融合指令。多图场景可用「图1/图2/图3」指代 image 字段的上传顺序
範例:
"把图1的人物放进图2的场景,参考图3的画风"
参考图。单图直接传一次,多图重复传同名 image 字段(例如 -F [email protected] -F [email protected]),按上传顺序对应 prompt 中的「图1/图2/...」。推荐单张 ≤ 10MB,格式 png/jpg/webp。
响应格式。b64_json 返回已含 data URL 前缀的 base64 字符串(默认);url 返回 R2 CDN 链接
可用選項:
b64_json, url 這個頁面有幫助嗎?
⌘I