GPT-Image-2 图片生成
通过闪电API,你可以使用 OpenAI 原生 Images API 调用 gpt-image-2 生成和编辑图片。
这个接口适合:
- 需要直接文生图的项目
- 需要对已有图片进行编辑或局部修改的场景
- 已经兼容 OpenAI Images API 的应用
- 需要更高分辨率与更稳定文字渲染的场景
接口地址
https://ai.flashapi.top/v1认证方式
在请求头中添加 API 密钥:
http
Authorization: Bearer YOUR_API_KEYGenerations API
接口说明
用于根据提示词直接生成图片。
请求地址
POST /v1/images/generations请求示例
bash
curl https://ai.flashapi.top/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "gpt-image-2",
"prompt": "生成一个闪电API中转站的Logo",
"size": "1536x1024",
"quality": "high",
"n": 1
}'请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 固定为 gpt-image-2 |
| prompt | string | 是 | 绘图提示词 |
| size | string | 否 | 图片尺寸,支持 1024x1024、1024x1536、1536x1024、2048x2048、3840x2160、auto |
| quality | string | 否 | 图片质量,支持 low、medium、high |
| n | integer | 否 | 生成张数,默认 1 |
价格说明
以下是当前单张图片参考价格:
| 质量 | 单张价格 |
|---|---|
| low | ¥0.007 |
| medium | ¥0.06 |
| high | ¥0.26 |
响应格式
接口返回 OpenAI Images API 风格响应:
b64_json:直接返回 base64 图片数据
json
{
"created": 1713772800,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAA..."
}
]
}Edits API
接口说明
在给定原始图像和提示词的情况下,对图片进行编辑或扩展。支持整图编辑和 mask 局部编辑两种方式。
注意:最多只能上传一张图片。
请求地址
POST /v1/images/edits请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 固定为 gpt-image-2 |
| image | file | 是 | 需要编辑的原始图片(最多1张) |
| prompt | string | 是 | 描述期望编辑效果的提示词 |
| mask | file | 否 | 遮罩图片,透明区域表示需要编辑的部分 |
| size | string | 否 | 输出图片尺寸,支持 1024x1024、1024x1536、1536x1024、auto |
| quality | string | 否 | 图片质量,支持 low、medium、high |
| n | integer | 否 | 生成张数,默认 1 |
整图编辑示例
根据提示词对整张图片进行编辑:
python
import base64
import json
import os
import urllib.error
import urllib.request
from datetime import datetime
API_KEY = os.environ.get("FLASH_API_KEY", "YOUR_API_KEY")
API_URL = "https://ai.flashapi.top/v1/images/edits"
IMAGE_PATH = "photo.png"
PROMPT = "把背景改成晚霞"
MODEL = "gpt-image-2"
SIZE = "1024x1024"
QUALITY = "high"
def build_multipart(fields: dict, files: dict) -> tuple[bytes, str]:
"""构建 multipart/form-data 请求体"""
import uuid
boundary = uuid.uuid4().hex
body = b""
for key, value in fields.items():
body += f"--{boundary}\r\n".encode()
body += f'Content-Disposition: form-data; name="{key}"\r\n\r\n'.encode()
body += f"{value}\r\n".encode()
for key, (filename, data, content_type) in files.items():
body += f"--{boundary}\r\n".encode()
body += f'Content-Disposition: form-data; name="{key}"; filename="{filename}"\r\n'.encode()
body += f"Content-Type: {content_type}\r\n\r\n".encode()
body += data + b"\r\n"
body += f"--{boundary}--\r\n".encode()
return body, f"multipart/form-data; boundary={boundary}"
def edit_image(image_path: str, prompt: str) -> dict:
with open(image_path, "rb") as f:
image_data = f.read()
fields = {
"model": MODEL,
"prompt": prompt,
"size": SIZE,
"quality": QUALITY,
}
files = {
"image": (os.path.basename(image_path), image_data, "image/png"),
}
body, content_type = build_multipart(fields, files)
req = urllib.request.Request(
API_URL,
data=body,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": content_type,
},
method="POST",
)
with urllib.request.urlopen(req, timeout=300) as resp:
return json.loads(resp.read().decode("utf-8"))
def save_image(data_entry: dict, index: int) -> str | None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"edited_{timestamp}_{index}.png"
if data_entry.get("b64_json"):
img_bytes = base64.b64decode(data_entry["b64_json"])
with open(filename, "wb") as f:
f.write(img_bytes)
print(f"[{index + 1}] 已保存到:{filename}")
return filename
print(f"[{index + 1}] 未知返回格式:{data_entry}")
return None
def main():
try:
result = edit_image(IMAGE_PATH, PROMPT)
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8")
print(f"[HTTP 错误] {e.code} {e.reason}")
print(body)
return
data_list = result.get("data", [])
for i, entry in enumerate(data_list):
save_image(entry, i)
if __name__ == "__main__":
main()Mask 局部编辑示例
使用遮罩图片指定编辑区域,只修改透明区域对应的部分:
python
import base64
import json
import os
import urllib.error
import urllib.request
from datetime import datetime
API_KEY = os.environ.get("FLASH_API_KEY", "YOUR_API_KEY")
API_URL = "https://ai.flashapi.top/v1/images/edits"
IMAGE_PATH = "photo.png"
MASK_PATH = "mask.png" # 透明区域 = 需要编辑的部分
PROMPT = "把中央区域改成一只橘猫"
MODEL = "gpt-image-2"
SIZE = "1024x1024"
QUALITY = "high"
def build_multipart(fields: dict, files: dict) -> tuple[bytes, str]:
import uuid
boundary = uuid.uuid4().hex
body = b""
for key, value in fields.items():
body += f"--{boundary}\r\n".encode()
body += f'Content-Disposition: form-data; name="{key}"\r\n\r\n'.encode()
body += f"{value}\r\n".encode()
for key, (filename, data, content_type) in files.items():
body += f"--{boundary}\r\n".encode()
body += f'Content-Disposition: form-data; name="{key}"; filename="{filename}"\r\n'.encode()
body += f"Content-Type: {content_type}\r\n\r\n".encode()
body += data + b"\r\n"
body += f"--{boundary}--\r\n".encode()
return body, f"multipart/form-data; boundary={boundary}"
def edit_image_with_mask(image_path: str, mask_path: str, prompt: str) -> dict:
with open(image_path, "rb") as f:
image_data = f.read()
with open(mask_path, "rb") as f:
mask_data = f.read()
fields = {
"model": MODEL,
"prompt": prompt,
"size": SIZE,
"quality": QUALITY,
}
files = {
"image": (os.path.basename(image_path), image_data, "image/png"),
"mask": (os.path.basename(mask_path), mask_data, "image/png"),
}
body, content_type = build_multipart(fields, files)
req = urllib.request.Request(
API_URL,
data=body,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": content_type,
},
method="POST",
)
with urllib.request.urlopen(req, timeout=300) as resp:
return json.loads(resp.read().decode("utf-8"))
def save_image(data_entry: dict, index: int) -> str | None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"mask_edited_{timestamp}_{index}.png"
if data_entry.get("b64_json"):
img_bytes = base64.b64decode(data_entry["b64_json"])
with open(filename, "wb") as f:
f.write(img_bytes)
print(f"[{index + 1}] 已保存到:{filename}")
return filename
print(f"[{index + 1}] 未知返回格式:{data_entry}")
return None
def main():
try:
result = edit_image_with_mask(IMAGE_PATH, MASK_PATH, PROMPT)
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8")
print(f"[HTTP 错误] {e.code} {e.reason}")
print(body)
return
data_list = result.get("data", [])
for i, entry in enumerate(data_list):
save_image(entry, i)
if __name__ == "__main__":
main()响应格式
与图片生成接口一致,返回 base64 图片数据:
json
{
"created": 1713772800,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAA..."
}
]
}支持的尺寸
| 尺寸参数 | 说明 |
|---|---|
1024x1024 | 正方形 |
1024x1536 | 竖图 |
1536x1024 | 横图 |
2048x2048 | 高分辨率正方形 |
3840x2160 | 4K 横图 |
auto | 自动选择合适尺寸 |
代码示例
Python(urllib)
python
import base64
import json
import os
import urllib.error
import urllib.request
from datetime import datetime
API_KEY = os.environ.get("FLASH_API_KEY", "YOUR_API_KEY")
API_URL = "https://ai.flashapi.top/v1/images/generations"
PROMPT = "生成一个闪电API AI中转站的 Logo 图片"
MODEL = "gpt-image-2"
SIZE = "auto"
QUALITY = "medium"
N = 1
def generate_image(prompt: str, size: str, quality: str, n: int) -> dict:
payload = json.dumps({
"model": MODEL,
"prompt": prompt,
"size": size,
"quality": quality,
"n": n,
}).encode("utf-8")
req = urllib.request.Request(
API_URL,
data=payload,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
method="POST",
)
with urllib.request.urlopen(req, timeout=300) as resp:
return json.loads(resp.read().decode("utf-8"))
def save_image(data_entry: dict, index: int) -> str | None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"output_{timestamp}_{index}.png"
if data_entry.get("b64_json"):
img_bytes = base64.b64decode(data_entry["b64_json"])
with open(filename, "wb") as f:
f.write(img_bytes)
print(f"[{index + 1}] 已保存到:{filename}")
return filename
if data_entry.get("url"):
url = data_entry["url"]
urllib.request.urlretrieve(url, filename)
print(f"[{index + 1}] 已下载保存到:{filename}")
return filename
print(f"[{index + 1}] 未知返回格式:{data_entry}")
return None
def main():
try:
result = generate_image(PROMPT, SIZE, QUALITY, N)
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8")
print(f"[HTTP 错误] {e.code} {e.reason}")
print(body)
return
except urllib.error.URLError as e:
print(f"[网络错误] {e.reason}")
return
data_list = result.get("data", [])
for i, entry in enumerate(data_list):
save_image(entry, i)
if __name__ == "__main__":
main()注意事项
- 图片生成和编辑接口不是聊天接口,不要调用
/v1/chat/completions。 - 建议把请求超时设置为
300秒,避免高分辨率生成时超时。 quality越高,耗时和费用通常越高;测试时建议先用low或medium。- 当你不确定画幅时,可以先使用
auto,再按需要切换到固定尺寸。 - 图片编辑接口(Edits API)最多只能上传 1 张 图片。
- mask 遮罩图片必须与原图尺寸一致,透明区域表示需要编辑的部分。
下一步
- 查看API概览 - 了解整体接口分类
- 查看OpenAI格式API - 继续使用聊天与通用 OpenAI 接口
- 查看Gemini 图片生成 - 对比另一套图片生成能力
- 获取帮助 - 遇到问题时联系支持