LeafLeafLeaf commited on
Commit
e076f4f
·
verified ·
1 Parent(s): a69282d

Upload 263 files

Browse files
Files changed (50) hide show
  1. meme_generator/memes/behead/__init__.py +42 -34
  2. meme_generator/memes/can_can_need/__init__.py +28 -20
  3. meme_generator/memes/do/__init__.py +46 -38
  4. meme_generator/memes/empathy/__init__.py +28 -20
  5. meme_generator/memes/fleshlight/__init__.py +72 -64
  6. meme_generator/memes/forbid/__init__.py +32 -22
  7. meme_generator/memes/grab/__init__.py +26 -18
  8. meme_generator/memes/jerk_off/__init__.py +41 -0
  9. meme_generator/memes/jerk_off/images/0.png +3 -0
  10. meme_generator/memes/jerk_off/images/1.png +3 -0
  11. meme_generator/memes/jerk_off/images/2.png +3 -0
  12. meme_generator/memes/jerk_off/images/3.png +3 -0
  13. meme_generator/memes/jerk_off/images/4.png +3 -0
  14. meme_generator/memes/jerk_off/images/5.png +3 -0
  15. meme_generator/memes/jerk_off/images/6.png +3 -0
  16. meme_generator/memes/jerk_off/images/7.png +3 -0
  17. meme_generator/memes/lash/__init__.py +42 -0
  18. meme_generator/memes/lash/images/0.png +3 -0
  19. meme_generator/memes/lash/images/1.png +3 -0
  20. meme_generator/memes/lash/images/2.png +3 -0
  21. meme_generator/memes/lash/images/3.png +3 -0
  22. meme_generator/memes/lash/images/4.png +3 -0
  23. meme_generator/memes/lash/images/5.png +3 -0
  24. meme_generator/memes/lash/images/6.png +3 -0
  25. meme_generator/memes/lash/images/7.png +3 -0
  26. meme_generator/memes/lash/images/8.png +3 -0
  27. meme_generator/memes/little_do/__init__.py +32 -0
  28. meme_generator/memes/little_do/images/0.png +3 -0
  29. meme_generator/memes/little_do/images/1.png +3 -0
  30. meme_generator/memes/little_do/images/2.png +3 -0
  31. meme_generator/memes/little_do/images/3.png +3 -0
  32. meme_generator/memes/little_do/images/4.png +3 -0
  33. meme_generator/memes/little_do/images/5.png +3 -0
  34. meme_generator/memes/little_do/images/6.png +3 -0
  35. meme_generator/memes/operator_generator/__init__.py +66 -64
  36. meme_generator/memes/shoot/__init__.py +34 -0
  37. meme_generator/memes/shoot/images/0.png +3 -0
  38. meme_generator/memes/shoot/images/1.png +3 -0
  39. meme_generator/memes/shoot/images/10.png +3 -0
  40. meme_generator/memes/shoot/images/11.png +3 -0
  41. meme_generator/memes/shoot/images/12.png +3 -0
  42. meme_generator/memes/shoot/images/2.png +3 -0
  43. meme_generator/memes/shoot/images/3.png +3 -0
  44. meme_generator/memes/shoot/images/4.png +3 -0
  45. meme_generator/memes/shoot/images/5.png +3 -0
  46. meme_generator/memes/shoot/images/6.png +3 -0
  47. meme_generator/memes/shoot/images/7.png +3 -0
  48. meme_generator/memes/shoot/images/8.png +3 -0
  49. meme_generator/memes/shoot/images/9.png +3 -0
  50. meme_generator/memes/stretch/__init__.py +26 -18
meme_generator/memes/behead/__init__.py CHANGED
@@ -1,34 +1,42 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from meme_generator.utils import save_gif
6
- from PIL.Image import Image as IMG
7
- from pil_utils import BuildImage
8
-
9
- img_dir = Path(__file__).parent / "images"
10
-
11
-
12
- def behead(images: List[BuildImage], texts, args):
13
- img = images[0].convert("RGBA").square().resize((75, 75))
14
- # fmt: off
15
- locs = [
16
- (80, 72, 0), (83, 73, 0), (82, 73, 0),
17
- (78, 73, 0), (72, 74, 0), (72, 75, 0),
18
- (73, 76, 0), (73, 76, 0), (73, 76, 0),
19
- (74, 76, 0), (74, 76, 0), (70, 73, 12),
20
- (61, 62, 25), (49, 40, 45), (46, 30, 65),
21
- (50, 35, 85), (39, 34, 105), (19, 45, 135),
22
- (9, 91, 155), (6, 161, 175), (-4, 248, 180),
23
- ]
24
- # fmt: on
25
- frames: List[IMG] = []
26
- for i in range(21):
27
- frame = BuildImage.open(img_dir / f"{i}.png")
28
- x, y, angle = locs[i]
29
- frame.paste(img.rotate(angle, expand=True), (x, y), below=True)
30
- frames.append(frame.image)
31
- return save_gif(frames, 0.05)
32
-
33
-
34
- add_meme("behead", behead, min_images=1, max_images=1, keywords=["砍头", "斩首"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import save_gif
6
+ from PIL.Image import Image as IMG
7
+ from pil_utils import BuildImage
8
+
9
+ img_dir = Path(__file__).parent / "images"
10
+
11
+
12
+ def behead(images: list[BuildImage], texts, args):
13
+ img = images[0].convert("RGBA").square().resize((75, 75))
14
+ # fmt: off
15
+ locs = [
16
+ (80, 72, 0), (83, 73, 0), (82, 73, 0),
17
+ (78, 73, 0), (72, 74, 0), (72, 75, 0),
18
+ (73, 76, 0), (73, 76, 0), (73, 76, 0),
19
+ (74, 76, 0), (74, 76, 0), (70, 73, 12),
20
+ (61, 62, 25), (49, 40, 45), (46, 30, 65),
21
+ (50, 35, 85), (39, 34, 105), (19, 45, 135),
22
+ (9, 91, 155), (6, 161, 175), (-4, 248, 180),
23
+ ]
24
+ # fmt: on
25
+ frames: list[IMG] = []
26
+ for i in range(21):
27
+ frame = BuildImage.open(img_dir / f"{i}.png")
28
+ x, y, angle = locs[i]
29
+ frame.paste(img.rotate(angle, expand=True), (x, y), below=True)
30
+ frames.append(frame.image)
31
+ return save_gif(frames, 0.05)
32
+
33
+
34
+ add_meme(
35
+ "behead",
36
+ behead,
37
+ min_images=1,
38
+ max_images=1,
39
+ keywords=["砍头", "斩首"],
40
+ date_created=datetime(2023, 7, 1),
41
+ date_modified=datetime(2023, 7, 1),
42
+ )
meme_generator/memes/can_can_need/__init__.py CHANGED
@@ -1,20 +1,28 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from pil_utils import BuildImage
6
-
7
- img_dir = Path(__file__).parent / "images"
8
-
9
-
10
- def can_can_need(images: List[BuildImage], texts, args):
11
- frame = BuildImage.open(img_dir / "0.jpg")
12
- frame.paste(
13
- images[1].convert("RGBA").circle().resize((340, 340)), (120, 21), alpha=True
14
- ).paste(
15
- images[0].convert("RGBA").circle().resize((300, 300)), (611, 718), alpha=True
16
- )
17
- return frame.save_jpg()
18
-
19
-
20
- add_meme("can_can_need", can_can_need, min_images=2, max_images=2, keywords=["看看你的"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from pil_utils import BuildImage
6
+
7
+ img_dir = Path(__file__).parent / "images"
8
+
9
+
10
+ def can_can_need(images: list[BuildImage], texts, args):
11
+ frame = BuildImage.open(img_dir / "0.jpg")
12
+ frame.paste(
13
+ images[1].convert("RGBA").circle().resize((340, 340)), (120, 21), alpha=True
14
+ ).paste(
15
+ images[0].convert("RGBA").circle().resize((300, 300)), (611, 718), alpha=True
16
+ )
17
+ return frame.save_jpg()
18
+
19
+
20
+ add_meme(
21
+ "can_can_need",
22
+ can_can_need,
23
+ min_images=2,
24
+ max_images=2,
25
+ keywords=["看看你的"],
26
+ date_created=datetime(2023, 3, 16),
27
+ date_modified=datetime(2023, 3, 16),
28
+ )
meme_generator/memes/do/__init__.py CHANGED
@@ -1,38 +1,46 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from meme_generator.utils import save_gif
6
- from PIL.Image import Image as IMG
7
- from pil_utils import BuildImage
8
-
9
- img_dir = Path(__file__).parent / "images"
10
-
11
-
12
- def do(images: List[BuildImage], texts, args):
13
- self_locs = [(116, -8), (109, 3), (130, -10)]
14
- user_locs = [(2, 177), (12, 172), (6, 158)]
15
- self_head = (
16
- images[0]
17
- .convert("RGBA")
18
- .resize((122, 122), keep_ratio=True)
19
- .circle()
20
- .rotate(15)
21
- )
22
- user_head = (
23
- images[1]
24
- .convert("RGBA")
25
- .resize((112, 112), keep_ratio=True)
26
- .circle()
27
- .rotate(90)
28
- )
29
- frames: List[IMG] = []
30
- for i in range(3):
31
- frame = BuildImage.open(img_dir / f"{i}.png")
32
- frame.paste(user_head, user_locs[i], alpha=True)
33
- frame.paste(self_head, self_locs[i], alpha=True)
34
- frames.append(frame.image)
35
- return save_gif(frames, 0.05)
36
-
37
-
38
- add_meme("do", do, min_images=2, max_images=2, keywords=["撅", "狠狠地撅"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import save_gif
6
+ from PIL.Image import Image as IMG
7
+ from pil_utils import BuildImage
8
+
9
+ img_dir = Path(__file__).parent / "images"
10
+
11
+
12
+ def do(images: list[BuildImage], texts, args):
13
+ self_locs = [(116, -8), (109, 3), (130, -10)]
14
+ user_locs = [(2, 177), (12, 172), (6, 158)]
15
+ self_head = (
16
+ images[0]
17
+ .convert("RGBA")
18
+ .resize((122, 122), keep_ratio=True)
19
+ .circle()
20
+ .rotate(15)
21
+ )
22
+ user_head = (
23
+ images[1]
24
+ .convert("RGBA")
25
+ .resize((112, 112), keep_ratio=True)
26
+ .circle()
27
+ .rotate(90)
28
+ )
29
+ frames: list[IMG] = []
30
+ for i in range(3):
31
+ frame = BuildImage.open(img_dir / f"{i}.png")
32
+ frame.paste(user_head, user_locs[i], alpha=True)
33
+ frame.paste(self_head, self_locs[i], alpha=True)
34
+ frames.append(frame.image)
35
+ return save_gif(frames, 0.05)
36
+
37
+
38
+ add_meme(
39
+ "do",
40
+ do,
41
+ min_images=2,
42
+ max_images=2,
43
+ keywords=["撅", "狠狠地撅"],
44
+ date_created=datetime(2023, 3, 7),
45
+ date_modified=datetime(2023, 3, 7),
46
+ )
meme_generator/memes/empathy/__init__.py CHANGED
@@ -1,20 +1,28 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from pil_utils import BuildImage
6
-
7
- img_dir = Path(__file__).parent / "images"
8
-
9
-
10
- def empathy(images: List[BuildImage], texts, args):
11
- frame = BuildImage.open(img_dir / "0.png")
12
- frame.paste(
13
- images[0].convert("RGBA").circle().resize((90, 90)).rotate(100),
14
- (210, 425),
15
- below=True,
16
- )
17
- return frame.save_jpg()
18
-
19
-
20
- add_meme("empathy", empathy, min_images=1, max_images=1, keywords=["换位思考"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from pil_utils import BuildImage
6
+
7
+ img_dir = Path(__file__).parent / "images"
8
+
9
+
10
+ def empathy(images: list[BuildImage], texts, args):
11
+ frame = BuildImage.open(img_dir / "0.png")
12
+ frame.paste(
13
+ images[0].convert("RGBA").circle().resize((90, 90)).rotate(100),
14
+ (210, 425),
15
+ below=True,
16
+ )
17
+ return frame.save_jpg()
18
+
19
+
20
+ add_meme(
21
+ "empathy",
22
+ empathy,
23
+ min_images=1,
24
+ max_images=1,
25
+ keywords=["换位思考"],
26
+ date_created=datetime(2023, 4, 27),
27
+ date_modified=datetime(2023, 4, 27),
28
+ )
meme_generator/memes/fleshlight/__init__.py CHANGED
@@ -1,64 +1,72 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif
6
- from pil_utils import BuildImage
7
-
8
- img_dir = Path(__file__).parent / "images"
9
-
10
-
11
- def fleshlight(images: List[BuildImage], texts, args):
12
- params = [
13
- (((0, 6), (205, 0), (213, 157), (8, 171)), (117, 59)),
14
- (((0, 6), (205, 0), (213, 157), (8, 171)), (117, 59)),
15
- (((0, 6), (205, 0), (213, 157), (8, 171)), (117, 59)),
16
- (((0, 7), (204, 0), (213, 157), (8, 172)), (118, 58)),
17
- (((0, 6), (207, 0), (213, 158), (8, 173)), (119, 57)),
18
- (((0, 6), (207, 0), (213, 158), (8, 173)), (119, 57)),
19
- (((0, 6), (207, 0), (213, 158), (8, 173)), (119, 57)),
20
- (((0, 6), (205, 0), (212, 157), (7, 171)), (121, 58)),
21
- (((0, 6), (205, 0), (212, 157), (7, 171)), (121, 58)),
22
- (((0, 6), (206, 0), (212, 158), (8, 172)), (121, 56)),
23
- (((0, 6), (206, 0), (212, 158), (8, 172)), (121, 56)),
24
- (((0, 6), (207, 0), (214, 157), (10, 171)), (121, 55)),
25
- (((0, 7), (201, 0), (218, 154), (13, 169)), (121, 49)),
26
- (((0, 7), (195, 0), (219, 147), (18, 162)), (118, 50)),
27
- (((0, 4), (196, 0), (223, 133), (18, 143)), (114, 54)),
28
- (((0, 0), (192, 1), (219, 121), (17, 124)), (115, 58)),
29
- (((0, 0), (188, 5), (220, 110), (20, 107)), (112, 61)),
30
- (((0, 0), (185, 15), (217, 86), (26, 73)), (108, 72)),
31
- (((0, 0), (182, 19), (234, 67), (34, 44)), (102, 88)),
32
- (((0, 0), (175, 25), (224, 55), (22, 23)), (111, 105)),
33
- (((0, 0), (167, 29), (209, 49), (13, 14)), (121, 110)),
34
- (((0, 0), (144, 27), (195, 46), (8, 8)), (135, 110)),
35
- (((0, 0), (177, 36), (206, 59), (13, 18)), (129, 93)),
36
- (((0, 0), (180, 38), (211, 69), (16, 25)), (126, 83)),
37
- (((0, 0), (181, 28), (220, 70), (26, 39)), (119, 82)),
38
- (((0, 0), (180, 17), (227, 65), (27, 45)), (115, 89)),
39
- (((0, 0), (181, 15), (230, 63), (33, 46)), (110, 95)),
40
- (((0, 0), (184, 24), (228, 73), (27, 47)), (91, 102)),
41
- (((0, 0), (189, 8), (208, 73), (0, 66)), (83, 94)),
42
- (((19, 0), (202, 25), (204, 85), (0, 58)), (63, 82)),
43
- (((12, 0), (196, 18), (205, 70), (0, 50)), (70, 87)),
44
- (((4, 0), (189, 17), (205, 74), (0, 53)), (82, 79)),
45
- (((0, 0), (184, 18), (205, 72), (1, 51)), (91, 74)),
46
- (((0, 0), (183, 17), (206, 69), (4, 52)), (92, 73)),
47
- ]
48
-
49
- def maker(i: int) -> Maker:
50
- def make(img: BuildImage) -> BuildImage:
51
- img = img.convert("RGBA").resize((210, 170), keep_ratio=True)
52
- frame = BuildImage.open(img_dir / f"{i}.png")
53
- points, pos = params[i]
54
- frame.paste(img.perspective(points), pos, below=True)
55
- return frame
56
-
57
- return make
58
-
59
- return make_gif_or_combined_gif(
60
- images[0], maker, 34, 0.1, FrameAlignPolicy.extend_first
61
- )
62
-
63
-
64
- add_meme("fleshlight", fleshlight, min_images=1, max_images=1, keywords=["飞机杯"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif
6
+ from pil_utils import BuildImage
7
+
8
+ img_dir = Path(__file__).parent / "images"
9
+
10
+
11
+ def fleshlight(images: list[BuildImage], texts, args):
12
+ params = [
13
+ (((0, 6), (205, 0), (213, 157), (8, 171)), (117, 59)),
14
+ (((0, 6), (205, 0), (213, 157), (8, 171)), (117, 59)),
15
+ (((0, 6), (205, 0), (213, 157), (8, 171)), (117, 59)),
16
+ (((0, 7), (204, 0), (213, 157), (8, 172)), (118, 58)),
17
+ (((0, 6), (207, 0), (213, 158), (8, 173)), (119, 57)),
18
+ (((0, 6), (207, 0), (213, 158), (8, 173)), (119, 57)),
19
+ (((0, 6), (207, 0), (213, 158), (8, 173)), (119, 57)),
20
+ (((0, 6), (205, 0), (212, 157), (7, 171)), (121, 58)),
21
+ (((0, 6), (205, 0), (212, 157), (7, 171)), (121, 58)),
22
+ (((0, 6), (206, 0), (212, 158), (8, 172)), (121, 56)),
23
+ (((0, 6), (206, 0), (212, 158), (8, 172)), (121, 56)),
24
+ (((0, 6), (207, 0), (214, 157), (10, 171)), (121, 55)),
25
+ (((0, 7), (201, 0), (218, 154), (13, 169)), (121, 49)),
26
+ (((0, 7), (195, 0), (219, 147), (18, 162)), (118, 50)),
27
+ (((0, 4), (196, 0), (223, 133), (18, 143)), (114, 54)),
28
+ (((0, 0), (192, 1), (219, 121), (17, 124)), (115, 58)),
29
+ (((0, 0), (188, 5), (220, 110), (20, 107)), (112, 61)),
30
+ (((0, 0), (185, 15), (217, 86), (26, 73)), (108, 72)),
31
+ (((0, 0), (182, 19), (234, 67), (34, 44)), (102, 88)),
32
+ (((0, 0), (175, 25), (224, 55), (22, 23)), (111, 105)),
33
+ (((0, 0), (167, 29), (209, 49), (13, 14)), (121, 110)),
34
+ (((0, 0), (144, 27), (195, 46), (8, 8)), (135, 110)),
35
+ (((0, 0), (177, 36), (206, 59), (13, 18)), (129, 93)),
36
+ (((0, 0), (180, 38), (211, 69), (16, 25)), (126, 83)),
37
+ (((0, 0), (181, 28), (220, 70), (26, 39)), (119, 82)),
38
+ (((0, 0), (180, 17), (227, 65), (27, 45)), (115, 89)),
39
+ (((0, 0), (181, 15), (230, 63), (33, 46)), (110, 95)),
40
+ (((0, 0), (184, 24), (228, 73), (27, 47)), (91, 102)),
41
+ (((0, 0), (189, 8), (208, 73), (0, 66)), (83, 94)),
42
+ (((19, 0), (202, 25), (204, 85), (0, 58)), (63, 82)),
43
+ (((12, 0), (196, 18), (205, 70), (0, 50)), (70, 87)),
44
+ (((4, 0), (189, 17), (205, 74), (0, 53)), (82, 79)),
45
+ (((0, 0), (184, 18), (205, 72), (1, 51)), (91, 74)),
46
+ (((0, 0), (183, 17), (206, 69), (4, 52)), (92, 73)),
47
+ ]
48
+
49
+ def maker(i: int) -> Maker:
50
+ def make(imgs: list[BuildImage]) -> BuildImage:
51
+ img = imgs[0].convert("RGBA").resize((210, 170), keep_ratio=True)
52
+ frame = BuildImage.open(img_dir / f"{i}.png")
53
+ points, pos = params[i]
54
+ frame.paste(img.perspective(points), pos, below=True)
55
+ return frame
56
+
57
+ return make
58
+
59
+ return make_gif_or_combined_gif(
60
+ images, maker, 34, 0.1, FrameAlignPolicy.extend_first
61
+ )
62
+
63
+
64
+ add_meme(
65
+ "fleshlight",
66
+ fleshlight,
67
+ min_images=1,
68
+ max_images=1,
69
+ keywords=["飞机杯"],
70
+ date_created=datetime(2023, 4, 29),
71
+ date_modified=datetime(2023, 4, 29),
72
+ )
meme_generator/memes/forbid/__init__.py CHANGED
@@ -1,22 +1,32 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from meme_generator.utils import make_jpg_or_gif
6
- from pil_utils import BuildImage
7
-
8
- img_dir = Path(__file__).parent / "images"
9
-
10
-
11
- def forbid(images: List[BuildImage], texts, args):
12
- frame = BuildImage.open(img_dir / "0.png")
13
-
14
- def make(img: BuildImage) -> BuildImage:
15
- return frame.copy().paste(
16
- img.resize((304, 324), keep_ratio=True), (0, 0), below=True
17
- )
18
-
19
- return make_jpg_or_gif(images[0], make)
20
-
21
-
22
- add_meme("forbid", forbid, min_images=1, max_images=1, keywords=["禁止", "禁"])
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import make_jpg_or_gif
6
+ from pil_utils import BuildImage
7
+
8
+ img_dir = Path(__file__).parent / "images"
9
+
10
+
11
+ def forbid(images: list[BuildImage], texts, args):
12
+ frame = BuildImage.open(img_dir / "0.png")
13
+
14
+ def make(imgs: list[BuildImage]) -> BuildImage:
15
+ return frame.copy().paste(
16
+ imgs[0].convert("RGBA").resize((304, 324), keep_ratio=True),
17
+ (0, 0),
18
+ below=True,
19
+ )
20
+
21
+ return make_jpg_or_gif(images, make)
22
+
23
+
24
+ add_meme(
25
+ "forbid",
26
+ forbid,
27
+ min_images=1,
28
+ max_images=1,
29
+ keywords=["禁止", "禁"],
30
+ date_created=datetime(2023, 3, 12),
31
+ date_modified=datetime(2023, 3, 12),
32
+ )
meme_generator/memes/grab/__init__.py CHANGED
@@ -1,18 +1,26 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from pil_utils import BuildImage
6
-
7
- img_dir = Path(__file__).parent / "images"
8
-
9
-
10
- def grab(images: List[BuildImage], texts, args):
11
- frame = BuildImage.open(img_dir / "0.png")
12
- frame.paste(
13
- images[0].convert("RGBA").resize((500, 500), keep_ratio=True), below=True
14
- )
15
- return frame.save_jpg()
16
-
17
-
18
- add_meme("grab", grab, min_images=1, max_images=1, keywords=["抓"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from pil_utils import BuildImage
6
+
7
+ img_dir = Path(__file__).parent / "images"
8
+
9
+
10
+ def grab(images: list[BuildImage], texts, args):
11
+ frame = BuildImage.open(img_dir / "0.png")
12
+ frame.paste(
13
+ images[0].convert("RGBA").resize((500, 500), keep_ratio=True), below=True
14
+ )
15
+ return frame.save_jpg()
16
+
17
+
18
+ add_meme(
19
+ "grab",
20
+ grab,
21
+ min_images=1,
22
+ max_images=1,
23
+ keywords=["抓"],
24
+ date_created=datetime(2023, 3, 28),
25
+ date_modified=datetime(2023, 3, 28),
26
+ )
meme_generator/memes/jerk_off/__init__.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif
6
+ from pil_utils import BuildImage
7
+
8
+ img_dir = Path(__file__).parent / "images"
9
+
10
+
11
+ def jerk_off(images: list[BuildImage], texts, args):
12
+ jerk_w, jerk_h = BuildImage.open(img_dir / "0.png").size
13
+ img_w, img_h = images[0].size
14
+ if img_w / img_h > jerk_w / jerk_h:
15
+ frame_h = jerk_h
16
+ frame_w = round(frame_h * img_w / img_h)
17
+ else:
18
+ frame_w = jerk_w
19
+ frame_h = round(frame_w * img_h / img_w)
20
+
21
+ def maker(i: int) -> Maker:
22
+ def make(imgs: list[BuildImage]) -> BuildImage:
23
+ frame = imgs[0].convert("RGBA").resize((frame_w, frame_h), keep_ratio=True)
24
+ jerk = BuildImage.open(img_dir / f"{i}.png")
25
+ frame.paste(jerk, ((frame_w - jerk_w) // 2, frame_h - jerk_h), alpha=True)
26
+ return frame
27
+
28
+ return make
29
+
30
+ return make_gif_or_combined_gif(images, maker, 8, 0.1, FrameAlignPolicy.extend_loop)
31
+
32
+
33
+ add_meme(
34
+ "jerk_off",
35
+ jerk_off,
36
+ min_images=1,
37
+ max_images=1,
38
+ keywords=["打胶"],
39
+ date_created=datetime(2024, 8, 4),
40
+ date_modified=datetime(2024, 8, 4),
41
+ )
meme_generator/memes/jerk_off/images/0.png ADDED

Git LFS Details

  • SHA256: 1b6151a06a97d5f60f7dc91654a2caab300fc19a44040823836c837a1ae45a91
  • Pointer size: 130 Bytes
  • Size of remote file: 68.2 kB
meme_generator/memes/jerk_off/images/1.png ADDED

Git LFS Details

  • SHA256: 073195d36b376bef30f2ba7add6c2c9f2dba6337b8bd57dab4d214b2153f6725
  • Pointer size: 130 Bytes
  • Size of remote file: 45.2 kB
meme_generator/memes/jerk_off/images/2.png ADDED

Git LFS Details

  • SHA256: 4b7cfe3921e2967c82242fc8fa12cad2346bc6a867731096038b3fde46835484
  • Pointer size: 130 Bytes
  • Size of remote file: 45.2 kB
meme_generator/memes/jerk_off/images/3.png ADDED

Git LFS Details

  • SHA256: 45438385592ff72b35e5e79fd0a859bf14bfd00bdc445b42ce7178e796e29414
  • Pointer size: 130 Bytes
  • Size of remote file: 48.8 kB
meme_generator/memes/jerk_off/images/4.png ADDED

Git LFS Details

  • SHA256: a48414e7b0fd9557d7a694355011dcec7134a759e1858d690a5cb68cd6e82ae1
  • Pointer size: 130 Bytes
  • Size of remote file: 46.3 kB
meme_generator/memes/jerk_off/images/5.png ADDED

Git LFS Details

  • SHA256: 57004af2e560173e7a99ddf9320fac8f1069720044d4f2f4b331b5b839e087a7
  • Pointer size: 130 Bytes
  • Size of remote file: 61.8 kB
meme_generator/memes/jerk_off/images/6.png ADDED

Git LFS Details

  • SHA256: fd83d4f7bc72e6ab6ba6748cee9e927df702bf7e8cb59524be19fc4f2df0e916
  • Pointer size: 130 Bytes
  • Size of remote file: 68.5 kB
meme_generator/memes/jerk_off/images/7.png ADDED

Git LFS Details

  • SHA256: 7650f259721a07258d37d00571623bf12648200b8889f72f8b6f01adf744a405
  • Pointer size: 130 Bytes
  • Size of remote file: 65.6 kB
meme_generator/memes/lash/__init__.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import save_gif
6
+ from PIL.Image import Image as IMG
7
+ from pil_utils import BuildImage
8
+
9
+ img_dir = Path(__file__).parent / "images"
10
+
11
+
12
+ def lash(images: list[BuildImage], texts, args):
13
+ self_head = images[0].convert("RGBA").circle().resize((22, 22))
14
+ user_head = images[1].convert("RGBA").circle().resize((22, 22))
15
+ # fmt: off
16
+ self_locs = [
17
+ (84,25), (87,23), (87,27), (86,28), (62,26),
18
+ (59,28), (76,20), (85,24), (80,23),
19
+ ]
20
+ user_locs = [
21
+ (12,69), (15,66), (14,67), (15,66), (17,67),
22
+ (14,63), (21,56), (15,62), (17,69)
23
+ ]
24
+ # fmt: on
25
+ frames: list[IMG] = []
26
+ for i in range(9):
27
+ frame = BuildImage.open(img_dir / f"{i}.png")
28
+ frame.paste(self_head, self_locs[i], alpha=True)
29
+ frame.paste(user_head, user_locs[i], alpha=True)
30
+ frames.append(frame.image)
31
+ return save_gif(frames, 0.05)
32
+
33
+
34
+ add_meme(
35
+ "lash",
36
+ lash,
37
+ min_images=2,
38
+ max_images=2,
39
+ keywords=["鞭笞", "鞭打", "鞭挞", "鞭策"],
40
+ date_created=datetime(2024, 7, 23),
41
+ date_modified=datetime(2024, 7, 23),
42
+ )
meme_generator/memes/lash/images/0.png ADDED

Git LFS Details

  • SHA256: c301ea475d3aea6e6f67c62ff1c16a46c310d1f6584ac49950422cac291f5c3a
  • Pointer size: 129 Bytes
  • Size of remote file: 4.86 kB
meme_generator/memes/lash/images/1.png ADDED

Git LFS Details

  • SHA256: ba501a1a9fe4943ee03914c3dd4f02aa315b38f77f6890eb2ff560d83795a694
  • Pointer size: 129 Bytes
  • Size of remote file: 5.03 kB
meme_generator/memes/lash/images/2.png ADDED

Git LFS Details

  • SHA256: b6a351e5967901cf25e41980ecf78cb878177e4b1b15973e571f76e2007a2f7a
  • Pointer size: 129 Bytes
  • Size of remote file: 4.44 kB
meme_generator/memes/lash/images/3.png ADDED

Git LFS Details

  • SHA256: 05d262322c50404ba2765392759a4bde5c1f8a755ae81c44f5020e093ce22ebb
  • Pointer size: 129 Bytes
  • Size of remote file: 4.26 kB
meme_generator/memes/lash/images/4.png ADDED

Git LFS Details

  • SHA256: 070e9a5aabe7bdb15e066cb1b9b6810df5dacf5b3ab9a9292faf3e8d104cef93
  • Pointer size: 129 Bytes
  • Size of remote file: 4.52 kB
meme_generator/memes/lash/images/5.png ADDED

Git LFS Details

  • SHA256: 5e4675ed85591a997a77bc2f799cad3db4ded8770ef24839a4cc1b6b8a3d883b
  • Pointer size: 129 Bytes
  • Size of remote file: 5.29 kB
meme_generator/memes/lash/images/6.png ADDED

Git LFS Details

  • SHA256: 70bf8deb7a233b986900bf84e80c5542993ca051b6f5b29b866c7d17e63d29d5
  • Pointer size: 129 Bytes
  • Size of remote file: 5.28 kB
meme_generator/memes/lash/images/7.png ADDED

Git LFS Details

  • SHA256: 6fb33db6009e4fbe487a0417fa34e7f04068e7511de7c9fd19712b8fadd08607
  • Pointer size: 129 Bytes
  • Size of remote file: 5.22 kB
meme_generator/memes/lash/images/8.png ADDED

Git LFS Details

  • SHA256: 966f411161602738d2b3bd0ed7563cdeaea9cce7dad903dbc4b5dfab95863aff
  • Pointer size: 129 Bytes
  • Size of remote file: 4.71 kB
meme_generator/memes/little_do/__init__.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import save_gif
6
+ from PIL.Image import Image as IMG
7
+ from pil_utils import BuildImage
8
+
9
+ img_dir = Path(__file__).parent / "images"
10
+
11
+
12
+ def little_do(images: list[BuildImage], texts, args):
13
+ self_head = images[0].convert("RGBA").circle().resize((21, 21))
14
+ user_head = images[1].convert("RGBA").circle().resize((21, 21)).rotate(90)
15
+ frames: list[IMG] = []
16
+ for i in range(7):
17
+ frame = BuildImage.open(img_dir / f"{i}.png")
18
+ frame.paste(self_head, (40, 4), alpha=True)
19
+ frame.paste(user_head, (6, 46), alpha=True)
20
+ frames.append(frame.image)
21
+ return save_gif(frames, 0.05)
22
+
23
+
24
+ add_meme(
25
+ "little_do",
26
+ little_do,
27
+ min_images=2,
28
+ max_images=2,
29
+ keywords=["小撅", "轻撅", "滑稽撅"],
30
+ date_created=datetime(2024, 7, 12),
31
+ date_modified=datetime(2024, 7, 12),
32
+ )
meme_generator/memes/little_do/images/0.png ADDED

Git LFS Details

  • SHA256: 07508ed2c7a99413e24a25b942e78762b89450316079f8a1245f71335b21e892
  • Pointer size: 129 Bytes
  • Size of remote file: 4.58 kB
meme_generator/memes/little_do/images/1.png ADDED

Git LFS Details

  • SHA256: 752dbe639c0fc9f103494e0f082662cd364d4878d63c1d0c67b7cd65eab9ced1
  • Pointer size: 129 Bytes
  • Size of remote file: 4.54 kB
meme_generator/memes/little_do/images/2.png ADDED

Git LFS Details

  • SHA256: 7d1462533b76984949efbddff18602d3a92a4a2f42aa5a9b628387fe557dd9e9
  • Pointer size: 129 Bytes
  • Size of remote file: 4.44 kB
meme_generator/memes/little_do/images/3.png ADDED

Git LFS Details

  • SHA256: 29379f60cb13c2afe8f6c19d508185782de8cc8dc87712c1a09547aac2c7d4fb
  • Pointer size: 129 Bytes
  • Size of remote file: 4.52 kB
meme_generator/memes/little_do/images/4.png ADDED

Git LFS Details

  • SHA256: 2107d77681fdf44911a562e2c5aca05d0bbb2c77e86a5bac1007608eceea2e92
  • Pointer size: 129 Bytes
  • Size of remote file: 4.45 kB
meme_generator/memes/little_do/images/5.png ADDED

Git LFS Details

  • SHA256: a679970e6fef3614b4ee69a90337116efad2f78d1db8060edb36c4459c3c0940
  • Pointer size: 129 Bytes
  • Size of remote file: 4.44 kB
meme_generator/memes/little_do/images/6.png ADDED

Git LFS Details

  • SHA256: 996e3f9a357cc5a8ed6193dc8b37d4ea9687303cf1475407c258b3ecf43b1c8f
  • Pointer size: 129 Bytes
  • Size of remote file: 4.62 kB
meme_generator/memes/operator_generator/__init__.py CHANGED
@@ -1,64 +1,66 @@
1
- import random
2
- from pathlib import Path
3
- from typing import List
4
-
5
- from meme_generator import add_meme
6
- from pil_utils import BuildImage
7
-
8
- img_dir = Path(__file__).parent / "images"
9
-
10
-
11
- def operator_generator(images: List[BuildImage], texts: List[str], args):
12
- img = images[0].convert("RGBA").circle().resize((80, 80))
13
- name = texts[0] if texts else "你好"
14
-
15
- frame = BuildImage.new("RGBA", (640, 640), (160, 160, 160))
16
- frame.paste(img, (20, 10), alpha=True)
17
- frame.draw_text(
18
- (120, 0, 620, 100),
19
- f"{name},你的干员信息如下:",
20
- fontsize=80,
21
- fill="white",
22
- stroke_fill="black",
23
- stroke_ratio=0.1,
24
- weight="bold",
25
- allow_wrap=True,
26
- lines_align="center",
27
- )
28
-
29
- rrange = BuildImage.open(
30
- img_dir / f"1范围/范围101-25-{random.randint(0, 24):04d}.jpg"
31
- ).resize_width(320)
32
- frame.paste(rrange, (0, 100))
33
- rcharacteristic = BuildImage.open(
34
- img_dir / f"2特性/特性202-25-{random.randint(0, 24):04d}.jpg"
35
- ).resize_width(320)
36
- frame.paste(rcharacteristic, (320, 100))
37
- rvalue = BuildImage.open(
38
- img_dir / f"3基础数值/基础数值3031-{random.randint(0, 24):04d}.jpg"
39
- ).resize_width(320)
40
- frame.paste(rvalue, (0, 280))
41
- rtalent = BuildImage.open(
42
- img_dir / f"4天赋/天赋404-25-{random.randint(0, 24):04d}.jpg"
43
- ).resize_width(320)
44
- frame.paste(rtalent, (320, 280))
45
- rskill = BuildImage.open(
46
- img_dir / f"5技能/技能505-25-{random.randint(0, 24):04d}.jpg"
47
- ).resize_width(320)
48
- frame.paste(rskill, (0, 460))
49
- rspecail = BuildImage.open(
50
- img_dir / f"6亮点毒点/亮点毒点606-{random.randint(0, 24):04d}.jpg"
51
- ).resize_width(320)
52
- frame.paste(rspecail, (320, 460))
53
-
54
- return frame.save_jpg()
55
-
56
-
57
- add_meme(
58
- "operator_generator",
59
- operator_generator,
60
- min_images=1,
61
- max_images=1,
62
- max_texts=1,
63
- keywords=["合成大干员"],
64
- )
 
 
 
1
+ import random
2
+ from datetime import datetime
3
+ from pathlib import Path
4
+
5
+ from meme_generator import add_meme
6
+ from pil_utils import BuildImage
7
+
8
+ img_dir = Path(__file__).parent / "images"
9
+
10
+
11
+ def operator_generator(images: list[BuildImage], texts: list[str], args):
12
+ img = images[0].convert("RGBA").circle().resize((80, 80))
13
+ name = texts[0] if texts else "你好"
14
+
15
+ frame = BuildImage.new("RGBA", (640, 640), (160, 160, 160))
16
+ frame.paste(img, (20, 10), alpha=True)
17
+ frame.draw_text(
18
+ (120, 0, 620, 100),
19
+ f"{name},你的干员信息如下:",
20
+ fontsize=80,
21
+ fill="white",
22
+ stroke_fill="black",
23
+ stroke_ratio=0.1,
24
+ weight="bold",
25
+ allow_wrap=True,
26
+ lines_align="center",
27
+ )
28
+
29
+ rrange = BuildImage.open(
30
+ img_dir / f"1范围/范围101-25-{random.randint(0, 24):04d}.jpg"
31
+ ).resize_width(320)
32
+ frame.paste(rrange, (0, 100))
33
+ rcharacteristic = BuildImage.open(
34
+ img_dir / f"2特性/特性202-25-{random.randint(0, 24):04d}.jpg"
35
+ ).resize_width(320)
36
+ frame.paste(rcharacteristic, (320, 100))
37
+ rvalue = BuildImage.open(
38
+ img_dir / f"3基础数值/基础数值3031-{random.randint(0, 24):04d}.jpg"
39
+ ).resize_width(320)
40
+ frame.paste(rvalue, (0, 280))
41
+ rtalent = BuildImage.open(
42
+ img_dir / f"4天赋/天赋404-25-{random.randint(0, 24):04d}.jpg"
43
+ ).resize_width(320)
44
+ frame.paste(rtalent, (320, 280))
45
+ rskill = BuildImage.open(
46
+ img_dir / f"5技能/技能505-25-{random.randint(0, 24):04d}.jpg"
47
+ ).resize_width(320)
48
+ frame.paste(rskill, (0, 460))
49
+ rspecail = BuildImage.open(
50
+ img_dir / f"6亮点毒点/亮点毒点606-{random.randint(0, 24):04d}.jpg"
51
+ ).resize_width(320)
52
+ frame.paste(rspecail, (320, 460))
53
+
54
+ return frame.save_jpg()
55
+
56
+
57
+ add_meme(
58
+ "operator_generator",
59
+ operator_generator,
60
+ min_images=1,
61
+ max_images=1,
62
+ max_texts=1,
63
+ keywords=["合成大干员"],
64
+ date_created=datetime(2023, 3, 28),
65
+ date_modified=datetime(2023, 3, 28),
66
+ )
meme_generator/memes/shoot/__init__.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from meme_generator.utils import FrameAlignPolicy, Maker, make_gif_or_combined_gif
6
+ from pil_utils import BuildImage
7
+
8
+ img_dir = Path(__file__).parent / "images"
9
+
10
+
11
+ def shoot(images: list[BuildImage], texts, args):
12
+ def maker(i: int) -> Maker:
13
+ def make(imgs: list[BuildImage]) -> BuildImage:
14
+ img = imgs[0].convert("RGBA").resize((160, 97), keep_ratio=True)
15
+ fluid = BuildImage.open(img_dir / f"{i}.png")
16
+ img.paste(fluid, alpha=True)
17
+ return img
18
+
19
+ return make
20
+
21
+ return make_gif_or_combined_gif(
22
+ images, maker, 13, 0.15, FrameAlignPolicy.extend_loop
23
+ )
24
+
25
+
26
+ add_meme(
27
+ "shoot",
28
+ shoot,
29
+ min_images=1,
30
+ max_images=1,
31
+ keywords=["射", "🐍"],
32
+ date_created=datetime(2024, 8, 19),
33
+ date_modified=datetime(2024, 8, 19),
34
+ )
meme_generator/memes/shoot/images/0.png ADDED

Git LFS Details

  • SHA256: be7cdead05e67b28e5c59a38a405770f096194cb789740d974e2b34eb79012f5
  • Pointer size: 129 Bytes
  • Size of remote file: 1.45 kB
meme_generator/memes/shoot/images/1.png ADDED

Git LFS Details

  • SHA256: bdd4aca9ec9d853331d2d07d7185146c023ea1e8c922cca0c5dc9e9a467b836b
  • Pointer size: 129 Bytes
  • Size of remote file: 2.52 kB
meme_generator/memes/shoot/images/10.png ADDED

Git LFS Details

  • SHA256: 8b8354a1c3ca16d44f872b4ed46280db24d2d21854ec8828b3e1e962a6d875ba
  • Pointer size: 129 Bytes
  • Size of remote file: 2.82 kB
meme_generator/memes/shoot/images/11.png ADDED

Git LFS Details

  • SHA256: 69f3ec9a5c9c3d932590131548ee57b4e1a59e83afaa64259f21d765ceb0954d
  • Pointer size: 129 Bytes
  • Size of remote file: 2.84 kB
meme_generator/memes/shoot/images/12.png ADDED

Git LFS Details

  • SHA256: c1f16fdbb75778a431349ea5892e23388c80558f5fd13a4d73e101c4007712fe
  • Pointer size: 129 Bytes
  • Size of remote file: 2.86 kB
meme_generator/memes/shoot/images/2.png ADDED

Git LFS Details

  • SHA256: 96e4247a9ecb986c6157827f1148e2b843322f51e5482dbc813f2b5fdda8109f
  • Pointer size: 129 Bytes
  • Size of remote file: 2.48 kB
meme_generator/memes/shoot/images/3.png ADDED

Git LFS Details

  • SHA256: cf6eb6c9e006aaa61a164b2a38fa7b34aed08da69638f81215c55382206b8381
  • Pointer size: 129 Bytes
  • Size of remote file: 2.83 kB
meme_generator/memes/shoot/images/4.png ADDED

Git LFS Details

  • SHA256: 0444e72b7851cb740c4286c73d95337657a6cc2bcf8b325fabe21da9ae87d6d9
  • Pointer size: 129 Bytes
  • Size of remote file: 2.64 kB
meme_generator/memes/shoot/images/5.png ADDED

Git LFS Details

  • SHA256: f2ac55fc4cf2d0c79c38b1a61156daf78e5d8ad5ec973aac45c17943185ffd50
  • Pointer size: 129 Bytes
  • Size of remote file: 2.58 kB
meme_generator/memes/shoot/images/6.png ADDED

Git LFS Details

  • SHA256: e8f6e5bd72e7a6996e6000712f06e338cb465de5212e331b5bfe3384d0c690c3
  • Pointer size: 129 Bytes
  • Size of remote file: 2.68 kB
meme_generator/memes/shoot/images/7.png ADDED

Git LFS Details

  • SHA256: 6e862462910636e1c573f270d5eedcde55370c33c989370d48a8c4174c959e9c
  • Pointer size: 129 Bytes
  • Size of remote file: 2.71 kB
meme_generator/memes/shoot/images/8.png ADDED

Git LFS Details

  • SHA256: f16c49a38b3b85ee5992e2353018fb27910062d9097acfa98be3aae427b099ce
  • Pointer size: 129 Bytes
  • Size of remote file: 2.93 kB
meme_generator/memes/shoot/images/9.png ADDED

Git LFS Details

  • SHA256: 7db4e9f67a314e9e3dfb814d02ec05ff970d157386e6bb15527bd845973fa480
  • Pointer size: 129 Bytes
  • Size of remote file: 2.88 kB
meme_generator/memes/stretch/__init__.py CHANGED
@@ -1,18 +1,26 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from meme_generator import add_meme
5
- from pil_utils import BuildImage
6
-
7
- img_dir = Path(__file__).parent / "images"
8
-
9
-
10
- def stretch(images: List[BuildImage], texts, args):
11
- frame = BuildImage.open(img_dir / "0.png")
12
- frame.paste(
13
- images[0].convert("RGBA").resize((500, 500), keep_ratio=True), below=True
14
- )
15
- return frame.save_jpg()
16
-
17
-
18
- add_meme("stretch", stretch, min_images=1, max_images=1, keywords=["双手", "伸展"])
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+
4
+ from meme_generator import add_meme
5
+ from pil_utils import BuildImage
6
+
7
+ img_dir = Path(__file__).parent / "images"
8
+
9
+
10
+ def stretch(images: list[BuildImage], texts, args):
11
+ frame = BuildImage.open(img_dir / "0.png")
12
+ frame.paste(
13
+ images[0].convert("RGBA").resize((500, 500), keep_ratio=True), below=True
14
+ )
15
+ return frame.save_jpg()
16
+
17
+
18
+ add_meme(
19
+ "stretch",
20
+ stretch,
21
+ min_images=1,
22
+ max_images=1,
23
+ keywords=["双手", "伸展"],
24
+ date_created=datetime(2023, 3, 28),
25
+ date_modified=datetime(2023, 3, 28),
26
+ )