Чтобы получить три рекламных формата из одного фото товара, оставьте реальный товар вырезанным и сгенерируйте только окружение вокруг него. Сделайте отдельный фон для каждого формата, положите сверху исходный пакет и наберите заголовок в редакторе. Модель, которая перерисовывает пакет, может изогнуть букву на этикетке; композитинг сохраняет сфотографированные пиксели. По нашим проверкам действующего каталога и цен от октября 2026 года генерация всего набора стоит около $0.21.
Пример — кремовый пакет кофе с графитовой этикеткой, сложенной медной верхушкой и надписью «RIVER NOTES / WHOLE BEAN / 250 g», который сдаётся в 1:1 (1080 × 1080), 4:5 (1440 × 1800) и 9:16 (1080 × 1920).
Выберите маршрут по тому, что должно остаться точным
| Что должно остаться точным | Маршрут | Стоимость всех трёх форматов |
|---|---|---|
| Этикетка, форма и каждое напечатанное слово | Сгенерировать фон с GPT Image 2 и скомпоновать исходный пакет | $0.2021, плюс $0.0048 за вырезание |
| То же самое, и свет с тенью должны идти за пакетом | Положить пакет на холст, дать GPT Image 2 Edit обрисовать его через маску, затем положить исходник сверху | $0.2316, плюс $0.0048 за вырезание (по одному исходному изображению на формат) |
| Пакет можно переосветить или перерисовать | Nano Banana Pro Edit с фото на входе | $0.2004 ($0.0668 за изображение; не более $0.3242 при переходе на официальный маршрут) |
Все цифры указаны для 2K, среднего качества, одного вывода на формат, без повторов. Для самого простого пути берите 2K: квадрат 1K рендерится в 1024 px, то есть ниже холста 1080. 1K стоит примерно вдвое дешевле ($0.101 за набор), но тогда каждому файлу понадобится увеличение до 2K ($0.012 за файл), и именно в этом дополнительном шаге появляется мягкость. По цене 1K и 2K у Nano Banana Pro одинаковые.
Если вам нужен только новый формат и устраивают перерисованные края, руководство по outpainting описывает маршрут в один вызов по $0.024 за изображение; его результат ограничен 1536 px по длинной стороне, поэтому форматы 4:5 и 9:16 пришлось бы увеличивать.
Настройте три холста
| Холст | Пакет | Зона текста | Почему |
|---|---|---|---|
| 1080 × 1080 | По центру x=760, основание y=940, высота около 640 px | Левая колонка x=80–480, заголовок ближе к y=250 | Рекомендуемый минимум Meta для 1:1 — 1080 × 1080 |
| 1440 × 1800 | По центру x=720, основание y=1600, высота около 930 px | Верхняя полоса y=140–500 | Минимум Meta для 4:5 в Facebook Feed — 1440 × 1800 (в Instagram Feed указана ширина 1080); 1080 × 1350 ниже порога |
| 1080 × 1920 | По центру x=540, основание y=1230, высота около 680 px | Заголовок y=300–470 | Держит пакет и текст между y≈270 и y≈1250 |
Для объявлений 1:1 и 4:5 в Instagram Feed Meta просит держать нижний и боковые края свободными от ключевых элементов; около 100 px — безопасный запас. Для 9:16 Meta просит оставить свободными верх, низ и боковые стороны, а её наложение безопасной зоны в Ads Manager рисует точную рамку. Руководства, которые это измеряют, дают отступы примерно 14 % сверху, 35 % снизу и 6 % по бокам, то есть около 270, 670 и 65 px при 1080 × 1920. Вот почему пакет в формате сторис стоит выше, чем вы поставили бы его сначала. Другие платформы используют другие наложения, поэтому перед экспортом проверьте превью каждой площадки.
Квадрат разносит текст влево и вправо от товара, портрет складывает текст поверх товара, а вертикальный формат держит всё в средней полосе. Масштабируйте пакет равномерно: растягивание под холст меняет пропорции упаковки. Сохраняйте ракурс съёмки во всех трёх: фронтальный снимок не покажет заднюю панель или боковой шов, а сгенерированный бок — это макет, а не ваша упаковка.

Иллюстрация трёх пропорций, созданная ИИ, с пакетом кофе в каждой; реальные макеты следуют таблице координат выше.
Попробуйте в Playground
Выполните эти шаги в Playground; код и маршрут через Agent — ниже.
- Откройте Background Remover, останьтесь на вкладке Playground в режиме Form (чтобы запустить, войдите с пополненным счётом), добавьте фото пакета в Input image и запустите. Сохраните прозрачный PNG.
- Откройте GPT Image 2 text to image с уже подставленным промптом 1:1. Задайте Aspect ratio как
1:1, Resolution как2k, Quality какmedium(low, пока вы настраиваете) и Output format какpng, проверьте оценку цены и запустите. - Повторите с
4:5и9:16, подставив фразы размещения из промптов ниже, затем скомпонуйте исходный пакет в редакторе.
Вырежьте пакет один раз
Отправьте лучшее фото, где виден весь пакет и читается этикетка, в Background Remover: один URL изображения на входе, прозрачный PNG исходного размера на выходе, $0.0048. Руководство по удалению фона описывает проверки края. Посмотрите на край при 200 % на тёмной и на светлой заливке и сохраните медную складку и маленькие тени в складках, вместо того чтобы расплющить пакет в прямоугольник.
Держите исходный файл отдельно от вырезанного. Если в оригинале есть жёсткая контактная тень, смягчите или уберите её до того, как класть пакет на новую поверхность, иначе в композиции окажутся две конфликтующие тени. Если фото слишком маленькое для запланированного размера пакета, уменьшите пакет в макете или возьмите фото побольше. Более резкая сгенерированная этикетка — это не печатная этикетка.
Сгенерируйте фоны
Откройте GPT Image 2 text to image с настройками из шагов Playground выше и выберите соотношение сторон для каждого формата. Пишите в каждый промпт направление света вашей фотографии; в примере пакет освещён сверху слева, как в промптах ниже. Для 1:1 используйте:
Photographic still-life advertising background, empty warm stone tabletop in the lower third, softly lit charcoal wall, gentle window light from upper left, subtle warm copper accents far in the background. Leave the right half of the tabletop clear for a coffee bag to be composited later. Leave the left half of the wall quiet and low-detail for editable copy. No product, no lettering, no logo, no cup in the reserved product area.
Для 4:5 замените фразы размещения на:
Leave the lower centre clear for a coffee bag to be composited later; keep the upper third as a simple charcoal wall for editable copy.
Для 9:16 используйте:
Vertical photographic background with a broad clear tabletop below the centre. Reserve the central lower-middle area for a coffee bag, with quiet charcoal wall above and uncluttered space below. No lettering, no product, no foreground props.
Не добавляйте пакет в фон, чтобы ни одна синтетическая упаковка не конкурировала с оригиналом. Кофейные зёрна можно добавить позже отдельным элементом, подальше от этикетки и от края контакта пакета. Чтобы сэкономить во время настройки промпта, сначала запустите его с Quality на low (около $0.024 на все три в 2K) и переключитесь на medium, когда пустые зоны лягут туда, где их ждёт макет. Сверьте полученный размер в пикселях с холстом; если он меньше, увеличьте его уровнем 2K в Image Upscaler ($0.012, см. руководство по увеличению), а не растягивайте в редакторе.
Скомпонуйте пакет и наберите текст
Поставьте вырезанное изображение по координатам выше. Добавьте прямо под основанием мягкую контактную тень (размытый тёмный эллипс в режиме multiply примерно на 30–40 %) и более слабую широкую тень, уходящую от света. Если пакет освещён справа, а фон слева, перегенерируйте фон со светом справа вместо того, чтобы рисовать конфликтующие блики поверх печатной упаковки. Бледный контур вокруг пакета — это проблема края вырезания: уменьшите его выделение на пиксель-два, ничего не перегенерируя.
Наберите заголовок и призыв к действию в редакторе. Оставьте факты о товаре вроде «250 g» такими, как они даны, и не добавляйте ничем не подтверждённых утверждений.
Тот же шаг в Pillow, для холста 1080 × 1080 (пакет ставится по основанию, как в таблице):
from PIL import Image, ImageFilter
bg = Image.open("bg-1x1.png").convert("RGBA").resize((1080, 1080))
bag = Image.open("bag-cutout.png").convert("RGBA")
h = 640
bag = bag.resize((round(bag.width * h / bag.height), h), Image.LANCZOS)
x, base_y = 760 - bag.width // 2, 940
shadow = Image.new("L", bg.size, 0)
shadow.paste(90, (x + 20, base_y - 12, x + bag.width - 20, base_y + 12))
shadow = shadow.filter(ImageFilter.GaussianBlur(14))
dark = Image.new("RGBA", bg.size, (20, 12, 8, 255))
bg = Image.composite(dark, bg, shadow)
bg.alpha_composite(bag, (x, base_y - h))
bg.convert("RGB").save("ad-1x1.png")Сохраните многослойный мастер с отдельными слоями фона, товара, тени и текста и экспортируйте из него каждый формат. Тогда новая цена или новый заголовок не требуют новой генерации и не могут изменить этикетку.
Пусть модель обрисует всё вокруг пакета
Если композиция выглядит приклеенной, дайте GPT Image 2 Edit нарисовать окружение. Прозрачные области маски указывают, где редактировать, но не гарантируют неизменность пикселей вне их; наложение исходного товара на шаге 4 сохраняет сфотографированную этикетку нетронутой.
- Поместите вырезанное изображение на плоский нейтральный холст с тем же соотношением сторон, что и результат, и выгрузите его как исходное изображение. В 2K модель возвращает 2048 px по длинной стороне квадрата, поэтому собирайте холст в этом размере (для 1:1 это 2048 × 2048, а пакет масштабируется с тем же коэффициентом, что и в таблице холстов), либо уменьшите результат до размера холста перед финальным наложением.
- Выгрузите только слой товара: пакет непрозрачный, всё остальное прозрачное, в том же размере в пикселях, что и источник.
- Откройте GPT Image 2 Edit в Playground. Добавьте холст в Images, откройте Advanced parameters и добавьте слой товара в Mask (прозрачные пиксели перерисовываются, непрозрачные сохраняются). Задайте Aspect ratio по холсту, Resolution как
2kи Input Fidelity какhigh, затем используйте промпт вроде: «Paint a warm stone tabletop and charcoal wall around the existing coffee bag. Keep the bag unchanged. Soft window light from the left with a natural contact shadow under the bag. Leave the upper third as quiet wall for copy.» - Наложите исходный вырез на результат — по тем же пикселям, вокруг которых рисовала модель, — до добавления текста, чтобы этикеткой осталась сфотографированная, что бы ни случилось по краю.
Модель видит пакет, пока рисует, поэтому свет и тень могут идти за ним. Исходное изображение добавляет $0.0098 за запрос: $0.0959 (1:1), $0.0778 (4:5) и $0.0579 (9:16) в 2K medium.
Когда сам пакет может измениться
Выбирайте Nano Banana Pro Edit, если хотите переосветить пакет в новой сцене и готовы проверить изменения в его складках, этикетке и силуэте. Добавьте фото товара в Images, задайте Resolution как 2k, выберите Aspect ratio и используйте:
Place the coffee bag from the supplied photograph on a warm stone tabletop against a charcoal wall. Preserve its cream package, copper folded top, charcoal label and overall proportions. Soft window light from the left. Leave clear space above for copy. Do not add claims, extra logos or extra products.
Если вы прикладываете утверждённую графику этикетки вторым изображением, укажите, какое изображение — пакет, а какое — этикетка. Просьба сохранить ничего не гарантирует. Если «250 g» превратится в другое количество, замените этикетку утверждённой графикой в финальной композиции или вернитесь к маршруту только с фоном.
Вызовите из кода
Тот же вызов фона для формата 9:16 (установите через pip install spicyapi и задайте SPICY_API_KEY); затем шаг с Pillow выше ставит пакет. Около $0.048 за изображение.
import uuid
from spicyapi import SpicyClient, output_assets
client = SpicyClient() # reads SPICY_API_KEY from the environment
task = client.create_task(
model="openai/gpt-image-2/text-to-image",
input_data={
"prompt": "Vertical photographic background with a broad clear tabletop below the centre. Reserve the central lower-middle area for a coffee bag, with quiet charcoal wall above and uncluttered space below. No lettering, no product, no foreground props.",
"aspect_ratio": "9:16",
"resolution": "2k",
"quality": "medium",
"output_format": "png",
},
idempotency_key=str(uuid.uuid4()), # new key per new request; reuse only to retry the same one
)
print("Resume task:", task["taskId"], flush=True)
final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
raise RuntimeError(f"Task {task['taskId']} ended as {final['state']}")
assets = output_assets(final)
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")
print(assets[0]["url"])Остальное описывает справочник по Python SDK.
Или поручите Agent
Сохраните поля input в файл input.json, затем выполните npx @spicyapi/cli tasks create --model openai/gpt-image-2/text-to-image --input-file input.json --wait (CLI). С MCP-сервером ваш ассистент вызывает spicyapi_task_create, который показывает цену для подтверждения, а затем spicyapi_task_wait. Или установите Agent Skill командой npx skills add spicyapi-ai/spicy-skill.
Исправьте типичные проблемы
| Проблема | Исправление |
|---|---|
| Этикетка выглядит мягкой в итоговом размере | Уменьшите пакет или возьмите фото с более высоким разрешением; сохраните исходные пиксели этикетки. |
| Пакет кажется висящим в воздухе | Перенесите контактную тень на настоящее основание и закройте зазор. |
| Свет товара и фона расходится | Укажите направление света с фото в промпте фона или используйте редактирование по маске. |
| Текст налезает на медную складку | Перенесите текст в отведённую зону; не сжимайте пакет. |
| Вертикальная версия теряет основание или попадает в интерфейсную полосу | Пересоберите её из слоёв по координатам 9:16; не кадрируйте квадрат. |
| Сгенерированная сцена меняет текст упаковки | Вернитесь к композитингу только с фоном или восстановите этикетку из утверждённой графики. |
Перед сдачей сравните этикетку каждого экспортированного файла в полном увеличении с исходной фотографией.
Для большинства задач генерируйте только фон и компонуйте исходный пакет. Переходите к редактированию по маске, когда композиция выглядит приклеенной.








