Для прозрачного изображения у gpt-image-2 задайте background: "transparent" и output_format: "png" либо "webp". По состоянию на 8 сентября 2026 года эта возможность находится в предварительном доступе — preview. JPEG для такой задачи не подходит. Текущие условия указаны в документации OpenAI по настройке результата.
Дальше нужно выполнить две разные проверки: убедиться, что API вернул нужный формат с прозрачными пикселями, и оценить, пригоден ли контур для размещения на другом фоне. Пустой прозрачный холст проходит простую проверку «есть альфа-канал», но не решает задачу. Светлый ореол вокруг товара тоже может сохраниться в технически корректном PNG.
Почему встречаются сообщения, что прозрачность не поддерживается
Старое описание ограничения и ошибка сегодняшнего запроса требуют разных действий. Если руководство утверждает, что GPT Image 2 вообще не умеет делать прозрачный фон, сверьте дату и раздел о прозрачности в текущей документации OpenAI: на дату обновления этой статьи официальный API уже описывает такую возможность в preview. Старый отказ не доказывает, что ограничение действует сейчас.
Если ошибку возвращает конкретный сервис, выясните, куда отправлен запрос. Примеры ниже обращаются к api.openai.com. Совместимый шлюз может использовать такое же имя модели, но по-другому обрабатывать параметры или предоставлять другую версию модели. Сохраните адрес сервиса, параметры без ключа и полное сообщение ошибки; проверьте его собственную документацию. Отказ шлюза ещё не означает, что официальный API не поддерживает прозрачность. И наоборот, описание официального API не подтверждает возможности каждого шлюза.
Интерфейс ChatGPT — отдельный случай: эти параметры относятся к API, а наличие соответствующей настройки в интерфейсе здесь не проверяется. Если картинка уже получена, переходите к проверке самого файла: белый или чёрный фон окна просмотра не позволяет определить, есть ли в нём прозрачные пиксели.
Сначала выберите формат результата
Оба варианта сохраняют прозрачность. Выбор зависит от того, куда пойдёт файл и как он будет обрабатываться.
| Задача | Что указать в запросе | Что сохранить |
|---|---|---|
| Исходный материал для дальнейшего редактирования | output_format: "png", без output_compression | Файл .png, MIME image/png |
| Материал для сайта, который принимает WebP | output_format: "webp", сжатие по необходимости | Файл .webp, MIME image/webp |
| Непрозрачная версия на выбранной подложке | Сначала получить прозрачный исходник, затем отдельно наложить фон | Самостоятельный производный файл, не замена исходника |
Для PNG параметр output_compression не передают. Для WebP он необязателен: например, значение 80 задаёт настройку сжатия API, но не означает уменьшение файла на 80%, скидку на токены или гарантированное сжатие без потерь. Эти правила описаны в официальном руководстве по GPT Image. Сам формат WebP поддерживает прозрачность, сжатие с потерями и без потерь; это не обещание конкретного режима для каждого ответа API.
Если последующая система ещё не проверена на WebP, начните с PNG и оставьте его как исходник. Расширение нельзя просто переименовать: файл badge.webp, внутри которого лежат байты PNG, остаётся PNG.

Создайте изображение и сохраните ответ отдельно
Пример ниже использует официальный Images API, cURL и Python 3. Ключ должен быть заранее задан в переменной окружения OPENAI_API_KEY. Для работы с локальными изображениями установите Pillow:
bashpython3 -m pip install Pillow
Создадим изображение в WebP. В описании задаётся изолированный предмет; настоящий прозрачный фон дополнительно запрашивается параметром API.
bashcurl --fail-with-body --silent --show-error \ https://api.openai.com/v1/images/generations \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-image-2", "prompt": "Один эмалевый значок в форме маяка. Изолированный предмет на полностью прозрачном фоне. Без сцены, сплошной подложки, нарисованной шахматной сетки и падающей тени.", "background": "transparent", "output_format": "webp", "output_compression": 80, "size": "1024x1024", "quality": "medium" }' \ --output response.json
Если cURL завершился с ошибкой, сначала прочитайте response.json; не запускайте декодирование старого успешного ответа. Параметр --fail-with-body требует cURL 7.76.0 или новее. При сетевом сбое тело ответа может отсутствовать, поэтому проверьте и сообщение cURL.
Для PNG замените "webp" на "png" и удалите строку output_compression. Остальные требования прозрачности сохраняются. Режим background: "auto" оставляет выбор модели и не заменяет явный запрос прозрачного фона.
В Images API изображение возвращается как base64 в поле data[0].b64_json. Сохраните следующий код в save_image.py: он проверит структуру ответа, декодирует байты, распознает изображение и только потом запишет файл.
pythonimport base64 import io import json import sys from pathlib import Path from PIL import Image response_path, requested_format, output_path = sys.argv[1:] expected = {"png": "PNG", "webp": "WEBP"}[requested_format] if Path(output_path).suffix.lower() != "." + requested_format: raise SystemExit("Расширение не соответствует запрошенному формату") payload = json.loads(Path(response_path).read_text(encoding="utf-8")) if payload.get("error"): raise SystemExit("API вернул ошибку: " + str(payload["error"])) try: encoded = payload["data"][0]["b64_json"] except (KeyError, IndexError, TypeError): raise SystemExit("В ответе нет data[0].b64_json") if not isinstance(encoded, str) or not encoded: raise SystemExit("Пустое или некорректное поле b64_json") raw = base64.b64decode(encoded, validate=True) with Image.open(io.BytesIO(raw)) as image: actual = image.format image.load() if actual != expected: raise SystemExit(f"Ожидался {expected}, получен {actual}") Path(output_path).write_bytes(raw) print(f"Сохранён {actual}: {len(raw)} байт, {output_path}")
Запустите его после успешного запроса:
bashpython3 save_image.py response.json webp badge.webp
Для PNG используйте python3 save_image.py response.json png badge.png. Декодер сохраняет исходные байты без повторного сжатия. Ошибочная base64-строка или повреждённое изображение вызовет исключение до записи файла. Само успешное сохранение ещё не доказывает прозрачность.
Проверьте альфа-канал и видимость предмета
У восьмибитного альфа-канала значение 0 означает полную прозрачность, 255 — полную непрозрачность, значения между ними — частичную прозрачность. Перевод изображения в RGBA добавляет канал, если его не было; он не удаляет белый фон. Поэтому важны значения пикселей, а не только название режима.
Сохраните код в check_alpha.py и передайте ему путь к PNG или WebP. Он также создаст две непрозрачные копии для просмотра контура; исходник останется неизменным.
pythonimport sys from pathlib import Path from PIL import Image path = Path(sys.argv[1]) with Image.open(path) as source: detected_format = source.format rgba = source.convert("RGBA") histogram = rgba.getchannel("A").histogram() clear = histogram[0] partial = sum(histogram[1:255]) solid = histogram[255] total = rgba.width * rgba.height print("Формат:", detected_format, "Размер:", rgba.size) print("Прозрачные:", clear, "Полупрозрачные:", partial, "Непрозрачные:", solid) if clear == total: raise SystemExit("Изображение полностью прозрачное: видимого предмета нет") if solid == total: raise SystemExit("Изображение полностью непрозрачное") print("Прозрачность присутствует; качество контура нужно проверить отдельно") for label, color in [("light", (255, 255, 255, 255)), ("dark", (24, 24, 24, 255))]: background = Image.new("RGBA", rgba.size, color) preview = Image.alpha_composite(background, rgba).convert("RGB") preview.save(path.with_name(path.stem + "-" + label + ".png"))
bashpython3 check_alpha.py badge.webp
Методы чтения изображения и альфа-канала описаны в документации Pillow. Здесь нет универсального порога «правильной доли прозрачности»: у стекла или дыма может не быть полностью непрозрачных пикселей, а у крупного предмета — мало пустого пространства. Даже единственный полупрозрачный пиксель достаточен для сообщения о наличии прозрачности, но недостаточен для признания всего фона прозрачным.
Откройте badge-light.png и badge-dark.png. Белая кайма заметнее на тёмном фоне, тёмное загрязнение — на светлом. Проверьте отверстия внутри предмета, мелкие детали, волосы, мех и мягкое свечение. Нарисованная шахматная сетка останется видимой на обеих подложках; интерфейсная сетка, обозначающая настоящую прозрачность, в эти копии не попадёт.
Если исходник выглядит белым в просмотрщике, но свободное пространство вокруг предмета принимает цвет обеих подложек, белый цвет задавал просмотрщик. Повторная генерация ради этого не нужна. Если белый прямоугольник сохраняется и на тёмной копии, он находится в самом изображении. Для проверки скачайте оригинальный PNG или WebP: скриншот окна уже содержит фон интерфейса и не заменяет исходный файл.
Если исходное фото уже есть, отправьте его на редактирование
Для удаления фона используйте /v1/images/edits. Перечислите свойства, которые должны сохраниться, и снова задайте прозрачный фон и нужный формат. Например, для фотографии product.png:
bashcurl --fail-with-body --silent --show-error \ https://api.openai.com/v1/images/edits \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -F 'model=gpt-image-2' \ -F 'image=@product.png' \ -F 'prompt=Удали фон вокруг товара. Сохрани форму, пропорции, цвет и надпись на этикетке. Полностью прозрачный фон, без подложки, шахматной сетки и ненужной тени. Чистый контур без светлого ореола.' \ -F 'background=transparent' \ -F 'output_format=png' \ --output edited-response.json
После успешного запроса выполните python3 save_image.py edited-response.json png product-cutout.png, затем python3 check_alpha.py product-cutout.png.
При следующем изменении — например, цвета крышки — повторите background=transparent и требование сохранить прозрачность в описании. Передайте предыдущий прозрачный файл как исходное изображение. Это помогает удержать задачу, но не гарантирует неизменность формы или букв на этикетке. Если надпись или точная геометрия критичны, сравните их с оригиналом; для точного вырезания существующего предмета может потребоваться отдельная маска.
Как перейти из PNG в WebP и не потерять прозрачность
Если исходник уже получен в PNG, новый запрос к модели ради другого расширения не нужен. Для локальной конвертации Pillow позволяет явно выбрать сжатие WebP без потерь:
pythonfrom PIL import Image with Image.open("badge.png") as source: rgba = source.convert("RGBA") rgba.save("badge-lossless.webp", format="WEBP", lossless=True, exact=True)
Параметр lossless=True относится к локальному кодировщику Pillow, а exact=True сохраняет RGB-значения полностью прозрачных пикселей. Это настройки записи WebP в Pillow, не аналоги output_compression в API. Они не обещают, что новый файл обязательно окажется меньше PNG.
Снова выполните python3 check_alpha.py badge-lossless.webp. В рабочей обработке не вставляйте convert("RGB") перед сохранением прозрачного файла: этот режим не хранит альфа-канал. В примере проверки выше RGB используется намеренно, только для копий с уже наложенным светлым или тёмным фоном.
При загрузке на сайт назначьте правильный MIME и проверьте именно скачанный конечный файл. Генератор миниатюр, редактор, оптимизатор изображений или CDN могут изменить формат и добавить подложку после загрузки исходника.

Что делать, если результат не подходит
| Наблюдение | Следующее действие |
|---|---|
| API отклонил запрос | Прочитать тело ошибки; проверить модель, background, формат и отсутствие output_compression для PNG |
| HTTP 200, но поля изображения нет | Проверить структуру ответа; не сохранять JSON или текст ошибки как картинку |
| Декодер обнаружил другой формат | Сверить запрос и фактический ответ; не исправлять несовпадение одним переименованием |
| Все значения Alpha равны 255 | Проверить явное требование прозрачности и итоговый запрос; белый фон сам не исчезнет при конвертации |
| Все значения Alpha равны 0 | Результат пустой; нужен видимый предмет, а не только прозрачный холст |
| В просмотрщике виден белый или чёрный фон | Проверить скачанный оригинал скриптом и открыть две копии на разных подложках; цвет окна сам по себе не доказывает потерю прозрачности |
| Прозрачность есть, но виден ореол или испорчена этикетка | Сравнить с оригиналом на разных подложках; исправить контур или воспользоваться маской |
| После следующей правки появился фон | Проверить параметры нового редактирования и повторить требование прозрачности |
| Исходник исправен, файл с сайта непрозрачен | Сравнить версии до и после конвертера, миниатюр и CDN; найти первый этап потери Alpha |
Для стороннего сервиса совместимость нужно проверять на фактическом ответе: одинаковое имя модели и статус 200 сами по себе не подтверждают передачу параметров прозрачности. Не сохраняйте ключ в диагностическом журнале; достаточно параметров запроса без секрета, сообщения ошибки, определённого формата и статистики альфа-канала.
Если нужно выбрать способ подключения или разобраться в различии Images API и генерации через Responses, продолжите с руководством по GPT Image 2 API. Для готового прозрачного материала сохраняйте исходные байты и проверяйте файл повторно после преобразований: это позволяет отделить ошибку генерации от потери прозрачности при доставке.



