Skip to content

GPT-Image-2 图片生成

通过闪电API,你可以使用 OpenAI 原生 Images API 调用 gpt-image-2 生成和编辑图片。

这个接口适合:

  • 需要直接文生图的项目
  • 需要对已有图片进行编辑或局部修改的场景
  • 已经兼容 OpenAI Images API 的应用
  • 需要更高分辨率与更稳定文字渲染的场景

接口地址

https://ai.flashapi.top/v1

认证方式

在请求头中添加 API 密钥:

http
Authorization: Bearer YOUR_API_KEY

Generations 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
  }'

请求参数

参数类型必填说明
modelstring固定为 gpt-image-2
promptstring绘图提示词
sizestring图片尺寸,支持 1024x10241024x15361536x10242048x20483840x2160auto
qualitystring图片质量,支持 lowmediumhigh
ninteger生成张数,默认 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

请求参数

参数类型必填说明
modelstring固定为 gpt-image-2
imagefile需要编辑的原始图片(最多1张)
promptstring描述期望编辑效果的提示词
maskfile遮罩图片,透明区域表示需要编辑的部分
sizestring输出图片尺寸,支持 1024x10241024x15361536x1024auto
qualitystring图片质量,支持 lowmediumhigh
ninteger生成张数,默认 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高分辨率正方形
3840x21604K 横图
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 越高,耗时和费用通常越高;测试时建议先用 lowmedium
  • 当你不确定画幅时,可以先使用 auto,再按需要切换到固定尺寸。
  • 图片编辑接口(Edits API)最多只能上传 1 张 图片。
  • mask 遮罩图片必须与原图尺寸一致,透明区域表示需要编辑的部分。

下一步

闪电API | Flash API - 让全球顶级AI模型触手可达