Bot commit: Добавлен файл images.py
This commit is contained in:
parent
9f2dab4b92
commit
a75fb52688
66
images.py
Normal file
66
images.py
Normal file
@ -0,0 +1,66 @@
|
||||
from io import BytesIO
|
||||
from PIL import Image, ImageDraw, ImageFilter
|
||||
|
||||
|
||||
Image.MAX_IMAGE_PIXELS = 50_000_000
|
||||
|
||||
|
||||
def insert_logo(
|
||||
background,
|
||||
logo,
|
||||
scale_factor=0.095,
|
||||
padding=8,
|
||||
radius=15,
|
||||
quality=95
|
||||
):
|
||||
background = background.copy().convert("RGBA")
|
||||
|
||||
# Логотип
|
||||
logo = logo.copy().convert("RGBA")
|
||||
|
||||
# Масштабирование
|
||||
logo_w, logo_h = logo.size
|
||||
back_w, back_h = background.size
|
||||
new_w = max(1, int(back_w * scale_factor))
|
||||
ratio = logo_w / logo_h if logo_h > 0 else 1
|
||||
new_h = max(1, int(new_w / ratio))
|
||||
logo = logo.resize((new_w, new_h), Image.Resampling.LANCZOS)
|
||||
|
||||
# === Создаём полностью прозрачный фон ===
|
||||
transparent = Image.new("RGBA", (new_w, new_h), (0, 0, 0, 0))
|
||||
|
||||
# Компонуем логотип на полностью прозрачный фон (убирает все артефакты)
|
||||
logo = Image.alpha_composite(transparent, logo)
|
||||
|
||||
# === Маска закругления ===
|
||||
mask = Image.new("L", (new_w, new_h), 0)
|
||||
draw = ImageDraw.Draw(mask)
|
||||
draw.rounded_rectangle([(0, 0), (new_w-1, new_h-1)], radius=radius, fill=255)
|
||||
mask = mask.filter(ImageFilter.SMOOTH)
|
||||
|
||||
# Применяем маску через composite (самый чистый способ)
|
||||
logo = Image.composite(logo, transparent, mask)
|
||||
|
||||
# Позиция (нижний левый угол)
|
||||
pos_x = padding
|
||||
pos_y = back_h - new_h - padding
|
||||
if pos_y < 0:
|
||||
pos_y = 0
|
||||
|
||||
# Вставка
|
||||
background.paste(logo, (pos_x, pos_y), logo)
|
||||
|
||||
# Сохранение
|
||||
out = BytesIO()
|
||||
background.convert("RGB").save(out, format="JPEG", quality=quality, optimize=True)
|
||||
out.seek(0)
|
||||
return out
|
||||
|
||||
|
||||
async def convert_bio_to_webp(bio: BytesIO, quality: int = 95) -> BytesIO:
|
||||
bio.seek(0)
|
||||
im = Image.open(bio).convert("RGB")
|
||||
out = BytesIO()
|
||||
im.save(out, format="WEBP", quality=quality, method=6)
|
||||
out.seek(0)
|
||||
return out
|
||||
Loading…
Reference in New Issue
Block a user