OpenAI · 图片编辑
通过输入图片和提示词进行修改;模型支持情况须核实。
POST
/v1/images/edits查看候选模型 ID
没有符合条件的模型。请调整筛选或重置。
| 模型 ID | 厂商 | 类型 | 说明 | 上下文窗口 | 最大输出 Token | 媒体规格 | 价格 | 状态 |
|---|---|---|---|---|---|---|---|---|
| 暂无模型资料 | ||||||||
按公开标签归类,并补充模型广场资料;— 表示暂无明确资料。左右滑动查看完整表格。
Headers请求头
左右滑动查看完整参数表
| 参数名 | 类型 | 必填 | 说明 | 默认值 / 示例 |
|---|---|---|---|---|
Authorization | string | 必填 | 平台 API Key,使用 Bearer 认证。 | |
Content-Type | string | 必填 | 请求体编码格式。上传文件时由 HTTP 客户端自动添加 boundary,请勿手动固定此请求头。 |
Request Body请求体
multipart/form-data左右滑动查看完整参数表
| 参数名 | 类型 | 必填 | 说明 | 默认值 / 示例 |
|---|---|---|---|---|
image | file | array<file> | 必填 | 需要编辑的图片文件。旧版模型通常要求 PNG、小于 4 MB 且为方形;其他模型的数量、格式与大小限制以实际能力为准。 | |
mask | file | 可选 | 可选遮罩图片;透明区域标记编辑位置,尺寸应与输入图片一致。 | |
model | string | 可选 | 模型 ID;请替换为账户可用且支持当前接口的模型。 | |
prompt | string | 必填 | 描述希望如何修改图片;文本长度限制因模型而异。 | — |
n | integer | 可选 | 生成数量;需模型支持。 | — |
size | string | 可选 | 输出尺寸,例如 1024x1024;需模型支持。 | — |
response_format | string | 可选 | 响应图片的表示形式;需模型支持。 可选值 urlb64_json | — |
user | string | 可选 | 应用内终端用户标识。 | — |
quality | string | 可选 | 输出质量;仅部分模型支持。 | — |
background | string | 可选 | 背景透明度;仅部分模型支持。 可选值 autotransparentopaque | — |
output_format | string | 可选 | 输出图片格式;仅部分模型支持。 可选值 pngjpegwebp | — |
input_fidelity | string | 可选 | 保留输入图片细节的程度;仅部分模型支持。 | — |
使用说明
- 以 multipart/form-data 上传本地图片,Content-Type 和 boundary 由客户端生成。
- image、mask 的格式、尺寸、文件大小与可上传张数依模型而定;旧版限制不能推广到所有图像模型。
- 返回值可能是图片 URL 或 Base64;下方为结构说明样例。
生成与编辑
| 用途 | 请求格式 | 输入 |
|---|---|---|
| 生成 /v1/images/generations | application/json | 以 prompt 描述新图片 |
| 编辑 /v1/images/edits | multipart/form-data | 上传 image 文件,并用 prompt 描述修改 |
编辑接口的 mask、透明区域规则、多图字段及文件规格由具体模型决定。使用 multipart 时让客户端生成 Content-Type 和 boundary。图片数量、尺寸、格式和单文件大小按所选模型的说明填写。
保存 URL 或 Base64 图片结果
读取 data[].url 下载图片,或将 data[].b64_json 解码为二进制。URL 可能有有效期,收到后及时保存。下方示例按文件头识别 PNG、JPEG、WebP,其他编码保存为 .bin;完整写入临时文件后再替换目标文件。
展开 Python:提交请求并保存图片
# 安装依赖:python -m pip install requests
import base64
import json
import os
from pathlib import Path
from urllib.parse import quote
import requests
BASE_URL = "https://ai.kedang.net"
MODEL_ID = "MODEL_ID" # 替换为账户可用、支持当前能力的模型
def request_json(path, body, extra_headers=None):
headers = {"Authorization": "Bearer " + os.environ["KEDANG_API_KEY"]}
headers.update(extra_headers or {})
response = requests.post(BASE_URL + path, headers=headers, json=body, timeout=120)
response.raise_for_status()
result = response.json()
if result.get("error"):
raise RuntimeError(result["error"])
return result
import tempfile
from urllib.parse import urlsplit
def image_extension(content):
if content.startswith(b"\x89PNG\r\n\x1a\n"):
return ".png"
if content.startswith(b"\xff\xd8\xff"):
return ".jpg"
if content[:4] == b"RIFF" and content[8:12] == b"WEBP":
return ".webp"
return ".bin" # 其他编码先按原始字节保存,再按实际格式命名。
def save_images(result, directory="generated-images"):
items = result.get("data")
if not isinstance(items, list) or not items:
raise ValueError("响应没有 data 图片列表")
folder = Path(directory)
folder.mkdir(parents=True, exist_ok=True)
paths = []
for index, item in enumerate(items, 1):
if item.get("b64_json"):
content = base64.b64decode(item["b64_json"], validate=True)
elif item.get("url"):
url = item["url"]
parsed = urlsplit(url)
if parsed.scheme != "https" or not parsed.netloc:
raise ValueError("图片结果需为有效 HTTPS 地址")
# 媒体地址可能在独立域名;这里不携带平台 API Key。
response = requests.get(url, timeout=120)
response.raise_for_status()
mime = response.headers.get("Content-Type", "").split(";", 1)[0].lower()
if mime and not (mime.startswith("image/") or mime == "application/octet-stream"):
raise ValueError("下载响应不是图片或二进制文件")
content = response.content
else:
raise ValueError("图片项缺少 url 或 b64_json")
if not content:
raise ValueError("图片内容为空")
target = folder / ("image-" + str(index) + image_extension(content))
temporary = None
try:
with tempfile.NamedTemporaryFile(dir=folder, delete=False) as file:
temporary = Path(file.name)
file.write(content)
temporary.replace(target)
finally:
if temporary is not None:
temporary.unlink(missing_ok=True)
paths.append(target)
return paths
def main():
headers = {"Authorization": "Bearer " + os.environ["KEDANG_API_KEY"]}
# image 是文件字段;Content-Type 与 boundary 由 requests 自动设置。
with Path("input.png").open("rb") as image:
response = requests.post(BASE_URL + "/v1/images/edits", headers=headers,
data={"model": MODEL_ID, "prompt": "将图片背景改为浅蓝色。", "n": "1"},
files={"image": ("input.png", image, "image/png")}, timeout=120)
response.raise_for_status()
result = response.json()
if result.get("error"):
raise RuntimeError(result["error"])
for path in save_images(result):
print(path)
if __name__ == "__main__":
main()