Spaces:
Sleeping
Sleeping
File size: 2,570 Bytes
346533a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
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=["问问"]
)
|