CikeyQi's picture
Upload 964 files (#1)
346533a
raw
history blame
2.57 kB
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=["问问"]
)