跳到正文

GPT Image 2 透明背景 API:生成、保存与检查 PNG/WebP

透明素材从请求成功到真正可用,还差一次文件检查。先选 PNG 或 WebP,再核对实际格式、透明像素和换底色后的边缘;上传或转码后的最终文件也要检查。

•••11 分钟阅读•API 指南
橙色背包在棋盘格预览和深浅背景中复用的透明素材示意图

GPT Image 2 目前可以通过 OpenAI Images API 请求透明 PNG 和 WebP,透明背景仍处于预览阶段。 请求时同时设置 background="transparent" 与 output_format="png" 或 "webp",然后把返回的 base64 解码为图片字节。JPEG 不保留透明背景。以上是截至 2026 年 9 月 8 日官方图片生成指南的适用规则;早期“不支持透明”的结论不能直接用于当前接口。

文件名以 .png 结尾、图片模式是 RGBA、预览里出现棋盘格,都不足以证明素材可用。你需要分别判断:文件是什么格式、是否真的有透明像素、主体是否还在,以及放到实际背景上有没有白边或黑边。

为什么旧教程说不支持,而现在可以请求透明背景?

先看教程的时间和实际调用的服务。早期失败记录只能说明当时的请求结果,不能推翻后来更新的官方支持说明。因此,仅因为旧教程建议“改用 GPT Image 1.5”或“生成白底再抠图”,不必立即换模型;先确认自己使用的接口是否已经支持 GPT Image 2 的透明背景预览功能。后处理仍可用于修复边缘,或完成当前接入服务暂不支持的抠图需求。

如果走第三方网关,应核对它的最新说明、实际模型名及是否转发 background、output_format。兼容 OpenAI 请求格式,或提供带有 GPT Image 2 名称的模型别名,都不能单独证明这一能力已经可用。保存实际模型名、请求参数和错误响应后,优先查具体接入方的支持条件;不要把一个网关拒绝参数的结果概括成模型整体不支持。

本文的参数和代码适用于 Images API。ChatGPT 中能否直接选择透明背景、当前账户是否显示某个按钮,需要以实际界面为准,不能从 API 文档推断。无论在哪个界面生成,都应下载原始图片后检查:查看器可能给透明区域铺上白底或棋盘格,这种显示底色与文件像素是否透明是两回事。

先选输出格式,再写请求

PNG 和 WebP 都能承载透明度,区别主要在保存与交付需求。

需求建议选择请求和后续处理
留原始素材,继续编辑或检查细小边缘PNG设置 output_format="png",不传 output_compression
直接用作网页素材,需要比较文件体积WebP设置 output_format="webp",按需加入 output_compression,下载后检查效果与大小
已有合格 PNG,需要另做网页版本保留 PNG,另外转换 WebP使用支持 Alpha 的转换方式,对转换结果重新检查
必须交付 JPEG先确定背景色再合成JPEG 没有透明背景,这一步会把主体与选定底色合成普通图片

WebP 格式本身支持有损、无损以及 RGBA,但不能据此认定 API 输出必定无损。output_compression=80 也不表示“文件体积减少 80%”,更不是 token 或价格折扣。压缩是否适合你的素材,要看实际下载后的字节数、文字和轮廓;格式能力可查 Google WebP 文档,API 参数以 OpenAI 提示指南为准。

下面使用 OpenAI Python SDK 的 Images API。环境中需配置 OPENAI_API_KEY,并具备目标模型的访问权限;这是按官方接口编写的调用示例,不代表对你的账户或第三方网关已经验证成功。安装依赖:

bash
python -m pip install -U openai pillow

保存为 generate_asset.py。修改 OUTPUT_FORMAT 就能选择 PNG 或 WebP,文件扩展名会跟着改变:

python
import base64
from pathlib import Path
from openai import OpenAI

OUTPUT_FORMAT = "png"  # 改为 "webp" 可请求 WebP
if OUTPUT_FORMAT not in {"png", "webp"}:
    raise ValueError("透明素材请选择 png 或 webp")

options = {
    "model": "gpt-image-2",
    "prompt": (
        "生成一个独立的橙色登山背包图标,保留拉链与背带细节。"
        "背景完全透明,主体完整,边缘干净。"
        "不要场景、纯色底、棋盘格、边框或投影。"
    ),
    "background": "transparent",
    "output_format": OUTPUT_FORMAT,
    "size": "1024x1024",
    "quality": "medium",
}
if OUTPUT_FORMAT == "webp":
    options["output_compression"] = 80  # 示例值,按素材调整

result = OpenAI().images.generate(**options)
if not result.data or not result.data[0].b64_json:
    raise RuntimeError("响应没有可保存的 base64 图片数据")

image_bytes = base64.b64decode(result.data[0].b64_json, validate=True)
target = Path(f"backpack.{OUTPUT_FORMAT}")
target.write_bytes(image_bytes)
print(f"已保存 {target},共 {len(image_bytes)} 字节")

提示词中的“独立主体”“不需要投影”等描述用于说明想要的素材,background 才是请求透明输出的明确参数。若需要柔和投影或烟雾,不必机械照抄“不投影”,应描述要保留的半透明效果。

这段代码直接保存返回字节,不通过截图、画布导出或改名伪装格式。backpack.webp 仍可能在后续处理时被替换为其他格式,所以保存完成后继续执行下方检查。请求错误、没有图像数据和得到了一张不合用的图片,是三个不同的问题。

透明背景请求、base64 解码和 PNG/WebP 文件保存的流程示意图

编辑商品图或继续改图,也要明确保持透明

已有商品照、Logo 或角色素材时,调用编辑接口并提交原图。下面将 product.png 中的主体分离出来;如果你的目标是 WebP,可把输出格式与保存扩展名一同改为 webp,并按需加入压缩字段。

python
import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI()
with open("product.png", "rb") as source:
    result = client.images.edit(
        model="gpt-image-2",
        image=source,
        prompt=(
            "将商品独立放在完全透明的背景上。"
            "保留商品几何形状、颜色、标签文字与比例。"
            "去除拍摄背景和地面投影,不添加棋盘格或实色背景。"
            "主体轮廓清晰,边缘不要白边或杂色。"
        ),
        background="transparent",
        output_format="png",
    )

if not result.data or not result.data[0].b64_json:
    raise RuntimeError("编辑响应没有图片数据")
Path("product-cutout.png").write_bytes(
    base64.b64decode(result.data[0].b64_json, validate=True)
)

每次继续编辑都重新传入透明背景参数,并在提示中要求保持透明;不要只依赖上一张图片已有 Alpha。生成与编辑接口的用途及返回方式见 OpenAI Images API 指南。

“保留标签文字与形状”是编辑要求,不能保证输出与原图逐像素一致。涉及商标、包装文字或精确产品外观时,要将结果与原图核对。发丝、毛绒、玻璃和柔光往往需要半透明过渡,也不能简单要求所有主体像素都等于完全不透明。

检查真实格式与 Alpha,先排除空白图

把以下脚本保存为 check_alpha.py,执行 python check_alpha.py backpack.png 或传入 WebP 文件。它先读取真实文件格式,再统计透明度;转换为 RGBA 只是方便统一读取,不会自动去掉白底或抠出主体。这些操作使用 Pillow 的 Image 接口。

python
import sys
from pathlib import Path
from PIL import Image

path = Path(sys.argv[1])
expected = {".png": "PNG", ".webp": "WEBP"}.get(path.suffix.lower())
with Image.open(path) as source:
    actual_format = source.format
    source.load()  # 确认图片能够完整解码
    rgba = source.convert("RGBA")

alpha = rgba.getchannel("A")
hist = alpha.histogram()
minimum, maximum = alpha.getextrema()
print({
    "format": actual_format,
    "size": rgba.size,
    "bytes": path.stat().st_size,
    "alpha_range": [minimum, maximum],
    "fully_transparent": hist[0],
    "partly_transparent": sum(hist[1:255]),
    "fully_opaque": hist[255],
})

if expected is None or actual_format != expected:
    raise SystemExit("格式不符:请核对请求、文件扩展名和转码步骤")
if maximum == 0:
    raise SystemExit("整张图完全透明:没有可见主体")
if minimum == 255:
    raise SystemExit("整张图完全不透明:没有透明或半透明像素")

print("存在透明度和可见像素;仍需检查主体轮廓")
for name, color in {
    "white": (255, 255, 255, 255),
    "dark": (24, 24, 24, 255),
    "blue": (20, 90, 210, 255),
}.items():
    background = Image.new("RGBA", rgba.size, color)
    preview = Image.alpha_composite(background, rgba).convert("RGB")
    preview.save(path.with_name(f"{path.stem}-preview-{name}.png"))

检查结果要结合素材用途解释:

  • Alpha 全为 255:完全不透明,即使模式为 RGBA 也没有透明效果。白底或绘制的棋盘格都可能属于这一类。
  • Alpha 全为 0:整张图不可见,不能当作成功抠图。
  • Alpha 同时包含透明度与可见像素:通过了基础检查。孤立图标通常需要主体周围有完全透明的区域,但玻璃或烟雾可以主要由半透明像素构成,不一定出现 0 和 255 两个端点。

脚本另外生成三张带底色的预览,供你查看边缘。预览是故意合成的不透明图片,不要把 -preview- 文件当透明素材上传。在白底正常、深底出现白圈,说明边缘颜色还需要处理;格子在不同底色上始终存在,可能是格子已被画入图片。应回到原文件检查对应区域,不能只凭“存在透明像素”判定整张图合格。

背包素材的透明度状态与白、深灰、蓝三种底色下的边缘检查示意图

PNG 转 WebP 后,对最终文件再检查一次

若要保留 PNG 原稿并另做 WebP,可以用下面的离线转换。这里显式选择 Pillow 的无损 WebP 编码,不代表 API 的压缩字段也有同样语义。

python
from PIL import Image

with Image.open("backpack.png") as source:
    source.convert("RGBA").save(
        "backpack-delivery.webp", format="WEBP", lossless=True
    )

然后执行 python check_alpha.py backpack-delivery.webp。无损 WebP 不保证一定比 PNG 小,实际字节数由素材决定。若改用有损压缩,在比较体积的同时重新看边缘、细线和标签文字。

最容易丢失透明度的处理包括:先 .convert("RGB")、保存成 JPEG、把图片绘制到已有实色底的画布,或经过会合成背景的缩略图服务。上传之后也应下载网站实际交付的图片再检查,HTTP Content-Type 应与内容一致:PNG 为 image/png,WebP 为 image/webp。扩展名、MIME 与真实格式相互对应,才能避免“本地透明,上线白底”时查错文件。

按失败表现选择下一步

表现先确认什么下一步
API 直接返回错误状态码、错误信息、模型权限与最终请求字段按具体错误修正请求;此时尚未进入 Alpha 检查
响应成功但没有图像数据是否读到了 Images API 的 data[0].b64_json核对接口与响应结构,不把空字段保存成图片
扩展名是 PNG/WebP,解码格式却不同保存的原始字节是否被改写从 API 原始输出到转换、上传逐段定位
全不透明,或白底与棋盘格仍在最终请求是否包含透明参数、服务是否支持核对实际模型与服务文档,简化为独立主体后重试
整张全透明Alpha 最大值是否为 0输出没有可见主体,需要重新生成或编辑
有透明像素,但轮廓缺损或边缘发白明暗底色预览、原图细节调整编辑要求,或使用背景移除、蒙版及边缘修复工具
原稿合格,交付图失败原稿与最终文件的格式、Alpha 统计修复丢失透明度的转码或缩略图环节

当透明素材已经通过检查,接下来再把调用接入业务。如果还需要区分 Images API、Responses 图片工具和更完整的接入方式,可继续阅读 GPT Image 2 API 接入说明。对于精确标签、复杂发丝或需要稳定批量产出的素材,保留原稿与后处理方案,才能在透明背景正确但主体细节不合用时继续完成交付。

发现内容有误,或遇到文中没覆盖的问题?请把文章地址和你看到的情况发到 hi@laozhang.ai,核实后我们会更新正文。