AI-генерация рекламных баннеров
AI-генерация баннеров автоматизирует создание рекламных материалов для контекстной рекламы, таргетинга, медийных размещений. Один набор ассетов → сотни форматов и вариаций за минуты вместо часов дизайнера.
Стек для баннерной генерации
from PIL import Image, ImageDraw, ImageFont
import io
class BannerGenerator:
STANDARD_SIZES = {
# Яндекс.Директ
"yandex_240x400": (240, 400),
"yandex_300x250": (300, 250),
"yandex_728x90": (728, 90),
# Google Ads
"google_300x250": (300, 250),
"google_160x600": (160, 600),
"google_970x250": (970, 250),
# ВКонтакте
"vk_1080x607": (1080, 607),
# Telegram Ads
"telegram_800x418": (800, 418),
}
def __init__(self):
self.image_gen = FluxImageGenerator() # или DALL-E / SDXL
async def generate_banner_set(
self,
product_image: bytes,
headline: str,
subtext: str,
cta: str,
brand_color: str,
sizes: list[str] = None
) -> dict[str, bytes]:
target_sizes = sizes or list(self.STANDARD_SIZES.keys())
results = {}
# Генерируем базовое background изображение
bg_prompt = f"abstract background, {brand_color} color scheme, modern minimalist, no text, banner design"
background = await self.image_gen.generate(bg_prompt, width=1920, height=1080)
for size_name in target_sizes:
w, h = self.STANDARD_SIZES[size_name]
banner = self.compose_banner(
background=background,
product_image=product_image,
headline=headline,
subtext=subtext,
cta=cta,
brand_color=brand_color,
size=(w, h)
)
results[size_name] = banner
return results
def compose_banner(
self,
background: bytes,
product_image: bytes,
headline: str,
subtext: str,
cta: str,
brand_color: str,
size: tuple
) -> bytes:
w, h = size
bg = Image.open(io.BytesIO(background)).resize(size, Image.LANCZOS)
canvas = bg.copy()
draw = ImageDraw.Draw(canvas)
# Накладываем полупрозрачный оверлей
overlay = Image.new("RGBA", size, (0, 0, 0, 100))
canvas = Image.alpha_composite(canvas.convert("RGBA"), overlay).convert("RGB")
draw = ImageDraw.Draw(canvas)
# Товар (если горизонтальный баннер — слева, иначе по центру)
if w > h: # горизонтальный
product = Image.open(io.BytesIO(product_image)).convert("RGBA")
product.thumbnail((h - 20, h - 20))
canvas.paste(product, (10, (h - product.height) // 2), product.split()[3])
text_x = h + 10
else:
product = Image.open(io.BytesIO(product_image)).convert("RGBA")
product.thumbnail((w - 20, h // 2))
canvas.paste(product, ((w - product.width) // 2, 10), product.split()[3])
text_x = 10
# Текст
try:
font_headline = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", max(12, h // 8))
font_sub = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", max(10, h // 12))
except:
font_headline = ImageFont.load_default()
font_sub = font_headline
draw.text((text_x, h // 2), headline, fill="white", font=font_headline)
draw.text((text_x, h // 2 + h // 8 + 5), subtext, fill="#DDDDDD", font=font_sub)
# CTA кнопка
cta_y = h - h // 5
draw.rounded_rectangle([text_x, cta_y, text_x + w // 3, cta_y + h // 8], radius=5, fill=brand_color)
draw.text((text_x + 10, cta_y + 5), cta, fill="white", font=font_sub)
buf = io.BytesIO()
canvas.save(buf, format="PNG")
return buf.getvalue()
A/B тестирование вариаций
async def generate_ab_variants(
base_brief: dict,
num_variants: int = 5
) -> list[dict]:
"""Генерируем варианты для A/B тестирования"""
client = AsyncOpenAI()
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"Создай {num_variants} вариантов текста для рекламного баннера. Для каждого: headline (до 30 символов), subtext (до 60 символов), cta (до 20 символов). Верни JSON массив."
}, {
"role": "user",
"content": f"Продукт: {base_brief['product']}\nЦА: {base_brief['audience']}\nОффер: {base_brief['offer']}"
}],
response_format={"type": "json_object"}
)
variants_text = json.loads(response.choices[0].message.content)["variants"]
results = []
for variant in variants_text:
banners = await generator.generate_banner_set(
product_image=base_brief["product_image"],
**variant,
brand_color=base_brief["brand_color"]
)
results.append({"text": variant, "banners": banners})
return results
Интеграция с рекламными кабинетами
class AdPlatformUploader:
async def upload_to_yandex_direct(self, banners: dict, campaign_id: str): ...
async def upload_to_vk_ads(self, banners: dict, account_id: str): ...
async def upload_to_google_ads(self, banners: dict, customer_id: str): ...
Сроки: генератор баннеров с шаблоном → размеры → текст наложение — 1 неделя. Полноценная система с A/B тестами и загрузкой в рекламные кабинеты — 3–4 недели.







