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

> 用 GPT Image 2 请求透明 PNG 或 WebP，正确设置背景与压缩参数、解码保存图片，并用可运行的 Python 脚本区分不透明、空白透明、边缘问题和转码丢失透明度。

- Source: https://www.aifreeapi.com/zh/posts/gpt-image-2-transparent-background
- Language: zh
- Published: 2026-09-03
- Updated: 2026-09-08
- Publisher: AI Free API (https://www.aifreeapi.com)

**GPT Image 2 目前可以通过 OpenAI Images API 请求透明 PNG 和 WebP，透明背景仍处于预览阶段。** 请求时同时设置 `background="transparent"` 与 `output_format="png"` 或 `"webp"`，然后把返回的 base64 解码为图片字节。JPEG 不保留透明背景。以上是截至 2026 年 9 月 8 日[官方图片生成指南](https://developers.openai.com/api/docs/guides/image-generation#customize-image-output)的适用规则；早期“不支持透明”的结论不能直接用于当前接口。

文件名以 `.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 文档](https://developers.google.com/speed/webp/docs/api)，API 参数以 [OpenAI 提示指南](https://developers.openai.com/cookbook/examples/multimodal/image-gen-models-prompting-guide)为准。

下面使用 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 文件保存的流程示意图](https://www.aifreeapi.com/posts/zh/gpt-image-2-transparent-background/img/transparent-request-save.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 指南](https://developers.openai.com/api/docs/guides/image-generation)。

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

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

把以下脚本保存为 `check_alpha.py`，执行 `python check_alpha.py backpack.png` 或传入 WebP 文件。它先读取真实文件格式，再统计透明度；转换为 RGBA 只是方便统一读取，**不会自动去掉白底或抠出主体**。这些操作使用 [Pillow 的 Image 接口](https://pillow.readthedocs.io/en/stable/reference/Image.html)。

```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-` 文件当透明素材上传**。在白底正常、深底出现白圈，说明边缘颜色还需要处理；格子在不同底色上始终存在，可能是格子已被画入图片。应回到原文件检查对应区域，不能只凭“存在透明像素”判定整张图合格。

![背包素材的透明度状态与白、深灰、蓝三种底色下的边缘检查示意图](https://www.aifreeapi.com/posts/zh/gpt-image-2-transparent-background/img/alpha-background-check.webp)

## 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 接入说明](/zh/posts/gpt-image-2-api)。对于精确标签、复杂发丝或需要稳定批量产出的素材，保留原稿与后处理方案，才能在透明背景正确但主体细节不合用时继续完成交付。
