feat(music-lab): AI 커버 생성 + 그라데이션 폴백
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
38
music-lab/app/pipeline/gradient.py
Normal file
38
music-lab/app/pipeline/gradient.py
Normal file
@@ -0,0 +1,38 @@
|
||||
"""장르별 그라데이션 배경 + 텍스트 오버레이 — 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)
|
||||
Reference in New Issue
Block a user