Files
web-page-backend/music-lab/app/pipeline/gradient.py
2026-05-07 16:50:28 +09:00

39 lines
1.5 KiB
Python

"""장르별 그라데이션 배경 + 텍스트 오버레이 — cover/video 공용."""
from PIL import Image, ImageDraw, ImageFont
GENRE_COLORS = {
"lo-fi": ((26, 26, 46), (22, 33, 62)),
"phonk": ((26, 10, 10), (45, 0, 0)),
"ambient": ((13, 33, 55), (10, 22, 40)),
"pop": ((26, 10, 46), (45, 27, 78)),
"default": ((17, 24, 39), (31, 41, 55)),
}
def make_gradient_with_title(genre: str, title: str, out_path: str,
size: tuple[int, int] = (1024, 1024),
quality: int = 92) -> None:
w, h = size
top, bot = GENRE_COLORS.get(genre.lower(), GENRE_COLORS["default"])
with Image.new("RGB", (w, h)) as img:
px = img.load()
for y in range(h):
t = y / h
r = int(top[0] + (bot[0] - top[0]) * t)
g = int(top[1] + (bot[1] - top[1]) * t)
b = int(top[2] + (bot[2] - top[2]) * t)
for x in range(w):
px[x, y] = (r, g, b)
if title:
try:
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 64)
except OSError:
font = ImageFont.load_default()
draw = ImageDraw.Draw(img)
bbox = draw.textbbox((0, 0), title, font=font)
tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(((w - tw) // 2, (h - th) // 2), title, fill=(255, 255, 255), font=font)
img.save(out_path, "JPEG", quality=quality)