Spaces:
Sleeping
Sleeping
from typing import List | |
from PIL import ImageFilter | |
from pil_utils import BuildImage, Text2Image | |
from pil_utils.gradient import ColorStop, LinearGradient | |
from meme_generator import MemeArgsModel, add_meme | |
from meme_generator.exception import TextOrNameNotEnough, TextOverLength | |
def ask(images: List[BuildImage], texts: List[str], args: MemeArgsModel): | |
if not texts and not args.user_infos: | |
raise TextOrNameNotEnough("ask") | |
name = texts[0] if texts else args.user_infos[0].name | |
ta = "他" if args.user_infos and args.user_infos[0].gender == "male" else "她" | |
img = images[0].resize_width(640) | |
img_w, img_h = img.size | |
gradient_h = 150 | |
gradient = LinearGradient( | |
(0, 0, 0, gradient_h), | |
[ColorStop(0, (0, 0, 0, 220)), ColorStop(1, (0, 0, 0, 30))], | |
) | |
gradient_img = gradient.create_image((img_w, gradient_h)) | |
mask = BuildImage.new("RGBA", img.size) | |
mask.paste(gradient_img, (0, img_h - gradient_h), alpha=True) | |
mask = mask.filter(ImageFilter.GaussianBlur(radius=3)) | |
img.paste(mask, alpha=True) | |
start_w = 20 | |
start_h = img_h - gradient_h + 5 | |
text1 = name | |
text2 = f"{name}不知道哦。" | |
text2img1 = Text2Image.from_text(text1, 28, weight="bold") | |
text2img2 = Text2Image.from_text(text2, 28, weight="bold") | |
img.draw_text( | |
(start_w + 40 + (text2img2.width - text2img1.width) // 2, start_h), | |
text1, | |
fontsize=28, | |
fill="orange", | |
weight="bold", | |
) | |
img.draw_text( | |
(start_w + 40, start_h + text2img1.height + 10), | |
text2, | |
fontsize=28, | |
fill="white", | |
weight="bold", | |
) | |
line_h = start_h + text2img1.height + 5 | |
img.draw_line( | |
(start_w, line_h, start_w + text2img2.width + 80, line_h), | |
fill="orange", | |
width=2, | |
) | |
sep_w = 30 | |
sep_h = 80 | |
frame = BuildImage.new("RGBA", (img_w + sep_w * 2, img_h + sep_h * 2), "white") | |
try: | |
frame.draw_text( | |
(sep_w, 0, img_w + sep_w, sep_h), | |
f"让{name}告诉你吧", | |
max_fontsize=35, | |
halign="left", | |
) | |
frame.draw_text( | |
(sep_w, img_h + sep_h, img_w + sep_w, img_h + sep_h * 2), | |
f"啊这,{ta}说不知道", | |
max_fontsize=35, | |
halign="left", | |
) | |
except ValueError: | |
raise TextOverLength(name) | |
frame.paste(img, (sep_w, sep_h), alpha=True) | |
return frame.save_png() | |
add_meme( | |
"ask", ask, min_images=1, max_images=1, min_texts=0, max_texts=1, keywords=["问问"] | |
) | |