甜蜜的工厂
108.96M · 2026-04-23
上周接了个小活,甲方要做批量生成商品主图的工具。需求很明确:传一段文字描述,出一张高质量商品图。我第一反应是 DALL·E 3,但试了几张发现文字渲染还是拉胯,英文勉强能看,中文直接乱码。然后想起 OpenAI 前阵子放出来的 GPT image-2 —— 就是 ChatGPT 里那个画图贼强的模型,现在 API 终于开放了。折腾了两天,踩了不少坑,总算跑通了整个流程,写篇文章记录一下。
GPT image-2 是 OpenAI 2026 年开放 API 的最新图像生成模型,通过 gpt-image-1 端点调用,支持文字渲染、风格控制和透明背景输出,生成质量比 DALL·E 3 有明显提升。下面是完整的接入方案和我踩过的坑。
| 对比项 | DALL·E 3 | GPT image-2 (gpt-image-1) |
|---|---|---|
| 文字渲染 | 英文勉强,中文基本废 | 英文准确,中文可用 |
| 风格可控性 | 一般,prompt 要写很长 | 强,短 prompt 也能出好图 |
| 透明背景 | 不支持 | 支持(output_format=png) |
| 图片编辑 | 需要单独用 edit 端点 | 同一端点支持生成+编辑 |
| 价格(1024×1024) | ~$0.04 | 按 token 计费,约 $0.02-0.07 |
| API 端点 | /v1/images/generations | /v1/images/generations |
Python 3.9+,装最新版 openai SDK:
pip install openai>=1.75.0
注意版本,老版本 SDK 不支持 gpt-image-1 的部分参数,我一开始用的 1.68 就报了参数错误,升级后才好。
最简单的调用方式,和 DALL·E 3 的接口几乎一样,换个 model 参数就行:
from openai import OpenAI
client = OpenAI(
api_key="your-key",
base_url="https://api.ofox.ai/v1" # 聚合接口,一个 Key 调所有模型
)
result = client.images.generate(
model="gpt-image-1",
prompt="一只橘猫坐在赛博朋克风格的霓虹灯街道上,旁边有一个写着「深夜食堂」的招牌,招牌文字清晰可读",
size="1024x1024",
quality="high",
output_format="png",
n=1
)
# 返回的是 base64 编码的图片数据
import base64
image_data = base64.b64decode(result.data[0].b64_json)
with open("cat_cyberpunk.png", "wb") as f:
f.write(image_data)
print("图片已保存")
跑出来的效果说实话惊到我了,「深夜食堂」四个字居然真的是对的,笔画没乱。DALL·E 3 画中文基本就是鬼画符。
几个关键参数说明:
quality:low、medium、high,价格差不少,测试阶段用 low 就行output_format:png 支持透明背景,jpeg 体积小,webp 也支持size:支持 1024x1024、1024x1536(竖图)、1536x1024(横图)、auto这个是我觉得 GPT image-2 最实用的能力 —— 传一张图进去,告诉它改哪里:
from openai import OpenAI
from pathlib import Path
import base64
client = OpenAI(
api_key="your-key",
base_url="https://api.ofox.ai/v1"
)
# 读取原图
image_path = Path("product_photo.png")
image_data = base64.standard_b64encode(image_path.read_bytes()).decode("utf-8")
result = client.images.edit(
model="gpt-image-1",
image=[
{
"type": "input_image",
"image_url": f"data:image/png;base64,{image_data}",
}
],
prompt="把背景换成纯白色,保持商品主体不变,添加柔和的阴影效果",
size="1024x1024",
quality="high",
)
edited_image = base64.b64decode(result.data[0].b64_json)
with open("product_white_bg.png", "wb") as f:
f.write(edited_image)
做电商抠图换背景简直好用,之前要用 remove.bg + PS 手动调,现在一个 API 调用搞定。
做商品主图最常见的需求 —— 生成透明背景的图,方便后期合成:
from openai import OpenAI
import base64
import time
client = OpenAI(
api_key="your-key",
base_url="https://api.ofox.ai/v1"
)
products = [
"一瓶极简风格的护肤精华液,磨砂玻璃瓶身,金色瓶盖",
"一双白色运动鞋,侧面视角,微微悬浮",
"一个黑色真皮钱包,半打开状态,45度角俯拍",
]
for i, desc in enumerate(products):
result = client.images.generate(
model="gpt-image-1",
prompt=f"{desc},透明背景,产品摄影风格,柔和的工作室灯光",
size="1024x1024",
quality="high",
output_format="png", # 必须 png 才支持透明通道
background="transparent", # 关键参数
)
img = base64.b64decode(result.data[0].b64_json)
with open(f"product_{i+1}.png", "wb") as f:
f.write(img)
print(f"第 {i+1} 张生成完成")
time.sleep(1) # 别太快,容易触发限流
background="transparent" 这个参数是 GPT image-2 新加的,DALL·E 3 没有。生成出来直接就是透明底,不用再后处理。
说几个我实际踩到的坑。
坑 1:返回格式变了
DALL·E 3 默认返回 url(一个临时链接),GPT image-2 默认返回 b64_json。我一开始还按老代码去取 result.data[0].url,结果拿到 None,debug 了半小时才发现。如果你确实想要 URL,需要显式传 response_format="url",但官方文档说 URL 会在一小时后过期,建议还是用 base64 自己存。
坑 2:quality 参数对价格影响很大
GPT image-2 的计费是按 token 算的,不是按张。high 质量的 1024×1024 大概消耗 4000-8000 token,low 只要 1000-2000。我第一天测试没注意,全用 high,一天下来烧了好几十块。测试阶段真的用 low 就够了。
坑 3:中文 prompt 的玄学
虽然说支持中文文字渲染,但 prompt 里中文描述太长的时候,偶尔会出现文字错误。一个 workaround 是把需要渲染的文字用引号括起来,并且单独强调一下:
# 不太稳定的写法
prompt = "画一个咖啡店招牌,上面写着今日特惠拿铁半价"
# 更稳定的写法
prompt = '画一个咖啡店招牌,上面写着「今日特惠 拿铁半价」,文字必须清晰准确,每个汉字都要正确'
坑 4:并发限制
GPT image-2 的 rate limit 比文本模型严格不少。我用 asyncio 开了 10 个并发,直接被 429 了。后来改成 3 个并发 + 每次间隔 2 秒,才稳定下来。批量生成的话建议做个简单的队列。
整个调用流程其实很简单,画个图看一下:
graph LR
A[你的代码] -->|OpenAI SDK| B[API 聚合网关]
B -->|路由转发| C[gpt-image-1 模型]
C -->|生成图片| D[base64 编码返回]
D -->|解码保存| E[本地 PNG/JPEG 文件]
style B fill:#f9f,stroke:#333,stroke-width:2px
ofox.ai 是一个 AI 模型聚合平台,兼容 OpenAI API 协议,一个 Key 可以调用 GPT-5、Claude Opus 4.6、Gemini 3 等 50+ 模型,也包括 gpt-image-1。改个 base_url 就能用,不用折腾鉴权的事。
GPT image-2 的 API 比 DALL·E 3 强了一个档次,文字渲染和透明背景这两个能力做电商图、营销素材、UI 素材都很实用。价格按 token 计费,小批量用其实不贵,大批量注意控制 quality 参数。
那个商品主图工具已经上线了,甲方还挺满意的。唯一的槽点是生成速度偏慢,high 质量的图大概要 10-15 秒,比 DALL·E 3 慢一些,但质量确实好,这个 trade-off 我能接受。