Spaces:
Sleeping
Sleeping
import random | |
from pathlib import Path | |
from typing import List | |
from pil_utils import BuildImage, Text2Image | |
from meme_generator import MemeArgsModel, add_meme | |
from meme_generator.exception import TextOrNameNotEnough, TextOverLength | |
img_dir = Path(__file__).parent / "images" | |
def always_like(images: List[BuildImage], texts: List[str], args: MemeArgsModel): | |
names = [info.name for info in args.user_infos] | |
if len(images) > len(texts) + len(names): | |
raise TextOrNameNotEnough("always_like") | |
texts = texts + names | |
img = images[0].convert("RGBA") | |
name = texts[0] | |
text = "我永远喜欢" + name | |
frame = BuildImage.open(img_dir / "0.png") | |
frame.paste( | |
img.resize((350, 400), keep_ratio=True, inside=True), (25, 35), alpha=True | |
) | |
try: | |
frame.draw_text( | |
(20, 470, frame.width - 20, 570), | |
text, | |
max_fontsize=70, | |
min_fontsize=30, | |
weight="bold", | |
) | |
except ValueError: | |
raise TextOverLength(text) | |
def random_color(): | |
return random.choice( | |
["red", "darkorange", "gold", "darkgreen", "blue", "cyan", "purple"] | |
) | |
if len(images) > 1: | |
text_w = Text2Image.from_text(text, 70).width | |
ratio = min((frame.width - 40) / text_w, 1) | |
text_w *= ratio | |
name_w = Text2Image.from_text(name, 70).width * ratio | |
start_w = text_w - name_w + (frame.width - text_w) // 2 | |
frame.draw_line( | |
(start_w, 525, start_w + name_w, 525), fill=random_color(), width=10 | |
) | |
current_h = 400 | |
for i, (image, name) in enumerate(zip(images[1:], texts[1:]), start=1): | |
img = image.convert("RGBA") | |
frame.paste( | |
img.resize((350, 400), keep_ratio=True, inside=True), | |
(10 + random.randint(0, 50), 20 + random.randint(0, 70)), | |
alpha=True, | |
) | |
try: | |
frame.draw_text( | |
(400, current_h, frame.width - 20, current_h + 80), | |
name, | |
max_fontsize=70, | |
min_fontsize=30, | |
weight="bold", | |
) | |
except ValueError: | |
raise TextOverLength(text) | |
if len(images) > i + 1: | |
name_w = min(Text2Image.from_text(name, 70).width, 380) | |
start_w = 400 + (410 - name_w) // 2 | |
line_h = current_h + 40 | |
frame.draw_line( | |
(start_w, line_h, start_w + name_w, line_h), | |
fill=random_color(), | |
width=10, | |
) | |
current_h -= 70 | |
return frame.save_jpg() | |
add_meme( | |
"always_like", | |
always_like, | |
min_images=1, | |
max_images=6, | |
min_texts=0, | |
max_texts=6, | |
keywords=["我永远喜欢"], | |
) | |