39 lines
1.5 KiB
Python
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)
|