「Transparent background is not supported for this model」的三个修法
gpt-image-2 报这个 400,gpt-image-1.5 却能返回真正的 RGBA PNG。同一个接口上实测 5 个图像模型:1 个能用、1 个报错、3 个悄悄返回不透明。
这个报错是诚实的,而修法只是换一个模型 ID。 background: "transparent" 是一项 preview 能力,有的图像模型部署有、有的没有 —— 而 OpenAI 自己 cookbook 用的那个,恰好是这里没有的那个。
报错: 400,"Transparent background is not supported for this model."
类型: image_generation_user_error
触发于: openai/gpt-image-2(1.1 秒,生成都没开始)
可用于: openai/gpt-image-1.5(200,RGBA PNG,67.3% 像素 alpha 为 0)
静默失败: gemini-3-pro-image、qwen-image-3.0、mai-image-2.5-flash
全部 200,全部颜色类型 2,没有 alpha 通道
格式规则: 只能 PNG。jpeg 是 400,webp 也是 400。
prompt 规则:prompt 压过参数。写了场景,场景就回来了。
实测: 2026-08-24,POST /v1/images/generations,1024x1024,n=1
三个修法,按咬人的顺序排:
- 修法一,换模型。 这项能力挂在部署上,不挂在请求上。换一个模型 ID 就是 200 加一个真的 alpha 通道。
- 修法二,输出保持 PNG。
jpeg和webp在这里都是 400,而且原因不同。 - 修法三,重写 prompt。 prompt 的优先级高于参数,提到场景的 prompt 会把场景给你画回来。
最后更新 2026-08-24。OpenAI 把透明资产描述为 preview 阶段,所以哪些模型 ID 带这项能力是会变的。在你信任任何一份模型清单(包括我们这份)之前,请把本文的探测脚本重跑一遍。
gpt-image-2 为什么说这个模型不支持透明背景
因为那个模型 ID 背后的部署没开透明 preview。 这句话不是在委婉地说你参数写错了。
完整回复是这样:
{
"error": {
"code": null,
"message": "Transparent background is not supported for this model.",
"param": null,
"type": "image_generation_user_error"
}
}
两个细节排除了那些无聊的解释。它 1.1 秒就回来了,说明什么都没生成、也就谈不上生成完再丢掉。以及同一个模型 ID、同一把 key、把 background 换成 "opaque" 就返回 200 和一张正常图片 —— 一个会过滤掉这个字段的网关,不可能让同一个字段的两个取值产生不同结果。
大家照着教程做还会撞上这个,是因为 OpenAI 关于透明图像资产的 cookbook 是拿 gpt-image-2 写的。但请重读它的前置说明:它写的是你需要拥有一个支持透明能力的图像模型的访问权限,并且把这项功能称为 preview。当一项功能挂在权限开关后面时,模型名字和模型能力是两件事。
到底哪些图像模型会返回透明 PNG
我们测的五个里只有一个。 同样的 prompt、同样的尺寸、同样的接口、同一天。
| 模型 | HTTP | 时延 | PNG 颜色类型 | alpha 为 0 的像素 |
|---|---|---|---|---|
openai/gpt-image-1.5 | 200 | 29.0s | 6,真彩色 + alpha | 67.3% |
openai/gpt-image-2 | 400 | 1.1s | 不适用 | 不适用 |
google/gemini-3-pro-image | 200 | 25.8s | 2,无 alpha | 0 |
bailian/qwen-image-3.0 | 200 | 49.7s | 2,无 alpha | 0 |
microsoft/mai-image-2.5-flash | 200 | 15.4s | 2,无 alpha | 0 |
危险的是下半部分那三个 200。 一个 400 不花钱,而且明确告诉你该改什么;一个悄悄返回不透明 PNG 的 200 花掉一次生成、通过你写的每一个 response.ok 检查,然后在一周后以「幻灯片上的白方块」形式出现。
这个「丢弃」是我们验证过的,不是推断的。给 gpt-image-1.5 传 background: "bogus",会得到一个列出合法取值的 400:
Invalid value: 'bogus'. Supported values are: 'transparent', 'opaque', and 'auto'.
同样的胡说八道传给 gemini-3-pro-image,得到 200 和一张图。会校验这个字段的路由会拒绝垃圾值;接受垃圾值的路由,本来也不会去尊重 transparent。

四个拒绝都是真实调用;最后一段是读取模型实际返回的那些 PNG 的文件头。
修法一:换到哪个模型
openai/gpt-image-1.5,请求里其他什么都不用改。 在 gpt-image-2 上失败的那个请求体,原样就能成功:
from openai import OpenAI
client = OpenAI(base_url="https://api.ofox.ai/v1", api_key="YOUR_OFOX_API_KEY")
resp = client.images.generate(
model="openai/gpt-image-1.5", # 这里换成 gpt-image-2 就是 400
prompt=(
"A single glossy red ceramic coffee mug, isolated product cutout, "
"no backdrop, no scene, no shadow, no reflection, transparent background, "
"no text, no letters, no logos, no watermarks"
),
size="1024x1024",
background="transparent",
)
如果你要把这段接进商品图产线,请把模型 ID 写死,并在响应没有 alpha 时大声失败,而不是让某个兜底模型在一夜之间产出一千张不透明的「抠图」。同一条产线上会遇到的其他报错,在我们的 gpt-image-2 失败模式笔记里。
修法二:哪些输出格式能装下 alpha
只有 PNG。 JPEG 存不了 alpha 通道,接口在生成任何东西之前就会这么告诉你;而 WebP 本身能存 alpha,但这个接口压根不提供它。
output_format: "jpeg" -> 400 Transparent background is not supported for JPEG output format
output_format: "webp" -> 400 Invalid value: 'webp'. Supported values are: 'png' and 'jpeg'.
两个拒绝要分清楚。JPEG 那个说的是格式本身的能力;WebP 那个说的是这个接口接受的格式清单更短。这对电商图片产线有影响:直觉是直接要 WebP、省掉一次转码,而在这里你得先生成 PNG,再在下游转。
修法三:为什么透明图里还是一堆背景
因为 prompt 压过参数,而且差距很大。 OpenAI 的 cookbook 把这写成一条注意事项,我们量了它到底让你损失多少。
同一个模型、同样的 background: "transparent",两个 prompt:

| Prompt | alpha 0(完全透明) | alpha 255(完全不透明) | 结果 |
|---|---|---|---|
| 孤立主体,「no backdrop, no scene, no shadow」 | 67.3% | 24.1% | 干净的抠图 |
| 「on a marble kitchen counter at sunrise, soft window light」 | 43.5% | 21.7% | 杯子、台面、窗框和日出,只有空白天空被抠掉了 |
第二张图并不是透明功能失效。它确实产生了 alpha —— 只是围着它被要求画的那个场景产生的。这对商品图毫无用处,而如果没人在文件出厂前看一眼,那就比没用更糟。
实用规则:只描述物体,然后补上否定词。 counter、studio、gradient、table、sunset、shadow 这些词都会把背景请回来,要一个「倒影」也一样。
怎么确认一个 PNG 真的带透明
读一个字节。 PNG 把颜色类型存在 IHDR 块里,也就是文件的第 25 个字节:
python3 -c "print('colour type', open('out.png','rb').read(26)[25])"
# 6 = 真彩色 + alpha 4 = 灰度 + alpha
# 2 = 真彩色,无 alpha 3 = 索引色(透明信息可能在 tRNS 块里)
颜色类型是必要条件,不是充分条件。一个 alpha 通道处处等于 255 的 RGBA 文件,就是一张多带了一个通道的不透明图 —— 而这正是措辞糟糕的 prompt 会返回的东西。所以要数像素:
from PIL import Image
im = Image.open("out.png")
print(im.mode) # 有 alpha 通道时是 RGBA
if im.mode == "RGBA":
hist = im.getchannel("A").histogram()
px = im.width * im.height
print(f"{100 * hist[0] / px:.1f}% fully transparent")
print(f"{100 * hist[255] / px:.1f}% fully opaque")
本文所有数字都出自这两个检查。Pillow 的 Image 参考有完整的通道 API,PNG 规范里有颜色类型表,你也可以自己解析文件头。
把 alpha 检查放进 CI。 生成服务悄悄换掉某个模型 ID 背后的部署时不会通知你,但一条「全透明像素超过 30%」的断言会。
一张透明图多少钱
我们那次成功的生成计费 46 个输入 token 和 4415 个输出 token,其中 4160 个是图像 token、255 个是文本 token。按模型页公布的费率(输入 $5/百万、输出图像 $32/百万、输出文本 $10/百万),一张 1024x1024 的抠图约 $0.136。
有一处我们没追下去:同样尺寸在 gpt-image-2 上用 background: "opaque" 只报告了 196 个图像输出 token。两个模型报告的图像 token 量级差这么远,说明每个模型的价格都要用它自己的实测 usage 去算,不要假设「每百万像素多少 token」是个常数。这个论点在文本模型上是一样的,我们在账单上到底出现了什么里展开过。
如果你必须用的那个模型没有透明能力
被锁死在一个会丢弃这个字段的模型上时,你有两条诚实的路和一条错路。
- 在纯色背景上生成,然后抠图。 用一个主体里不会出现的、不自然的纯色背景,可以让下游的抠图容易得多。慢一些、边缘有损失,但可预期。
- 在有能力的模型上生成一次,然后复用。 透明是文件的属性,不是产线的属性。一张好抠图胜过一百次重渲。
- 不要把那个「200 但不透明」的结果发出去。它会在有色底的幻灯片上变成一个白方块,而等你发现时这一批已经上千张了。
图像接口本身更全面的情况,可以看我们的 gpt-image-2 发布指南(讲编辑控制项)、Qwen Image 3.0 Pro 实测和 Seedream 4.5 教程(表里另外两个家族)。另外 Google 的图像生成文档列出了 Gemini 图像模型确实暴露了哪些能力,在你把「缺功能」当成「路由问题」之前值得读一读。
参考资料
常见问题
- gpt-image-2 为什么说这个模型不支持透明背景?
- 因为透明图像资产是按模型部署逐个开放的 preview 能力,而我们测的这条 gpt-image-2 路由上没开。同一个请求体把 background 换成 opaque 或 auto,在同一个模型上返回 200,说明参数确实送到了厂商那边,只有 transparent 这个值被拒。而且它 1.1 秒就返回了 —— 对于「生成之后才拒绝」来说这太快了。
- 哪个 OpenAI 图像模型支持 background transparent?
- 在我们测的这条路由上是 openai/gpt-image-1.5。它返回的 PNG 是 IHDR 颜色类型 6,67.3% 的像素 alpha 为 0。OpenAI 自己的 cookbook 示例写的是 gpt-image-2,这也是大家被这个报错搞懵的原因;但同一篇 cookbook 也写明了需要有支持透明的图像模型的访问权限。决定成败的是权限,不是模型名字。
- 能生成透明的 JPEG 吗?
- 不能。JPEG 没有 alpha 通道,接口会在生成之前直接拒绝:Transparent background is not supported for JPEG output format。在这个接口上 PNG 是唯一选择:output_format 传 webp 会得到 Invalid value: webp. Supported values are: png and jpeg。
- 调用返回 200 但 PNG 是白底,发生了什么?
- 多半是模型根本没看到这个参数。我们把 background transparent 发给三个非 OpenAI 的图像模型,三个都返回 200,PNG 全是颜色类型 2,根本没有 alpha 通道。其中一个连 background 传字面量 bogus 都照样返回 200 —— 这就是判据:会校验这个字段的路由会拒绝非法值,会丢弃这个字段的路由什么都接受。
- 为什么我的透明图里还有背景?
- 因为 prompt 的优先级高于参数。OpenAI 的 cookbook 直接这么说,我们也量了:同一个模型、同一个 background 设置,「孤立主体」的 prompt 得到 67.3% 全透明像素,而提到大理石台面和日出的 prompt 只有 43.5%,并且真把台面画进了图里。描述物体本身,然后明确写上不要背景、不要场景、不要阴影。
- 怎么确认一个 PNG 真的带透明?
- 读文件的第 25 个字节:6 表示真彩色加 alpha,2 表示完全没有 alpha。颜色类型 3 是索引色,透明信息可能在单独的 tRNS 块里,这种要当作「不确定」。然后统计 alpha 为 0 的像素数量 —— 一个 alpha 通道全是 255 的 RGBA 文件,就是一张披着 alpha 通道的不透明图。
- 网关会不会把 background 参数吞掉?
- 我们测的这条路由不会。gpt-image-2 对 background opaque 和 auto 返回 200,只拒 transparent;gpt-image-1.5 对非法值 bogus 返回 400 并列出合法取值。这两种行为都要求字段完整地送达厂商。
- 一张透明图多少钱?
- 我们在 gpt-image-1.5 上生成的 1024x1024 透明图计费 46 个输入 token、4415 个输出 token,其中 4160 个是图像 token。按 ofox 模型页的费率(输入 $5/百万、输出图像 $32/百万、输出文本 $10/百万)折算约 $0.136。


