# GPT Image 透明背景变棋盘格：真假透明怎么判断、怎么修

> 换了底色格子还在，就是画进像素的假透明。API 要传 background 并用 png 或 webp，ChatGPT 里只能用文字要求，都以保存的文件为准。

- URL: https://blog.laozhang.ai/zh/posts/gpt-image-transparent-background-checkerboard
- Published: 2026-10-02
- Updated: 2026-10-02
- Author: LaoZhang AI Team (https://blog.laozhang.ai/zh/about)
- Category: AI 图片生成
- Tags: GPT Image 2.5, 透明背景, 棋盘格, 透明 PNG, alpha 通道, ChatGPT Images

---
## 两种棋盘格：能透出底色的是真透明，盖住底色的是画上去的

灰白格子有两种来路。一种是看图软件或编辑器画在透明像素后面的底纹，只在屏幕上显示，文件里没有它；另一种是模型把格子当成画面内容画了出来，每一格都是实打实的不透明像素。前者是真透明，后者就是常说的假透明。

区分的办法只有一个：看文件，不看预览，也不看扩展名。把保存下来的原文件叠到一块深色或彩色的底上，底色从主体四周透出来，是真透明；格子跟着图一起盖在底色上，是画上去的。OpenAI 的提示词指南里也有同一句话：画出来的棋盘格不是透明（A drawn checkerboard is not transparency）。

下面关于 ChatGPT 和 API 会返回什么的说法，全部来自 OpenAI 的文档和用户报告，截至 2026 年 10 月 2 日；这一轮没有在 ChatGPT 里生成图片，也没有发起任何付费 API 调用。实际跑过的只有文中两个本地 Python 脚本，测试对象是用 Pillow 画的合成图，不是模型输出。

确认是假透明之后，问题出在哪一步，取决于图是从哪个入口来的：

| 你的情况 | 最可能的环节 | 先做什么 |
| --- | --- | --- |
| 在 ChatGPT 里用文字要了透明背景，保存的文件里格子还在 | 生成：界面里没有透明开关，模型自己决定画什么 | 换一个新对话按原始描述重新生成，不要让它“把格子去掉” |
| 调 OpenAI API，只在提示词里写了“透明” | 参数：没传 `background` 等于 `auto` | 补上 `background` 和 `output_format`，再看响应里的两个字段 |
| 通过第三方平台调用，参数传了但结果是白底或格子 | 路线：这个型号路线不一定支持 `background` | 查平台文档里该型号对透明的说明，换支持的型号 |
| 生成时是透明的，下载、转发或上传之后变成白底、黑底 | 保存与转码：JPG、截图、平台压缩 | 回到原文件，用 PNG 或 WebP 原样传 |
| 手里只有这一张假透明图，主体不能变 | 修复 | 纯色硬边的主体用下文脚本，其余交给抠图工具 |

## 不写代码的判断方法：把原文件叠到深色底上

把文件放到一个你能控制底色的地方，看主体四周露出来的是什么。PPT、Keynote、Figma、Photoshop、Canva 都可以：先铺一块深蓝或大红的矩形，再把图片拖到它上面。

| 叠上去之后看到的 | 说明 | 结论 |
| --- | --- | --- |
| 主体四周是你铺的底色 | 背景像素是透明的 | 真透明，接着放大看边缘 |
| 灰白格子原样盖在底色上 | 格子是画进图里的不透明像素 | 假透明 |
| 主体周围是一整块白色或黑色 | 透明信息在保存或转换时丢了，或者一开始就是纯色底 | 不透明，回头查保存环节 |

![把同一张贴纸叠到深蓝底上的三种结果：四周露出底色是真透明，灰白格子盖在底色上是假透明，一整块白色或黑色是不透明](https://blog.laozhang.ai/posts/zh/gpt-image-transparent-background-checkerboard/img/overlay-test-three-results.webp)

两个容易踩的地方。第一，必须用下载下来的原文件，截图不算：截图是把屏幕上显示的结果重新存成一张不透明的图，原来透明的地方也会被拍成白色或格子。第二，扩展名不说明问题：PNG 可以带透明，也可以完全不透明，一个改了后缀的 JPG 照样能叫 `.png`。

Photoshop 里常见的困惑也在这里。PS 本来就会在透明区域后面显示格子底纹，所以单看一个图层分不清；在下面新建一个纯色图层，格子消失就是真透明，格子还在就是像素。

真透明的图还要再看一眼边缘。OpenAI 的提示词指南建议检查头发、玻璃、阴影和物体边缘的 alpha 通道，这些位置最容易留下白边或被切掉一块；深色底和彩色底各叠一次，问题会更明显。

## 用 check_transparency.py 读 alpha 通道：六种结果怎么看

图片多、要批量过，或者想要一个不靠眼睛的结论，就直接读 alpha 通道。alpha 通道的意思是：每个像素除了红、绿、蓝三个颜色值，还存了一个表示透明度的数值，0 是完全透明，255 是完全不透明。一张假透明图的 alpha 值全是 255。

下面的脚本只依赖 Pillow（`pip install pillow`），做三件事：读出文件的真实格式而不是扩展名；统计透明、半透明、不透明像素各占多少；如果一个透明像素都没有，再看图片外圈是不是两种浅灰交替的格子。

```python
"""Tell real transparency from a painted checkerboard.

Usage: python check_transparency.py image.png [more files...]
Requires Pillow (pip install pillow).
"""
import sys
from collections import Counter
from pathlib import Path

from PIL import Image


def border_pixels(rgb, ring=0.04):
    """Pixels in a thin frame around the image, where the background usually is."""
    w, h = rgb.size
    t = max(2, int(min(w, h) * ring))
    px = rgb.load()
    for y in range(h):
        for x in range(w):
            if x < t or x >= w - t or y < t or y >= h - t:
                yield px[x, y]


def painted_checkerboard(rgb):
    """True when the frame is made of two light, neutral tones that alternate."""
    w, h = rgb.size
    small = rgb.resize((min(w, 256), min(h, 256)), Image.NEAREST)
    tones = Counter()
    total = 0
    for r, g, b in border_pixels(small):
        total += 1
        if max(r, g, b) - min(r, g, b) <= 12 and min(r, g, b) >= 150:
            tones[round((r + g + b) / 3 / 8)] += 1  # 8-level buckets of gray
    if total == 0 or sum(tones.values()) / total < 0.85:
        return False  # the frame isn't mostly light gray/white
    buckets = sorted(tones)
    light = [b for b in buckets if tones[b] / total >= 0.15]
    if len(light) < 2 or (max(light) - min(light)) * 8 < 10:
        return False  # one flat tone: a plain white or gray background
    # Two tones must alternate along the top row, not sit in two big blocks.
    mid = (max(light) + min(light)) * 8 / 2
    row = [sum(small.getpixel((x, 1))) / 3 > mid for x in range(small.width)]
    flips = sum(1 for a, b in zip(row, row[1:]) if a != b)
    return flips >= 4


def check(path):
    with Image.open(path) as im:
        real_format, mode = im.format, im.mode
        rgba = im.convert("RGBA")  # palette transparency becomes a real alpha channel
    print(f"{path.name}: {real_format}, mode {mode}, {rgba.width}x{rgba.height}")
    if real_format not in ("PNG", "WEBP"):
        print(f"  NOT TRANSPARENT: the bytes are {real_format}, which can't store the alpha you need.")
        return "wrong-format"

    hist = rgba.getchannel("A").histogram()
    total = rgba.width * rgba.height
    clear, solid = hist[0], hist[255]
    partial = total - clear - solid
    print(f"  alpha: {clear / total:.1%} transparent, {partial / total:.1%} partial, {solid / total:.1%} opaque")

    if clear == total:
        print("  EMPTY: every pixel is transparent.")
        return "empty"
    if clear + partial == 0:
        if painted_checkerboard(rgba.convert("RGB")):
            print("  FAKE: no transparent pixels, and the frame is a two-tone gray grid. The checkerboard is painted in.")
            return "painted-checkerboard"
        print("  OPAQUE: no transparent pixels. The background is a solid part of the picture.")
        return "opaque"
    if clear == 0 and len([v for v in hist if v]) == 1:
        print("  FADED: one alpha value everywhere. Opacity was lowered; nothing was cut out.")
        return "faded"
    print("  REAL: transparent pixels are present. Check the edges on a dark and a colored background next.")
    return "real"


if __name__ == "__main__":
    if len(sys.argv) < 2:
        sys.exit(__doc__)
    for name in sys.argv[1:]:
        check(Path(name))
```

运行 `python check_transparency.py 你的图片.png`，一次可以跟多个文件。对一张画了格子的合成样例和一张改了后缀的 JPG，输出是这样的：

```text
painted-checkerboard.png: PNG, mode RGB, 512x512
  alpha: 0.0% transparent, 0.0% partial, 100.0% opaque
  FAKE: no transparent pixels, and the frame is a two-tone gray grid. The checkerboard is painted in.
jpeg-renamed.png: JPEG, mode RGB, 512x512
  NOT TRANSPARENT: the bytes are JPEG, which can't store the alpha you need.
```

脚本的提示是英文，六种结果对应的意思和下一步如下：

| 输出 | 意思 | 下一步 |
| --- | --- | --- |
| REAL | 文件里有透明像素 | 叠到深色和彩色底上检查边缘 |
| FAKE | 没有任何透明像素，外圈是两种浅灰交替的格子 | 重新生成，或按后文修复 |
| OPAQUE | 没有任何透明像素，背景是画面的一部分（白底、场景，或没认出来的格子） | 同样不是透明图，按不透明处理 |
| NOT TRANSPARENT | 文件实际是 JPEG 之类存不了透明的格式 | 回到原文件，查保存和转发环节 |
| FADED | 整张图是同一个半透明值，只是调低了不透明度，没有抠出主体 | 重新生成或重新抠图 |
| EMPTY | 所有像素都透明，图是空的 | 重新生成 |

### 脚本在 10 个合成样例上的结果

这个脚本在 Python 3.12.1、Pillow 12.0.0、macOS 上跑过 10 个合成样例，10 个都判对了。样例全是用 Pillow 画的一个红色主体加不同背景，没有一张是 ChatGPT 或 GPT Image 的真实输出：

| 合成样例 | 判定 |
| --- | --- |
| 带 alpha 的 PNG、带 alpha 的 WebP、调色板透明的 PNG | REAL |
| 画了棋盘格的 RGB PNG | FAKE |
| 画了棋盘格、模式是 RGBA 但 alpha 全为 255 的 PNG | FAKE |
| 棋盘格加轻微模糊、随机噪点，再过一遍 JPEG 压缩 | FAKE |
| 白底 PNG | OPAQUE |
| 内容是 JPEG、后缀改成 .png | NOT TRANSPARENT |
| 整体半透明的 PNG | FADED |
| 全透明的空 PNG | EMPTY |

格子的识别条件写在 `painted_checkerboard` 里：取图片外圈一圈边框（宽度是短边的 4%），其中至少 85% 的像素是浅色中性灰，并且分成两种深浅明显不同的色调，沿顶边至少交替 4 次。模型画出来的格子不一定这么规整，格子大小不匀、带透视、颜色偏深或带阴影时，脚本很可能只报 OPAQUE 而不是 FAKE。这不影响主要结论：只要 alpha 那一行显示 100.0% opaque，这个文件就不是透明图。反过来，REAL 只说明文件里存在透明像素，抠得干不干净仍然要看边缘。

## ChatGPT 里要透明背景：只能用文字要求，再检查保存的文件

ChatGPT 界面里没有透明背景的开关。OpenAI 帮助中心的 [Images in ChatGPT](https://help.openai.com/en/articles/11084440-images-in-chatgpt) 写明 ChatGPT Images 可以按指令“make the background transparent”，也可以上传已有图片再描述修改；但页面上没有记载任何透明设置，没有写 Save 下载的是什么格式，也没有说明预览在透明图后面显示什么。所以在 ChatGPT 里你能做的只有两件事：把要求写清楚，然后检查保存下来的文件。界面入口和对应型号见 [ChatGPT Images 2.5 怎么用](https://blog.laozhang.ai/zh/posts/chatgpt-images-2-5)。

由此也能看清一个常见说法的问题：“鼠标移到图上出现棋盘格底纹，就是透明通道生效了”。预览里的格子可能是界面画的底纹，也可能是图里的像素，在预览里分不出来，结论只能从文件里得出。

要求可以这样写，思路来自 OpenAI 提示词指南的做法：写明只要一个独立主体，写明背景透明，再把不想要的东西逐项排除。

```text
画一只橙色柴犬贴纸，只有这一个独立主体，四周留白边。
背景完全透明，输出带透明通道的 PNG。
不要画棋盘格或灰白格子，不要纯色底、场景、投影、文字和水印。
```

后续每改一次图，都把透明要求重说一遍，例如“保持背景透明，只把围巾改成蓝色”。指南里对此有明确提醒：后续编辑要重申保留透明背景，否则这一轮可能又被补上背景。

在 ChatGPT 里要透明却拿到画进图里的格子，这类情况有公开的用户报告。OpenAI 开发者社区 2026 年 5 月到 6 月的一个[帖子](https://community.openai.com/t/having-trouble-getting-transparent-backgrounds-in-chatgpt-images/1380143)里，有用户描述棋盘格被“baked into the image”，不是真正的 alpha 透明；同一个帖子里也有人拿到了真透明或部分透明的结果。这些报告大多出现在 Images 2.5 之前，能说明这种失败存在，说明不了现在出现的频率。至于模型为什么会画格子，常见的解释是它在训练图片里见到的“透明”多数就是格子底纹的样子，于是把格子当成了画面内容；OpenAI 没有公开说明过原因。

拿到假透明图之后，不建议接着说“把棋盘格去掉”。那是又一次生成式编辑，官方指南提醒过，反复编辑可能改动你想保留的细节，需要像素级不变的区域应该把编辑结果合成回原图，而不是只靠提示词。更稳的顺序是：开一个新对话，用原始描述加上面的排除项重新生成；仍然不行，再考虑走 API 用参数控制，或者对现有图片做抠图。

## API 该传什么：background: transparent 加 png 或 webp

调 API 时，透明靠参数，不靠提示词。OpenAI 的[图片生成接口参考](https://developers.openai.com/api/reference/resources/images/methods/generate)对 `background` 的说明是：可取 `transparent`、`opaque`、`auto`，默认 `auto`，这时由模型自己判断用什么背景。也就是说，只在提示词里写“透明背景”而不传这个参数，等于让模型自己决定，它完全可能给你一张白底图，或者一张画了格子的图。

截至 2026 年 10 月 2 日，各型号的支持情况如下：

| 型号 | 透明背景 | 条件 |
| --- | --- | --- |
| `gpt-image-2.5-sunburst`、`gpt-image-2.5-flare`（含 2026-09-08 快照） | 支持 | `output_format` 必须是 `png` 或 `webp` |
| `gpt-image-2`、`gpt-image-2-2026-04-21` | 预览阶段 | 同上 |

编辑接口 `/images/edits` 对 `background` 的说明相同，给已有图片去底时照样要传。两个 2.5 型号在透明上的要求一致，怎么选看速度和编辑精度，见 [GPT Image 2.5 Flare 与 Sunburst 对比](https://blog.laozhang.ai/zh/posts/gpt-image-2-5-sunburst-vs-flare)。

一个按接口参考写出的请求如下。请求本身没有实际发送过；后两行解析和解码命令用一份手写的响应文件在本地试过，能取出字段并还原出 PNG。

```bash
curl -s https://api.openai.com/v1/images/generations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2.5-flare",
    "prompt": "一只橙色柴犬贴纸，单个独立主体，四周留白边。背景完全透明，不要棋盘格、纯色底、场景、投影和水印。",
    "background": "transparent",
    "output_format": "png",
    "size": "1024x1024"
  }' > response.json

jq '{background, output_format}' response.json
jq -r '.data[0].b64_json' response.json | base64 --decode > sticker.png
```

这里有三处值得注意。

**响应里先看两个字段。** 接口参考写明，返回对象里带有 `background`（`transparent` 或 `opaque`，表示这次生成实际使用的背景设置）和 `output_format`（`png`、`webp` 或 `jpeg`）。这是不用解码图片就能做的第一道检查：如果返回的是 `opaque` 或 `jpeg`，文件不可能是透明的，问题在请求没按你的意思执行，不用再去看图。两个字段都对，再把解码出的文件交给上面的检查脚本。

**提示词仍然要配合参数。** 官方指南的做法是参数和提示词一起用：参数设为透明，提示词里写明独立主体，并明说不要纯色底、棋盘格、场景和阴影。参数决定文件有没有 alpha 通道，提示词减少模型往画面里添东西的机会。

**PNG 不要加压缩参数。** 指南写明 `output_compression` 只用于 JPEG 或 WebP 输出。另外，GPT Image 系列一律返回 Base64 图片数据，不返回链接，解码时直接写成二进制文件，不要经过任何会转格式的中间步骤。

如果你是通过工作流工具调用，要确认它真的把 `background` 传出去了。以 n8n 为例，原生节点传不了这个参数，需要改用 HTTP Request 节点，细节见 [n8n 接入 GPT Image 2.5：原生节点够不够用](https://blog.laozhang.ai/zh/posts/gpt-image-2-5-n8n)。通过 Responses API 的图片生成工具调用时，官方指南写的是可以调整质量、尺寸、格式和压缩，没有单独列出 `background`，按你用的型号查对应的参考文档再决定。

## 中转平台调用后参数没生效：先查型号路线支不支持 background

通过第三方 API 平台（常被叫作中转、网关或聚合平台，指用它们的地址和密钥去调用 OpenAI 模型的服务）调用时，同样叫 GPT Image 2.5，不同型号路线对 `background` 的支持可以完全不同。请求里写了 `transparent` 却拿到白底或格子，先别怀疑提示词，先查你用的那个型号在平台文档里有没有承诺这个参数。

LaoZhang API 的 [GPT Image 2.5 文档](https://docs.laozhang.ai/en/api-capabilities/gpt-image-2-5)是一个具体例子，同一个平台上就有三类路线：

| 路线 | 型号 | 文档对透明背景的说法 |
| --- | --- | --- |
| 按次计费 | `gpt-image-2.5-flare-vip`、`gpt-image-2.5-sunburst-vip` | 写明可以生成透明背景图，也可以给上传的图片去底，传 `"background": "transparent"` 和 `"output_format": "png"` |
| 官方转发 | `gpt-image-2.5-flare`、`gpt-image-2.5-sunburst` | 使用 OpenAI 的参数，按 token 计费 |
| 网页路线 | `gpt-image-2.5-web` | 不能选 Flare 或 Sunburst，支持哪些参数取决于控制台配置和实际结果，文档明确说不要假设 VIP 的选项在这里可用 |

也就是说，在网页路线上传了 `background`，平台并没有承诺它会生效；想要透明，就该换到写明支持的型号。其他平台同理，文档里找不到关于 `background` 的说明时，按“不支持”对待，用一张图验证后再批量跑。响应里的 `background` 和 `output_format` 两个字段在第三方平台上是否原样返回，各家不一样，没有这两个字段时只能靠检查文件。

如果你要的是一条按次计费、文档写明支持透明参数的路线，上表第一行的两个型号截至 2026 年 9 月 24 日的公开价格是每次 $0.03，接口地址为 `https://api.laozhang.ai/v1`，生成和编辑分别走 `/v1/images/generations` 与 `/v1/images/edits`。这些信息出自该平台文档，这里没有做过付费调用来验证输出；文档同时写明这两个型号不支持 `mask` 局部编辑，并且在 2026 年 9 月 16 日到 22 日期间曾不可用，之后恢复。官方按 token 计费和按次计费怎么比较，见 [GPT Image 2.5 Sunburst 价格：官方单图费用与按次计费怎么选](https://blog.laozhang.ai/zh/posts/gpt-image-2-5-api-pricing)。

## 下载后变白底、发出去变白底：JPG、截图和转码都会丢透明

生成出来确实透明，到了用的地方却变成白底或黑底，问题在生成之后的环节。逐项对照：

- **存成或转成了 JPG。** JPEG 没有 alpha 通道，透明区域会被填成纯色。API 里把 `output_format` 设成 `jpeg` 同理，官方参考要求透明必须配 `png` 或 `webp`。
- **用的是截图。** 截图记录的是屏幕上显示的样子，得到一张新的不透明图片。
- **经过了会重新压缩的渠道。** 聊天软件发图、部分网站上传图片时可能把文件转成 JPEG 再分发，这一点因平台而异，没有逐个测试过。稳妥的做法是用“文件”或“原图”方式发送，对方收到后跑一次检查脚本。
- **在编辑器里“另存为”时合并了背景。** 导出时选 PNG 或 WebP，并确认保留透明的选项开着。

排查顺序很简单：对最初保存的那个文件跑检查脚本，结果是 REAL，说明生成没问题，沿着文件走过的每一步往后查；结果已经是 OPAQUE、FAKE 或 NOT TRANSPARENT，问题在生成或下载那一步，回到前面两节。

## 假透明棋盘格怎么办：脚本能救纯色主体，白色主体会被吃掉

手里只有一张画了格子的图，主体又是颜色饱和、边缘硬朗的扁平图形（贴纸、图标、像素风素材），可以直接把格子改成真透明。下面的脚本从图片四条边出发，沿着浅色中性灰的像素一路扩散，扩散到的像素全部改成透明，碰到主体的颜色就停。因为只处理和图片边缘连通的区域，被主体包在里面的白色（眼白、牙齿、标签）不会被动到。

```python
"""Turn a painted light-gray/white checkerboard into real transparency.

Usage: python remove_painted_checkerboard.py fake.png fixed.png
Requires Pillow (pip install pillow).

Works by flood-filling from the image border through light, neutral pixels.
It only reaches background that touches the border, so white areas enclosed by
the subject (eyes, teeth, a label) are kept. It can't separate a white or
light-gray subject edge from the grid, and it leaves a thin light rim on soft
edges.
"""
import sys
from collections import deque

from PIL import Image

src, dst = sys.argv[1], sys.argv[2]
im = Image.open(src).convert("RGBA")
w, h = im.size
px = im.load()


def is_grid(p):
    r, g, b, _ = p
    return max(r, g, b) - min(r, g, b) <= 14 and min(r, g, b) >= 170


seen = bytearray(w * h)
queue = deque()
for x in range(w):
    queue.append((x, 0))
    queue.append((x, h - 1))
for y in range(h):
    queue.append((0, y))
    queue.append((w - 1, y))

removed = 0
while queue:
    x, y = queue.popleft()
    i = y * w + x
    if seen[i]:
        continue
    seen[i] = 1
    if not is_grid(px[x, y]):
        continue
    px[x, y] = (0, 0, 0, 0)
    removed += 1
    if x > 0:
        queue.append((x - 1, y))
    if x < w - 1:
        queue.append((x + 1, y))
    if y > 0:
        queue.append((x, y - 1))
    if y < h - 1:
        queue.append((x, y + 1))

im.save(dst)
print(f"{removed / (w * h):.1%} of the pixels made transparent -> {dst}")
```

运行 `python remove_painted_checkerboard.py fake.png fixed.png`，再用检查脚本验一遍输出文件。在干净的合成样例上，两步的输出是：

```text
76.0% of the pixels made transparent -> fixed.png
fixed.png: PNG, mode RGBA, 512x512
  alpha: 76.0% transparent, 0.0% partial, 24.0% opaque
  REAL: transparent pixels are present. Check the edges on a dark and a colored background next.
```

### 修复脚本在合成样例上的结果与失败边界

同样是 Pillow 画的合成图：512×512，红色主体，中间有一块被主体包住的白色标签，背景是白与浅灰交替的格子。把修复结果和原始的透明蒙版逐像素比对，得到：

| 合成样例 | 背景被清除 | 红色主体损失 | 被包住的白色标签保留 | 修复后复检 |
| --- | --- | --- | --- | --- |
| 干净的棋盘格 | 100.0% | 0% | 100% | REAL |
| 模糊、加噪点并经过 JPEG 压缩的棋盘格 | 99.63% | 0% | 100% | REAL |
| 近白色主体直接贴着棋盘格 | 不适用 | 100% | 不适用 | 主体整个消失 |

![修复脚本在合成样例上的适用边界：红色主体和被包住的白标签修复后完整保留，近白色主体贴着格子时被整个清掉，头发、软阴影和柔和边缘无法重建](https://blog.laozhang.ai/posts/zh/gpt-image-transparent-background-checkerboard/img/checkerboard-fix-script-limits.webp)

这组数字划出了脚本的适用范围，用之前对照一下自己的图：

- **白色、浅灰的主体不能用。** 第三行就是失败边界：主体颜色和格子落在同一个范围（三个通道相差不超过 14、最暗的通道不低于 170）并且挨着背景时，扩散会一路穿过去，测试里主体像素 100% 被清掉。白色 Logo、白衣服、白色产品、浅色描边都属于这一类。
- **边缘是硬的。** 修复后的文件里半透明像素为 0%，每个像素要么全透明要么全不透明。放大看是锯齿边；原图边缘如果是柔和过渡，会留下一圈细的浅色边。
- **头发、玻璃、烟雾、软阴影救不回来。** 这些地方需要半透明信息，而假透明图里已经没有这份信息了，脚本不会凭空重建。
- **带噪点的图清不干净。** 第二行还剩 0.37% 的背景像素没清掉，往往是零星的小点，叠到深色底上能看到。
- **样例不是模型输出。** 模型画的格子如果颜色偏深、带阴影或渐变，落在阈值之外的部分会原样留下。

超出这个范围时，按主体能不能变来选：

1. 主体可以重画：回到生成那一步。API 带上 `background` 和 `output_format` 重新请求；ChatGPT 里开新对话重新生成。
2. 主体必须保持不变，而且边缘复杂：把这张图当成普通的“有背景图片”去抠，用带选区或专门去底功能的工具处理，各类工具怎么选见[透明底图片怎么做：按素材选方法，再确认真的透明](https://blog.laozhang.ai/zh/posts/transparent-image-maker)。
3. 不要让模型“只去掉格子”，原因前面说过：那是一次新的生成，主体可能被重画。

抠完或重做之后，都再跑一遍检查脚本，并叠到深色底上看边缘。

## 透明背景与棋盘格的几个相邻问题

### GPT Image 不是不支持透明图吗？

“不支持”在 2026 年 8 月之前是对的，现在已经过时。2026 年 8 月之前，OpenAI 的文档写的是 `gpt-image-2` 不支持透明背景；2026 年 8 月起，API 里的 `gpt-image-2` 以预览形式开放了透明背景；快照日期为 2026-09-08 的两个 GPT Image 2.5 型号则直接支持，不带预览标注。遇到互相矛盾的说法，先看它的发布日期，再以 OpenAI 接口参考里 `background` 参数的当前说明为准。

### 2K、4K 会出棋盘格，换成 1K 才是真透明吗？

OpenAI 的接口参考里找不到这样的规定：`background` 的说明没有把透明和任何尺寸或质量档位挂钩，只要求输出格式是 `png` 或 `webp`。这个说法流传于 `gpt-image-2` 开放透明预览之前，当时的观察不能直接套到现在。想确认尺寸有没有影响，用同一组参数各生成一张，对文件跑检查脚本，比任何经验之谈都可靠。

### gpt-image-2 和 GPT Image 2.5 在透明背景上要区别对待吗？

参数写法一样，稳定性的承诺不一样。两者都是 `background` 设为 `transparent` 加 `png` 或 `webp`，但 `gpt-image-2` 的透明支持标注为预览，2.5 的两个型号没有这个标注。新项目直接用 2.5；仍在用 `gpt-image-2` 的流程，更要对每一张输出做文件检查。

### 图片里出现细密的格子纹理，但我没要透明背景，是同一个问题吗？

不是。假透明的格子出现在主体之外的背景区域，是模型把“透明”画成了图案；普通不透明图片上铺满整张图的规律细网格、颗粒感，属于画质问题，处理思路完全不同，见 [GPT Image 2.5 噪点、颗粒感：找到变脏的那一步再修](https://blog.laozhang.ai/zh/posts/gpt-image-2-5-noise-grainy)。
