「Transparent background is not supported for this model」的三个修法

gpt-image-2 报这个 400,gpt-image-1.5 却能返回真正的 RGBA PNG。同一个接口上实测 5 个图像模型:1 个能用、1 个报错、3 个悄悄返回不透明。

「Transparent background is not supported for this model」的三个修法

这个报错是诚实的,而修法只是换一个模型 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。 jpegwebp 在这里都是 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.520029.0s6,真彩色 + alpha67.3%
openai/gpt-image-24001.1s不适用不适用
google/gemini-3-pro-image20025.8s2,无 alpha0
bailian/qwen-image-3.020049.7s2,无 alpha0
microsoft/mai-image-2.5-flash20015.4s2,无 alpha0

危险的是下半部分那三个 200。 一个 400 不花钱,而且明确告诉你该改什么;一个悄悄返回不透明 PNG 的 200 花掉一次生成、通过你写的每一个 response.ok 检查,然后在一周后以「幻灯片上的白方块」形式出现。

这个「丢弃」是我们验证过的,不是推断的。给 gpt-image-1.5background: "bogus",会得到一个列出合法取值的 400:

Invalid value: 'bogus'. Supported values are: 'transparent', 'opaque', and 'auto'.

同样的胡说八道传给 gemini-3-pro-image,得到 200 和一张图。会校验这个字段的路由会拒绝垃圾值;接受垃圾值的路由,本来也不会去尊重 transparent

终端会话:向 ofox 图像接口发出的四个 curl 各自返回不同信息的 HTTP 400,随后是 PNG 颜色类型检查 —— gpt-image-1.5 是颜色类型 6、67.3% 透明像素,Gemini、Qwen 和 MAI 的输出都是颜色类型 2、没有 alpha 通道

四个拒绝都是真实调用;最后一段是读取模型实际返回的那些 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:

两张来自 gpt-image-1.5、background 设为 transparent 的生成结果,放在棋盘格背景上对比:孤立主体的 prompt 得到干净的抠图,带场景的 prompt 把大理石台面画进了图里

Promptalpha 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。